@drift-labs/sdk 2.103.0-beta.11 → 2.103.0-beta.12

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.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 2.103.0-beta.11
1
+ 2.103.0-beta.12
@@ -58,10 +58,10 @@ export declare class DLOB {
58
58
  initFromOrders(dlobOrders: DLOBOrders, slot: number): boolean;
59
59
  handleOrderRecord(record: OrderRecord, slot: number): void;
60
60
  handleOrderActionRecord(record: OrderActionRecord, slot: number): void;
61
- insertOrder(order: Order, userAccount: string, slot: number, onInsert?: OrderBookCallback): void;
61
+ insertOrder(order: Order, userAccount: string, slot: number, isUserProtectedMaker: boolean, onInsert?: OrderBookCallback): void;
62
62
  addOrderList(marketType: MarketTypeStr, marketIndex: number): void;
63
63
  updateOrder(order: Order, userAccount: PublicKey, slot: number, cumulativeBaseAssetAmountFilled: BN, onUpdate?: OrderBookCallback): void;
64
- trigger(order: Order, userAccount: PublicKey, slot: number, onTrigger?: OrderBookCallback): void;
64
+ trigger(order: Order, userAccount: PublicKey, slot: number, isUserProtectedMaker: boolean, onTrigger?: OrderBookCallback): void;
65
65
  delete(order: Order, userAccount: PublicKey, slot: number, onDelete?: OrderBookCallback): void;
66
66
  getListForOrder(order: Order, slot: number): NodeList<any> | undefined;
67
67
  updateRestingLimitOrders(slot: number): void;
@@ -6,6 +6,7 @@ const __1 = require("..");
6
6
  const web3_js_1 = require("@solana/web3.js");
7
7
  const exchangeStatus_1 = require("../math/exchangeStatus");
8
8
  const orderBookLevels_1 = require("./orderBookLevels");
9
+ const userStatus_1 = require("../math/userStatus");
9
10
  const SUPPORTED_ORDER_TYPES = [
10
11
  'market',
11
12
  'limit',
@@ -62,8 +63,9 @@ class DLOB {
62
63
  const userAccount = user.getUserAccount();
63
64
  const userAccountPubkey = user.getUserAccountPublicKey();
64
65
  const userAccountPubkeyString = userAccountPubkey.toString();
66
+ const protectedMaker = (0, userStatus_1.isUserProtectedMaker)(userAccount);
65
67
  for (const order of userAccount.orders) {
66
- this.insertOrder(order, userAccountPubkeyString, slot);
68
+ this.insertOrder(order, userAccountPubkeyString, slot, protectedMaker);
67
69
  }
68
70
  }
69
71
  this.initialized = true;
@@ -74,13 +76,13 @@ class DLOB {
74
76
  return false;
75
77
  }
76
78
  for (const { user, order } of dlobOrders) {
77
- this.insertOrder(order, user.toString(), slot);
79
+ this.insertOrder(order, user.toString(), slot, false);
78
80
  }
79
81
  this.initialized = true;
80
82
  return true;
81
83
  }
82
84
  handleOrderRecord(record, slot) {
83
- this.insertOrder(record.order, record.user.toString(), slot);
85
+ this.insertOrder(record.order, record.user.toString(), slot, false);
84
86
  }
85
87
  handleOrderActionRecord(record, slot) {
86
88
  if ((0, __1.isOneOfVariant)(record.action, ['place', 'expire'])) {
@@ -90,13 +92,13 @@ class DLOB {
90
92
  if (record.taker !== null) {
91
93
  const takerOrder = this.getOrder(record.takerOrderId, record.taker);
92
94
  if (takerOrder) {
93
- this.trigger(takerOrder, record.taker, slot);
95
+ this.trigger(takerOrder, record.taker, slot, false);
94
96
  }
95
97
  }
96
98
  if (record.maker !== null) {
97
99
  const makerOrder = this.getOrder(record.makerOrderId, record.maker);
98
100
  if (makerOrder) {
99
- this.trigger(makerOrder, record.maker, slot);
101
+ this.trigger(makerOrder, record.maker, slot, false);
100
102
  }
101
103
  }
102
104
  }
@@ -129,7 +131,7 @@ class DLOB {
129
131
  }
130
132
  }
131
133
  }
132
- insertOrder(order, userAccount, slot, onInsert) {
134
+ insertOrder(order, userAccount, slot, isUserProtectedMaker, onInsert) {
133
135
  var _a;
134
136
  if ((0, __1.isVariant)(order.status, 'init')) {
135
137
  return;
@@ -146,7 +148,7 @@ class DLOB {
146
148
  .get(marketType)
147
149
  .add((0, NodeList_1.getOrderSignature)(order.orderId, userAccount));
148
150
  }
149
- (_a = this.getListForOrder(order, slot)) === null || _a === void 0 ? void 0 : _a.insert(order, marketType, userAccount);
151
+ (_a = this.getListForOrder(order, slot)) === null || _a === void 0 ? void 0 : _a.insert(order, marketType, userAccount, isUserProtectedMaker);
150
152
  if (onInsert) {
151
153
  onInsert();
152
154
  }
@@ -194,7 +196,7 @@ class DLOB {
194
196
  onUpdate();
195
197
  }
196
198
  }
197
- trigger(order, userAccount, slot, onTrigger) {
199
+ trigger(order, userAccount, slot, isUserProtectedMaker, onTrigger) {
198
200
  var _a;
199
201
  if ((0, __1.isVariant)(order.status, 'init')) {
200
202
  return;
@@ -207,7 +209,7 @@ class DLOB {
207
209
  const triggerList = this.orderLists.get(marketType).get(order.marketIndex)
208
210
  .trigger[(0, __1.isVariant)(order.triggerCondition, 'above') ? 'above' : 'below'];
209
211
  triggerList.remove(order, userAccount.toString());
210
- (_a = this.getListForOrder(order, slot)) === null || _a === void 0 ? void 0 : _a.insert(order, marketType, userAccount.toString());
212
+ (_a = this.getListForOrder(order, slot)) === null || _a === void 0 ? void 0 : _a.insert(order, marketType, userAccount.toString(), isUserProtectedMaker);
211
213
  if (onTrigger) {
212
214
  onTrigger();
213
215
  }
@@ -7,6 +7,7 @@ export interface DLOBNode {
7
7
  isBaseFilled(): boolean;
8
8
  haveFilled: boolean;
9
9
  userAccount: string | undefined;
10
+ isUserProtectedMaker: boolean;
10
11
  }
11
12
  export declare abstract class OrderNode implements DLOBNode {
12
13
  order: Order;
@@ -14,7 +15,8 @@ export declare abstract class OrderNode implements DLOBNode {
14
15
  sortValue: BN;
15
16
  haveFilled: boolean;
16
17
  haveTrigger: boolean;
17
- constructor(order: Order, userAccount: string);
18
+ isUserProtectedMaker: boolean;
19
+ constructor(order: Order, userAccount: string, isUserProtectedMaker: boolean);
18
20
  abstract getSortValue(order: Order): BN;
19
21
  getLabel(): string;
20
22
  getPrice(oraclePriceData: OraclePriceData, slot: number): BN;
@@ -54,4 +56,4 @@ export type DLOBNodeMap = {
54
56
  trigger: TriggerOrderNode;
55
57
  };
56
58
  export type DLOBNodeType = 'restingLimit' | 'takingLimit' | 'floatingLimit' | 'market' | ('trigger' & keyof DLOBNodeMap);
57
- export declare function createNode<T extends DLOBNodeType>(nodeType: T, order: Order, userAccount: string): DLOBNodeMap[T];
59
+ export declare function createNode<T extends DLOBNodeType>(nodeType: T, order: Order, userAccount: string, isUserProtectedMaker: boolean): DLOBNodeMap[T];
@@ -5,13 +5,14 @@ const __1 = require("..");
5
5
  // import { PublicKey } from '@solana/web3.js';
6
6
  const NodeList_1 = require("./NodeList");
7
7
  class OrderNode {
8
- constructor(order, userAccount) {
8
+ constructor(order, userAccount, isUserProtectedMaker) {
9
9
  this.haveFilled = false;
10
10
  this.haveTrigger = false;
11
11
  // Copy the order over to the node
12
12
  this.order = { ...order };
13
13
  this.userAccount = userAccount;
14
14
  this.sortValue = this.getSortValue(order);
15
+ this.isUserProtectedMaker = isUserProtectedMaker;
15
16
  }
16
17
  getLabel() {
17
18
  let msg = `Order ${(0, NodeList_1.getOrderSignature)(this.order.orderId, this.userAccount)}`;
@@ -67,18 +68,18 @@ class TriggerOrderNode extends OrderNode {
67
68
  }
68
69
  }
69
70
  exports.TriggerOrderNode = TriggerOrderNode;
70
- function createNode(nodeType, order, userAccount) {
71
+ function createNode(nodeType, order, userAccount, isUserProtectedMaker) {
71
72
  switch (nodeType) {
72
73
  case 'floatingLimit':
73
- return new FloatingLimitOrderNode(order, userAccount);
74
+ return new FloatingLimitOrderNode(order, userAccount, isUserProtectedMaker);
74
75
  case 'restingLimit':
75
- return new RestingLimitOrderNode(order, userAccount);
76
+ return new RestingLimitOrderNode(order, userAccount, isUserProtectedMaker);
76
77
  case 'takingLimit':
77
- return new TakingLimitOrderNode(order, userAccount);
78
+ return new TakingLimitOrderNode(order, userAccount, isUserProtectedMaker);
78
79
  case 'market':
79
- return new MarketOrderNode(order, userAccount);
80
+ return new MarketOrderNode(order, userAccount, isUserProtectedMaker);
80
81
  case 'trigger':
81
- return new TriggerOrderNode(order, userAccount);
82
+ return new TriggerOrderNode(order, userAccount, isUserProtectedMaker);
82
83
  default:
83
84
  throw Error(`Unknown DLOBNode type ${nodeType}`);
84
85
  }
@@ -14,7 +14,7 @@ export declare class NodeList<NodeType extends keyof DLOBNodeMap> implements DLO
14
14
  nodeMap: Map<string, DLOBNodeMap[NodeType]>;
15
15
  constructor(nodeType: NodeType, sortDirection: SortDirection);
16
16
  clear(): void;
17
- insert(order: Order, marketType: MarketTypeStr, userAccount: string): void;
17
+ insert(order: Order, marketType: MarketTypeStr, userAccount: string, isUserProtectedMaker: boolean): void;
18
18
  prependNode(currentNode: DLOBNodeMap[NodeType], newNode: DLOBNodeMap[NodeType]): boolean;
19
19
  update(order: Order, userAccount: string): void;
20
20
  remove(order: Order, userAccount: string): void;
@@ -20,11 +20,11 @@ class NodeList {
20
20
  this.length = 0;
21
21
  this.nodeMap.clear();
22
22
  }
23
- insert(order, marketType, userAccount) {
23
+ insert(order, marketType, userAccount, isUserProtectedMaker) {
24
24
  if ((0, __1.isVariant)(order.status, 'init')) {
25
25
  return;
26
26
  }
27
- const newNode = (0, DLOBNode_1.createNode)(this.nodeType, order, userAccount);
27
+ const newNode = (0, DLOBNode_1.createNode)(this.nodeType, order, userAccount, isUserProtectedMaker);
28
28
  const orderSignature = getOrderSignature(order.orderId, userAccount);
29
29
  if (this.nodeMap.has(orderSignature)) {
30
30
  return;
@@ -134,6 +134,7 @@ function* getVammNodeGenerator(price) {
134
134
  isVammNode: () => true,
135
135
  order: undefined,
136
136
  userAccount: undefined,
137
+ isUserProtectedMaker: false,
137
138
  isBaseFilled: () => false,
138
139
  haveFilled: false,
139
140
  };
@@ -0,0 +1,2 @@
1
+ import { UserAccount } from '..';
2
+ export declare function isUserProtectedMaker(userAccount: UserAccount): boolean;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isUserProtectedMaker = void 0;
4
+ const __1 = require("..");
5
+ function isUserProtectedMaker(userAccount) {
6
+ return (userAccount.status & __1.UserStatus.PROTECTED_MAKER) > 0;
7
+ }
8
+ exports.isUserProtectedMaker = isUserProtectedMaker;
@@ -11,6 +11,7 @@ const events_1 = require("events");
11
11
  const index_1 = require("../index");
12
12
  const user_1 = require("../decode/user");
13
13
  const grpcSubscription_1 = require("./grpcSubscription");
14
+ const userStatus_1 = require("../math/userStatus");
14
15
  class OrderSubscriber {
15
16
  constructor(config) {
16
17
  var _a, _b, _c, _d, _e;
@@ -152,8 +153,9 @@ class OrderSubscriber {
152
153
  async getDLOB(slot) {
153
154
  const dlob = this.createDLOB();
154
155
  for (const [key, { userAccount }] of this.usersAccounts.entries()) {
156
+ const protectedMaker = (0, userStatus_1.isUserProtectedMaker)(userAccount);
155
157
  for (const order of userAccount.orders) {
156
- dlob.insertOrder(order, key, slot);
158
+ dlob.insertOrder(order, key, slot, protectedMaker);
157
159
  }
158
160
  }
159
161
  return dlob;
@@ -70,7 +70,8 @@ export declare enum UserStatus {
70
70
  BEING_LIQUIDATED = 1,
71
71
  BANKRUPT = 2,
72
72
  REDUCE_ONLY = 4,
73
- ADVANCED_LP = 8
73
+ ADVANCED_LP = 8,
74
+ PROTECTED_MAKER = 16
74
75
  }
75
76
  export declare class MarginMode {
76
77
  static readonly DEFAULT: {
@@ -58,6 +58,7 @@ var UserStatus;
58
58
  UserStatus[UserStatus["BANKRUPT"] = 2] = "BANKRUPT";
59
59
  UserStatus[UserStatus["REDUCE_ONLY"] = 4] = "REDUCE_ONLY";
60
60
  UserStatus[UserStatus["ADVANCED_LP"] = 8] = "ADVANCED_LP";
61
+ UserStatus[UserStatus["PROTECTED_MAKER"] = 16] = "PROTECTED_MAKER";
61
62
  })(UserStatus = exports.UserStatus || (exports.UserStatus = {}));
62
63
  class MarginMode {
63
64
  }
@@ -58,10 +58,10 @@ export declare class DLOB {
58
58
  initFromOrders(dlobOrders: DLOBOrders, slot: number): boolean;
59
59
  handleOrderRecord(record: OrderRecord, slot: number): void;
60
60
  handleOrderActionRecord(record: OrderActionRecord, slot: number): void;
61
- insertOrder(order: Order, userAccount: string, slot: number, onInsert?: OrderBookCallback): void;
61
+ insertOrder(order: Order, userAccount: string, slot: number, isUserProtectedMaker: boolean, onInsert?: OrderBookCallback): void;
62
62
  addOrderList(marketType: MarketTypeStr, marketIndex: number): void;
63
63
  updateOrder(order: Order, userAccount: PublicKey, slot: number, cumulativeBaseAssetAmountFilled: BN, onUpdate?: OrderBookCallback): void;
64
- trigger(order: Order, userAccount: PublicKey, slot: number, onTrigger?: OrderBookCallback): void;
64
+ trigger(order: Order, userAccount: PublicKey, slot: number, isUserProtectedMaker: boolean, onTrigger?: OrderBookCallback): void;
65
65
  delete(order: Order, userAccount: PublicKey, slot: number, onDelete?: OrderBookCallback): void;
66
66
  getListForOrder(order: Order, slot: number): NodeList<any> | undefined;
67
67
  updateRestingLimitOrders(slot: number): void;
@@ -6,6 +6,7 @@ const __1 = require("..");
6
6
  const web3_js_1 = require("@solana/web3.js");
7
7
  const exchangeStatus_1 = require("../math/exchangeStatus");
8
8
  const orderBookLevels_1 = require("./orderBookLevels");
9
+ const userStatus_1 = require("../math/userStatus");
9
10
  const SUPPORTED_ORDER_TYPES = [
10
11
  'market',
11
12
  'limit',
@@ -62,8 +63,9 @@ class DLOB {
62
63
  const userAccount = user.getUserAccount();
63
64
  const userAccountPubkey = user.getUserAccountPublicKey();
64
65
  const userAccountPubkeyString = userAccountPubkey.toString();
66
+ const protectedMaker = (0, userStatus_1.isUserProtectedMaker)(userAccount);
65
67
  for (const order of userAccount.orders) {
66
- this.insertOrder(order, userAccountPubkeyString, slot);
68
+ this.insertOrder(order, userAccountPubkeyString, slot, protectedMaker);
67
69
  }
68
70
  }
69
71
  this.initialized = true;
@@ -74,13 +76,13 @@ class DLOB {
74
76
  return false;
75
77
  }
76
78
  for (const { user, order } of dlobOrders) {
77
- this.insertOrder(order, user.toString(), slot);
79
+ this.insertOrder(order, user.toString(), slot, false);
78
80
  }
79
81
  this.initialized = true;
80
82
  return true;
81
83
  }
82
84
  handleOrderRecord(record, slot) {
83
- this.insertOrder(record.order, record.user.toString(), slot);
85
+ this.insertOrder(record.order, record.user.toString(), slot, false);
84
86
  }
85
87
  handleOrderActionRecord(record, slot) {
86
88
  if ((0, __1.isOneOfVariant)(record.action, ['place', 'expire'])) {
@@ -90,13 +92,13 @@ class DLOB {
90
92
  if (record.taker !== null) {
91
93
  const takerOrder = this.getOrder(record.takerOrderId, record.taker);
92
94
  if (takerOrder) {
93
- this.trigger(takerOrder, record.taker, slot);
95
+ this.trigger(takerOrder, record.taker, slot, false);
94
96
  }
95
97
  }
96
98
  if (record.maker !== null) {
97
99
  const makerOrder = this.getOrder(record.makerOrderId, record.maker);
98
100
  if (makerOrder) {
99
- this.trigger(makerOrder, record.maker, slot);
101
+ this.trigger(makerOrder, record.maker, slot, false);
100
102
  }
101
103
  }
102
104
  }
@@ -129,7 +131,7 @@ class DLOB {
129
131
  }
130
132
  }
131
133
  }
132
- insertOrder(order, userAccount, slot, onInsert) {
134
+ insertOrder(order, userAccount, slot, isUserProtectedMaker, onInsert) {
133
135
  var _a;
134
136
  if ((0, __1.isVariant)(order.status, 'init')) {
135
137
  return;
@@ -146,7 +148,7 @@ class DLOB {
146
148
  .get(marketType)
147
149
  .add((0, NodeList_1.getOrderSignature)(order.orderId, userAccount));
148
150
  }
149
- (_a = this.getListForOrder(order, slot)) === null || _a === void 0 ? void 0 : _a.insert(order, marketType, userAccount);
151
+ (_a = this.getListForOrder(order, slot)) === null || _a === void 0 ? void 0 : _a.insert(order, marketType, userAccount, isUserProtectedMaker);
150
152
  if (onInsert) {
151
153
  onInsert();
152
154
  }
@@ -194,7 +196,7 @@ class DLOB {
194
196
  onUpdate();
195
197
  }
196
198
  }
197
- trigger(order, userAccount, slot, onTrigger) {
199
+ trigger(order, userAccount, slot, isUserProtectedMaker, onTrigger) {
198
200
  var _a;
199
201
  if ((0, __1.isVariant)(order.status, 'init')) {
200
202
  return;
@@ -207,7 +209,7 @@ class DLOB {
207
209
  const triggerList = this.orderLists.get(marketType).get(order.marketIndex)
208
210
  .trigger[(0, __1.isVariant)(order.triggerCondition, 'above') ? 'above' : 'below'];
209
211
  triggerList.remove(order, userAccount.toString());
210
- (_a = this.getListForOrder(order, slot)) === null || _a === void 0 ? void 0 : _a.insert(order, marketType, userAccount.toString());
212
+ (_a = this.getListForOrder(order, slot)) === null || _a === void 0 ? void 0 : _a.insert(order, marketType, userAccount.toString(), isUserProtectedMaker);
211
213
  if (onTrigger) {
212
214
  onTrigger();
213
215
  }
@@ -7,6 +7,7 @@ export interface DLOBNode {
7
7
  isBaseFilled(): boolean;
8
8
  haveFilled: boolean;
9
9
  userAccount: string | undefined;
10
+ isUserProtectedMaker: boolean;
10
11
  }
11
12
  export declare abstract class OrderNode implements DLOBNode {
12
13
  order: Order;
@@ -14,7 +15,8 @@ export declare abstract class OrderNode implements DLOBNode {
14
15
  sortValue: BN;
15
16
  haveFilled: boolean;
16
17
  haveTrigger: boolean;
17
- constructor(order: Order, userAccount: string);
18
+ isUserProtectedMaker: boolean;
19
+ constructor(order: Order, userAccount: string, isUserProtectedMaker: boolean);
18
20
  abstract getSortValue(order: Order): BN;
19
21
  getLabel(): string;
20
22
  getPrice(oraclePriceData: OraclePriceData, slot: number): BN;
@@ -54,4 +56,4 @@ export type DLOBNodeMap = {
54
56
  trigger: TriggerOrderNode;
55
57
  };
56
58
  export type DLOBNodeType = 'restingLimit' | 'takingLimit' | 'floatingLimit' | 'market' | ('trigger' & keyof DLOBNodeMap);
57
- export declare function createNode<T extends DLOBNodeType>(nodeType: T, order: Order, userAccount: string): DLOBNodeMap[T];
59
+ export declare function createNode<T extends DLOBNodeType>(nodeType: T, order: Order, userAccount: string, isUserProtectedMaker: boolean): DLOBNodeMap[T];
@@ -5,13 +5,14 @@ const __1 = require("..");
5
5
  // import { PublicKey } from '@solana/web3.js';
6
6
  const NodeList_1 = require("./NodeList");
7
7
  class OrderNode {
8
- constructor(order, userAccount) {
8
+ constructor(order, userAccount, isUserProtectedMaker) {
9
9
  this.haveFilled = false;
10
10
  this.haveTrigger = false;
11
11
  // Copy the order over to the node
12
12
  this.order = { ...order };
13
13
  this.userAccount = userAccount;
14
14
  this.sortValue = this.getSortValue(order);
15
+ this.isUserProtectedMaker = isUserProtectedMaker;
15
16
  }
16
17
  getLabel() {
17
18
  let msg = `Order ${(0, NodeList_1.getOrderSignature)(this.order.orderId, this.userAccount)}`;
@@ -67,18 +68,18 @@ class TriggerOrderNode extends OrderNode {
67
68
  }
68
69
  }
69
70
  exports.TriggerOrderNode = TriggerOrderNode;
70
- function createNode(nodeType, order, userAccount) {
71
+ function createNode(nodeType, order, userAccount, isUserProtectedMaker) {
71
72
  switch (nodeType) {
72
73
  case 'floatingLimit':
73
- return new FloatingLimitOrderNode(order, userAccount);
74
+ return new FloatingLimitOrderNode(order, userAccount, isUserProtectedMaker);
74
75
  case 'restingLimit':
75
- return new RestingLimitOrderNode(order, userAccount);
76
+ return new RestingLimitOrderNode(order, userAccount, isUserProtectedMaker);
76
77
  case 'takingLimit':
77
- return new TakingLimitOrderNode(order, userAccount);
78
+ return new TakingLimitOrderNode(order, userAccount, isUserProtectedMaker);
78
79
  case 'market':
79
- return new MarketOrderNode(order, userAccount);
80
+ return new MarketOrderNode(order, userAccount, isUserProtectedMaker);
80
81
  case 'trigger':
81
- return new TriggerOrderNode(order, userAccount);
82
+ return new TriggerOrderNode(order, userAccount, isUserProtectedMaker);
82
83
  default:
83
84
  throw Error(`Unknown DLOBNode type ${nodeType}`);
84
85
  }
@@ -14,7 +14,7 @@ export declare class NodeList<NodeType extends keyof DLOBNodeMap> implements DLO
14
14
  nodeMap: Map<string, DLOBNodeMap[NodeType]>;
15
15
  constructor(nodeType: NodeType, sortDirection: SortDirection);
16
16
  clear(): void;
17
- insert(order: Order, marketType: MarketTypeStr, userAccount: string): void;
17
+ insert(order: Order, marketType: MarketTypeStr, userAccount: string, isUserProtectedMaker: boolean): void;
18
18
  prependNode(currentNode: DLOBNodeMap[NodeType], newNode: DLOBNodeMap[NodeType]): boolean;
19
19
  update(order: Order, userAccount: string): void;
20
20
  remove(order: Order, userAccount: string): void;
@@ -20,11 +20,11 @@ class NodeList {
20
20
  this.length = 0;
21
21
  this.nodeMap.clear();
22
22
  }
23
- insert(order, marketType, userAccount) {
23
+ insert(order, marketType, userAccount, isUserProtectedMaker) {
24
24
  if ((0, __1.isVariant)(order.status, 'init')) {
25
25
  return;
26
26
  }
27
- const newNode = (0, DLOBNode_1.createNode)(this.nodeType, order, userAccount);
27
+ const newNode = (0, DLOBNode_1.createNode)(this.nodeType, order, userAccount, isUserProtectedMaker);
28
28
  const orderSignature = getOrderSignature(order.orderId, userAccount);
29
29
  if (this.nodeMap.has(orderSignature)) {
30
30
  return;
@@ -134,6 +134,7 @@ function* getVammNodeGenerator(price) {
134
134
  isVammNode: () => true,
135
135
  order: undefined,
136
136
  userAccount: undefined,
137
+ isUserProtectedMaker: false,
137
138
  isBaseFilled: () => false,
138
139
  haveFilled: false,
139
140
  };
@@ -0,0 +1,2 @@
1
+ import { UserAccount } from '..';
2
+ export declare function isUserProtectedMaker(userAccount: UserAccount): boolean;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isUserProtectedMaker = void 0;
4
+ const __1 = require("..");
5
+ function isUserProtectedMaker(userAccount) {
6
+ return (userAccount.status & __1.UserStatus.PROTECTED_MAKER) > 0;
7
+ }
8
+ exports.isUserProtectedMaker = isUserProtectedMaker;
@@ -11,6 +11,7 @@ const events_1 = require("events");
11
11
  const index_1 = require("../index");
12
12
  const user_1 = require("../decode/user");
13
13
  const grpcSubscription_1 = require("./grpcSubscription");
14
+ const userStatus_1 = require("../math/userStatus");
14
15
  class OrderSubscriber {
15
16
  constructor(config) {
16
17
  var _a, _b, _c, _d, _e;
@@ -152,8 +153,9 @@ class OrderSubscriber {
152
153
  async getDLOB(slot) {
153
154
  const dlob = this.createDLOB();
154
155
  for (const [key, { userAccount }] of this.usersAccounts.entries()) {
156
+ const protectedMaker = (0, userStatus_1.isUserProtectedMaker)(userAccount);
155
157
  for (const order of userAccount.orders) {
156
- dlob.insertOrder(order, key, slot);
158
+ dlob.insertOrder(order, key, slot, protectedMaker);
157
159
  }
158
160
  }
159
161
  return dlob;
@@ -70,7 +70,8 @@ export declare enum UserStatus {
70
70
  BEING_LIQUIDATED = 1,
71
71
  BANKRUPT = 2,
72
72
  REDUCE_ONLY = 4,
73
- ADVANCED_LP = 8
73
+ ADVANCED_LP = 8,
74
+ PROTECTED_MAKER = 16
74
75
  }
75
76
  export declare class MarginMode {
76
77
  static readonly DEFAULT: {
package/lib/node/types.js CHANGED
@@ -58,6 +58,7 @@ var UserStatus;
58
58
  UserStatus[UserStatus["BANKRUPT"] = 2] = "BANKRUPT";
59
59
  UserStatus[UserStatus["REDUCE_ONLY"] = 4] = "REDUCE_ONLY";
60
60
  UserStatus[UserStatus["ADVANCED_LP"] = 8] = "ADVANCED_LP";
61
+ UserStatus[UserStatus["PROTECTED_MAKER"] = 16] = "PROTECTED_MAKER";
61
62
  })(UserStatus = exports.UserStatus || (exports.UserStatus = {}));
62
63
  class MarginMode {
63
64
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "2.103.0-beta.11",
3
+ "version": "2.103.0-beta.12",
4
4
  "main": "lib/node/index.js",
5
5
  "types": "lib/node/index.d.ts",
6
6
  "browser": "./lib/browser/index.js",
package/src/dlob/DLOB.ts CHANGED
@@ -46,6 +46,7 @@ import {
46
46
  L3OrderBook,
47
47
  mergeL2LevelGenerators,
48
48
  } from './orderBookLevels';
49
+ import { isUserProtectedMaker } from '../math/userStatus';
49
50
 
50
51
  export type MarketNodeLists = {
51
52
  restingLimit: {
@@ -158,9 +159,10 @@ export class DLOB {
158
159
  const userAccount = user.getUserAccount();
159
160
  const userAccountPubkey = user.getUserAccountPublicKey();
160
161
  const userAccountPubkeyString = userAccountPubkey.toString();
162
+ const protectedMaker = isUserProtectedMaker(userAccount);
161
163
 
162
164
  for (const order of userAccount.orders) {
163
- this.insertOrder(order, userAccountPubkeyString, slot);
165
+ this.insertOrder(order, userAccountPubkeyString, slot, protectedMaker);
164
166
  }
165
167
  }
166
168
 
@@ -174,7 +176,7 @@ export class DLOB {
174
176
  }
175
177
 
176
178
  for (const { user, order } of dlobOrders) {
177
- this.insertOrder(order, user.toString(), slot);
179
+ this.insertOrder(order, user.toString(), slot, false);
178
180
  }
179
181
 
180
182
  this.initialized = true;
@@ -182,7 +184,7 @@ export class DLOB {
182
184
  }
183
185
 
184
186
  public handleOrderRecord(record: OrderRecord, slot: number): void {
185
- this.insertOrder(record.order, record.user.toString(), slot);
187
+ this.insertOrder(record.order, record.user.toString(), slot, false);
186
188
  }
187
189
 
188
190
  public handleOrderActionRecord(
@@ -197,14 +199,14 @@ export class DLOB {
197
199
  if (record.taker !== null) {
198
200
  const takerOrder = this.getOrder(record.takerOrderId, record.taker);
199
201
  if (takerOrder) {
200
- this.trigger(takerOrder, record.taker, slot);
202
+ this.trigger(takerOrder, record.taker, slot, false);
201
203
  }
202
204
  }
203
205
 
204
206
  if (record.maker !== null) {
205
207
  const makerOrder = this.getOrder(record.makerOrderId, record.maker);
206
208
  if (makerOrder) {
207
- this.trigger(makerOrder, record.maker, slot);
209
+ this.trigger(makerOrder, record.maker, slot, false);
208
210
  }
209
211
  }
210
212
  } else if (isVariant(record.action, 'fill')) {
@@ -252,6 +254,7 @@ export class DLOB {
252
254
  order: Order,
253
255
  userAccount: string,
254
256
  slot: number,
257
+ isUserProtectedMaker: boolean,
255
258
  onInsert?: OrderBookCallback
256
259
  ): void {
257
260
  if (isVariant(order.status, 'init')) {
@@ -273,7 +276,12 @@ export class DLOB {
273
276
  .get(marketType)
274
277
  .add(getOrderSignature(order.orderId, userAccount));
275
278
  }
276
- this.getListForOrder(order, slot)?.insert(order, marketType, userAccount);
279
+ this.getListForOrder(order, slot)?.insert(
280
+ order,
281
+ marketType,
282
+ userAccount,
283
+ isUserProtectedMaker
284
+ );
277
285
 
278
286
  if (onInsert) {
279
287
  onInsert();
@@ -339,6 +347,7 @@ export class DLOB {
339
347
  order: Order,
340
348
  userAccount: PublicKey,
341
349
  slot: number,
350
+ isUserProtectedMaker: boolean,
342
351
  onTrigger?: OrderBookCallback
343
352
  ): void {
344
353
  if (isVariant(order.status, 'init')) {
@@ -360,7 +369,8 @@ export class DLOB {
360
369
  this.getListForOrder(order, slot)?.insert(
361
370
  order,
362
371
  marketType,
363
- userAccount.toString()
372
+ userAccount.toString(),
373
+ isUserProtectedMaker
364
374
  );
365
375
  if (onTrigger) {
366
376
  onTrigger();
@@ -19,6 +19,7 @@ export interface DLOBNode {
19
19
  isBaseFilled(): boolean;
20
20
  haveFilled: boolean;
21
21
  userAccount: string | undefined;
22
+ isUserProtectedMaker: boolean;
22
23
  }
23
24
 
24
25
  export abstract class OrderNode implements DLOBNode {
@@ -27,12 +28,17 @@ export abstract class OrderNode implements DLOBNode {
27
28
  sortValue: BN;
28
29
  haveFilled = false;
29
30
  haveTrigger = false;
30
-
31
- constructor(order: Order, userAccount: string) {
31
+ isUserProtectedMaker: boolean;
32
+ constructor(
33
+ order: Order,
34
+ userAccount: string,
35
+ isUserProtectedMaker: boolean
36
+ ) {
32
37
  // Copy the order over to the node
33
38
  this.order = { ...order };
34
39
  this.userAccount = userAccount;
35
40
  this.sortValue = this.getSortValue(order);
41
+ this.isUserProtectedMaker = isUserProtectedMaker;
36
42
  }
37
43
 
38
44
  abstract getSortValue(order: Order): BN;
@@ -140,19 +146,28 @@ export type DLOBNodeType =
140
146
  export function createNode<T extends DLOBNodeType>(
141
147
  nodeType: T,
142
148
  order: Order,
143
- userAccount: string
149
+ userAccount: string,
150
+ isUserProtectedMaker: boolean
144
151
  ): DLOBNodeMap[T] {
145
152
  switch (nodeType) {
146
153
  case 'floatingLimit':
147
- return new FloatingLimitOrderNode(order, userAccount);
154
+ return new FloatingLimitOrderNode(
155
+ order,
156
+ userAccount,
157
+ isUserProtectedMaker
158
+ );
148
159
  case 'restingLimit':
149
- return new RestingLimitOrderNode(order, userAccount);
160
+ return new RestingLimitOrderNode(
161
+ order,
162
+ userAccount,
163
+ isUserProtectedMaker
164
+ );
150
165
  case 'takingLimit':
151
- return new TakingLimitOrderNode(order, userAccount);
166
+ return new TakingLimitOrderNode(order, userAccount, isUserProtectedMaker);
152
167
  case 'market':
153
- return new MarketOrderNode(order, userAccount);
168
+ return new MarketOrderNode(order, userAccount, isUserProtectedMaker);
154
169
  case 'trigger':
155
- return new TriggerOrderNode(order, userAccount);
170
+ return new TriggerOrderNode(order, userAccount, isUserProtectedMaker);
156
171
  default:
157
172
  throw Error(`Unknown DLOBNode type ${nodeType}`);
158
173
  }
@@ -36,13 +36,19 @@ export class NodeList<NodeType extends keyof DLOBNodeMap>
36
36
  public insert(
37
37
  order: Order,
38
38
  marketType: MarketTypeStr,
39
- userAccount: string
39
+ userAccount: string,
40
+ isUserProtectedMaker: boolean
40
41
  ): void {
41
42
  if (isVariant(order.status, 'init')) {
42
43
  return;
43
44
  }
44
45
 
45
- const newNode = createNode(this.nodeType, order, userAccount);
46
+ const newNode = createNode(
47
+ this.nodeType,
48
+ order,
49
+ userAccount,
50
+ isUserProtectedMaker
51
+ );
46
52
 
47
53
  const orderSignature = getOrderSignature(order.orderId, userAccount);
48
54
  if (this.nodeMap.has(orderSignature)) {
@@ -178,6 +184,7 @@ export function* getVammNodeGenerator(
178
184
  isVammNode: () => true,
179
185
  order: undefined,
180
186
  userAccount: undefined,
187
+ isUserProtectedMaker: false,
181
188
  isBaseFilled: () => false,
182
189
  haveFilled: false,
183
190
  };
@@ -0,0 +1,5 @@
1
+ import { UserAccount, UserStatus } from '..';
2
+
3
+ export function isUserProtectedMaker(userAccount: UserAccount): boolean {
4
+ return (userAccount.status & UserStatus.PROTECTED_MAKER) > 0;
5
+ }
@@ -12,6 +12,7 @@ import { EventEmitter } from 'events';
12
12
  import { BN } from '../index';
13
13
  import { decodeUser } from '../decode/user';
14
14
  import { grpcSubscription } from './grpcSubscription';
15
+ import { isUserProtectedMaker } from '../math/userStatus';
15
16
 
16
17
  export class OrderSubscriber {
17
18
  driftClient: DriftClient;
@@ -229,8 +230,9 @@ export class OrderSubscriber {
229
230
  public async getDLOB(slot: number): Promise<DLOB> {
230
231
  const dlob = this.createDLOB();
231
232
  for (const [key, { userAccount }] of this.usersAccounts.entries()) {
233
+ const protectedMaker = isUserProtectedMaker(userAccount);
232
234
  for (const order of userAccount.orders) {
233
- dlob.insertOrder(order, key, slot);
235
+ dlob.insertOrder(order, key, slot, protectedMaker);
234
236
  }
235
237
  }
236
238
  return dlob;
package/src/types.ts CHANGED
@@ -67,6 +67,7 @@ export enum UserStatus {
67
67
  BANKRUPT = 2,
68
68
  REDUCE_ONLY = 4,
69
69
  ADVANCED_LP = 8,
70
+ PROTECTED_MAKER = 16,
70
71
  }
71
72
 
72
73
  export class MarginMode {