@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.
- package/lib/dlob/DLOB.d.ts +8 -3
- package/lib/dlob/DLOB.js +118 -56
- package/lib/dlob/NodeList.d.ts +1 -0
- package/lib/dlob/NodeList.js +3 -0
- package/package.json +1 -1
- package/src/dlob/DLOB.ts +148 -72
- package/src/dlob/NodeList.ts +7 -0
package/lib/dlob/DLOB.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
645
|
-
for (const
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
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
|
-
|
|
654
|
-
const
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
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;
|
package/lib/dlob/NodeList.d.ts
CHANGED
|
@@ -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
|
}
|
package/lib/dlob/NodeList.js
CHANGED
|
@@ -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
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
|
-
|
|
1284
|
+
const dlobOrders: DLOBOrders = [];
|
|
1164
1285
|
|
|
1165
|
-
for (const
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
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
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
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
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
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
|
}
|
package/src/dlob/NodeList.ts
CHANGED
|
@@ -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) {
|