@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 +1 -1
- package/lib/browser/dlob/DLOB.d.ts +2 -2
- package/lib/browser/dlob/DLOB.js +11 -9
- package/lib/browser/dlob/DLOBNode.d.ts +4 -2
- package/lib/browser/dlob/DLOBNode.js +8 -7
- package/lib/browser/dlob/NodeList.d.ts +1 -1
- package/lib/browser/dlob/NodeList.js +3 -2
- package/lib/browser/math/userStatus.d.ts +2 -0
- package/lib/browser/math/userStatus.js +8 -0
- package/lib/browser/orderSubscriber/OrderSubscriber.js +3 -1
- package/lib/browser/types.d.ts +2 -1
- package/lib/browser/types.js +1 -0
- package/lib/node/dlob/DLOB.d.ts +2 -2
- package/lib/node/dlob/DLOB.js +11 -9
- package/lib/node/dlob/DLOBNode.d.ts +4 -2
- package/lib/node/dlob/DLOBNode.js +8 -7
- package/lib/node/dlob/NodeList.d.ts +1 -1
- package/lib/node/dlob/NodeList.js +3 -2
- package/lib/node/math/userStatus.d.ts +2 -0
- package/lib/node/math/userStatus.js +8 -0
- package/lib/node/orderSubscriber/OrderSubscriber.js +3 -1
- package/lib/node/types.d.ts +2 -1
- package/lib/node/types.js +1 -0
- package/package.json +1 -1
- package/src/dlob/DLOB.ts +17 -7
- package/src/dlob/DLOBNode.ts +23 -8
- package/src/dlob/NodeList.ts +9 -2
- package/src/math/userStatus.ts +5 -0
- package/src/orderSubscriber/OrderSubscriber.ts +3 -1
- package/src/types.ts +1 -0
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.103.0-beta.
|
|
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;
|
package/lib/browser/dlob/DLOB.js
CHANGED
|
@@ -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
|
-
|
|
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,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;
|
package/lib/browser/types.d.ts
CHANGED
package/lib/browser/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/lib/node/dlob/DLOB.d.ts
CHANGED
|
@@ -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;
|
package/lib/node/dlob/DLOB.js
CHANGED
|
@@ -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
|
-
|
|
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,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;
|
package/lib/node/types.d.ts
CHANGED
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
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(
|
|
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();
|
package/src/dlob/DLOBNode.ts
CHANGED
|
@@ -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(
|
|
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(
|
|
154
|
+
return new FloatingLimitOrderNode(
|
|
155
|
+
order,
|
|
156
|
+
userAccount,
|
|
157
|
+
isUserProtectedMaker
|
|
158
|
+
);
|
|
148
159
|
case 'restingLimit':
|
|
149
|
-
return new RestingLimitOrderNode(
|
|
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
|
}
|
package/src/dlob/NodeList.ts
CHANGED
|
@@ -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(
|
|
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
|
};
|
|
@@ -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;
|