@drift-labs/sdk 2.0.14 → 2.0.16
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/README.md +3 -3
- package/lib/accounts/pollingDriftClientAccountSubscriber.js +0 -3
- package/lib/accounts/pollingUserStatsAccountSubscriber.js +0 -3
- package/lib/adminClient.d.ts +2 -0
- package/lib/adminClient.js +16 -0
- package/lib/constants/numericConstants.d.ts +3 -0
- package/lib/constants/numericConstants.js +4 -1
- package/lib/dlob/DLOB.d.ts +2 -7
- package/lib/dlob/DLOB.js +84 -166
- package/lib/idl/drift.json +65 -7
- package/lib/math/amm.d.ts +8 -7
- package/lib/math/amm.js +116 -61
- package/lib/math/oracles.d.ts +2 -0
- package/lib/math/oracles.js +23 -1
- package/lib/math/utils.d.ts +2 -1
- package/lib/math/utils.js +5 -1
- package/lib/types.d.ts +6 -2
- package/lib/user.js +10 -6
- package/package.json +1 -1
- package/src/accounts/pollingDriftClientAccountSubscriber.ts +0 -4
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +0 -4
- package/src/adminClient.ts +28 -0
- package/src/constants/numericConstants.ts +7 -0
- package/src/dlob/DLOB.ts +152 -237
- package/src/idl/drift.json +65 -7
- package/src/math/amm.ts +220 -100
- package/src/math/oracles.ts +52 -0
- package/src/math/utils.ts +5 -1
- package/src/types.ts +6 -2
- package/src/user.ts +17 -6
- package/tests/dlob/helpers.ts +4 -2
- package/tests/dlob/test.ts +252 -0
- package/src/events/eventList.js +0 -77
package/src/dlob/DLOB.ts
CHANGED
|
@@ -59,8 +59,6 @@ export type NodeToTrigger = {
|
|
|
59
59
|
node: TriggerOrderNode;
|
|
60
60
|
};
|
|
61
61
|
|
|
62
|
-
type Side = 'ask' | 'bid' | 'both' | 'nocross';
|
|
63
|
-
|
|
64
62
|
export class DLOB {
|
|
65
63
|
openOrders = new Map<MarketTypeStr, Set<string>>();
|
|
66
64
|
orderLists = new Map<MarketTypeStr, Map<number, MarketNodeLists>>();
|
|
@@ -348,53 +346,19 @@ export class DLOB {
|
|
|
348
346
|
): NodeToFill[] {
|
|
349
347
|
const nodesToFill = new Array<NodeToFill>();
|
|
350
348
|
|
|
351
|
-
|
|
352
|
-
marketIndex,
|
|
353
|
-
slot,
|
|
354
|
-
marketType,
|
|
355
|
-
oraclePriceData
|
|
356
|
-
);
|
|
357
|
-
|
|
358
|
-
let bidGenerator = this.getLimitBids(
|
|
349
|
+
const crossingNodes = this.findCrossingLimitOrders(
|
|
359
350
|
marketIndex,
|
|
360
351
|
slot,
|
|
361
352
|
marketType,
|
|
362
353
|
oraclePriceData
|
|
363
354
|
);
|
|
364
355
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
// First try to find orders that cross
|
|
369
|
-
while (!nextAsk.done && !nextBid.done) {
|
|
370
|
-
const { crossingNodes, exhaustedSide } = this.findCrossingLimitOrders(
|
|
371
|
-
nextAsk.value,
|
|
372
|
-
nextBid.value,
|
|
373
|
-
oraclePriceData,
|
|
374
|
-
slot
|
|
375
|
-
);
|
|
376
|
-
|
|
377
|
-
if (exhaustedSide === 'bid') {
|
|
378
|
-
nextBid = bidGenerator.next();
|
|
379
|
-
} else if (exhaustedSide === 'ask') {
|
|
380
|
-
nextAsk = askGenerator.next();
|
|
381
|
-
} else if (exhaustedSide === 'both') {
|
|
382
|
-
nextBid = bidGenerator.next();
|
|
383
|
-
nextAsk = askGenerator.next();
|
|
384
|
-
} else if (exhaustedSide === 'nocross') {
|
|
385
|
-
break;
|
|
386
|
-
} else {
|
|
387
|
-
console.error(`invalid exhaustedSide: ${exhaustedSide}`);
|
|
388
|
-
break;
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
for (const crossingNode of crossingNodes) {
|
|
392
|
-
nodesToFill.push(crossingNode);
|
|
393
|
-
}
|
|
356
|
+
for (const crossingNode of crossingNodes) {
|
|
357
|
+
nodesToFill.push(crossingNode);
|
|
394
358
|
}
|
|
395
359
|
|
|
396
360
|
if (fallbackBid && !isAmmPaused) {
|
|
397
|
-
askGenerator = this.getLimitAsks(
|
|
361
|
+
const askGenerator = this.getLimitAsks(
|
|
398
362
|
marketIndex,
|
|
399
363
|
slot,
|
|
400
364
|
marketType,
|
|
@@ -417,7 +381,7 @@ export class DLOB {
|
|
|
417
381
|
}
|
|
418
382
|
|
|
419
383
|
if (fallbackAsk && !isAmmPaused) {
|
|
420
|
-
bidGenerator = this.getLimitBids(
|
|
384
|
+
const bidGenerator = this.getLimitBids(
|
|
421
385
|
marketIndex,
|
|
422
386
|
slot,
|
|
423
387
|
marketType,
|
|
@@ -454,18 +418,14 @@ export class DLOB {
|
|
|
454
418
|
const nodesToFill = new Array<NodeToFill>();
|
|
455
419
|
|
|
456
420
|
let marketOrderGenerator = this.getMarketAsks(marketIndex, marketType);
|
|
457
|
-
let limitOrderGenerator = this.getLimitBids(
|
|
458
|
-
marketIndex,
|
|
459
|
-
slot,
|
|
460
|
-
marketType,
|
|
461
|
-
oraclePriceData
|
|
462
|
-
);
|
|
463
421
|
|
|
464
422
|
const marketAsksCrossingBids = this.findMarketNodesCrossingLimitNodes(
|
|
423
|
+
marketIndex,
|
|
465
424
|
slot,
|
|
425
|
+
marketType,
|
|
466
426
|
oraclePriceData,
|
|
467
427
|
marketOrderGenerator,
|
|
468
|
-
|
|
428
|
+
this.getLimitBids.bind(this),
|
|
469
429
|
(takerPrice, makerPrice) => {
|
|
470
430
|
return takerPrice === undefined || takerPrice.lte(makerPrice);
|
|
471
431
|
}
|
|
@@ -494,18 +454,14 @@ export class DLOB {
|
|
|
494
454
|
}
|
|
495
455
|
|
|
496
456
|
marketOrderGenerator = this.getMarketBids(marketIndex, marketType);
|
|
497
|
-
limitOrderGenerator = this.getLimitAsks(
|
|
498
|
-
marketIndex,
|
|
499
|
-
slot,
|
|
500
|
-
marketType,
|
|
501
|
-
oraclePriceData
|
|
502
|
-
);
|
|
503
457
|
|
|
504
458
|
const marketBidsToFill = this.findMarketNodesCrossingLimitNodes(
|
|
459
|
+
marketIndex,
|
|
505
460
|
slot,
|
|
461
|
+
marketType,
|
|
506
462
|
oraclePriceData,
|
|
507
463
|
marketOrderGenerator,
|
|
508
|
-
|
|
464
|
+
this.getLimitAsks.bind(this),
|
|
509
465
|
(takerPrice, fallbackPrice) => {
|
|
510
466
|
return takerPrice === undefined || takerPrice.gte(fallbackPrice);
|
|
511
467
|
}
|
|
@@ -537,88 +493,92 @@ export class DLOB {
|
|
|
537
493
|
}
|
|
538
494
|
|
|
539
495
|
public findMarketNodesCrossingLimitNodes(
|
|
496
|
+
marketIndex: number,
|
|
540
497
|
slot: number,
|
|
498
|
+
marketType: MarketType,
|
|
541
499
|
oraclePriceData: OraclePriceData,
|
|
542
500
|
takerNodeGenerator: Generator<DLOBNode>,
|
|
543
|
-
|
|
501
|
+
makerNodeGeneratorFn: (
|
|
502
|
+
marketIndex: number,
|
|
503
|
+
slot: number,
|
|
504
|
+
marketType: MarketType,
|
|
505
|
+
oraclePriceData: OraclePriceData
|
|
506
|
+
) => Generator<DLOBNode>,
|
|
544
507
|
doesCross: (takerPrice: BN | undefined, makerPrice: BN) => boolean
|
|
545
508
|
): NodeToFill[] {
|
|
546
509
|
const nodesToFill = new Array<NodeToFill>();
|
|
547
510
|
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
const bidUserAuthority = this.userMap.getUserAuthority(
|
|
556
|
-
makerNode.userAccount.toString()
|
|
557
|
-
);
|
|
558
|
-
const askUserAuthority = this.userMap.getUserAuthority(
|
|
559
|
-
takerNode.userAccount.toString()
|
|
511
|
+
for (const takerNode of takerNodeGenerator) {
|
|
512
|
+
const makerNodeGenerator = makerNodeGeneratorFn(
|
|
513
|
+
marketIndex,
|
|
514
|
+
slot,
|
|
515
|
+
marketType,
|
|
516
|
+
oraclePriceData
|
|
560
517
|
);
|
|
561
518
|
|
|
562
|
-
|
|
563
|
-
|
|
519
|
+
for (const makerNode of makerNodeGenerator) {
|
|
520
|
+
const bidUserAuthority = this.userMap.getUserAuthority(
|
|
521
|
+
makerNode.userAccount.toString()
|
|
522
|
+
);
|
|
523
|
+
const askUserAuthority = this.userMap.getUserAuthority(
|
|
524
|
+
takerNode.userAccount.toString()
|
|
525
|
+
);
|
|
526
|
+
|
|
527
|
+
// Can't match orders from the same authority
|
|
528
|
+
const sameAuthority = bidUserAuthority.equals(askUserAuthority);
|
|
564
529
|
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
nextTakerNode = takerNodeGenerator.next();
|
|
568
|
-
} else {
|
|
569
|
-
nextMakerNode = makerNodeGenerator.next();
|
|
530
|
+
if (sameAuthority) {
|
|
531
|
+
continue;
|
|
570
532
|
}
|
|
571
|
-
continue;
|
|
572
|
-
}
|
|
573
533
|
|
|
574
|
-
|
|
575
|
-
|
|
534
|
+
const makerPrice = makerNode.getPrice(oraclePriceData, slot);
|
|
535
|
+
const takerPrice = takerNode.getPrice(oraclePriceData, slot);
|
|
576
536
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
}
|
|
537
|
+
const ordersCross = doesCross(takerPrice, makerPrice);
|
|
538
|
+
if (!ordersCross) {
|
|
539
|
+
// market orders aren't sorted by price, they are sorted by time, so we need to traverse
|
|
540
|
+
// through all of em
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
584
543
|
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
544
|
+
nodesToFill.push({
|
|
545
|
+
node: takerNode,
|
|
546
|
+
makerNode: makerNode,
|
|
547
|
+
});
|
|
589
548
|
|
|
590
|
-
|
|
591
|
-
|
|
549
|
+
const makerOrder = makerNode.order;
|
|
550
|
+
const takerOrder = takerNode.order;
|
|
592
551
|
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
552
|
+
const makerBaseRemaining = makerOrder.baseAssetAmount.sub(
|
|
553
|
+
makerOrder.baseAssetAmountFilled
|
|
554
|
+
);
|
|
555
|
+
const takerBaseRemaining = takerOrder.baseAssetAmount.sub(
|
|
556
|
+
takerOrder.baseAssetAmountFilled
|
|
557
|
+
);
|
|
599
558
|
|
|
600
|
-
|
|
559
|
+
const baseFilled = BN.min(makerBaseRemaining, takerBaseRemaining);
|
|
601
560
|
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
if (newMakerOrder.baseAssetAmountFilled.eq(makerOrder.baseAssetAmount)) {
|
|
610
|
-
nextMakerNode = makerNodeGenerator.next();
|
|
611
|
-
}
|
|
561
|
+
const newMakerOrder = { ...makerOrder };
|
|
562
|
+
newMakerOrder.baseAssetAmountFilled =
|
|
563
|
+
makerOrder.baseAssetAmountFilled.add(baseFilled);
|
|
564
|
+
this.getListForOrder(newMakerOrder).update(
|
|
565
|
+
newMakerOrder,
|
|
566
|
+
makerNode.userAccount
|
|
567
|
+
);
|
|
612
568
|
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
569
|
+
const newTakerOrder = { ...takerOrder };
|
|
570
|
+
newTakerOrder.baseAssetAmountFilled =
|
|
571
|
+
takerOrder.baseAssetAmountFilled.add(baseFilled);
|
|
572
|
+
this.getListForOrder(newTakerOrder).update(
|
|
573
|
+
newTakerOrder,
|
|
574
|
+
takerNode.userAccount
|
|
575
|
+
);
|
|
576
|
+
|
|
577
|
+
if (
|
|
578
|
+
newTakerOrder.baseAssetAmountFilled.eq(takerOrder.baseAssetAmount)
|
|
579
|
+
) {
|
|
580
|
+
break;
|
|
581
|
+
}
|
|
622
582
|
}
|
|
623
583
|
}
|
|
624
584
|
|
|
@@ -959,162 +919,117 @@ export class DLOB {
|
|
|
959
919
|
}
|
|
960
920
|
|
|
961
921
|
findCrossingLimitOrders(
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
): {
|
|
967
|
-
|
|
968
|
-
exhaustedSide: Side;
|
|
969
|
-
} {
|
|
970
|
-
const bidPrice = bidNode.getPrice(oraclePriceData, slot);
|
|
971
|
-
const askPrice = askNode.getPrice(oraclePriceData, slot);
|
|
972
|
-
|
|
973
|
-
// orders don't cross - we're done walkin gup the book
|
|
974
|
-
if (bidPrice.lt(askPrice)) {
|
|
975
|
-
return {
|
|
976
|
-
crossingNodes: [],
|
|
977
|
-
exhaustedSide: 'nocross',
|
|
978
|
-
};
|
|
979
|
-
}
|
|
922
|
+
marketIndex: number,
|
|
923
|
+
slot: number,
|
|
924
|
+
marketType: MarketType,
|
|
925
|
+
oraclePriceData: OraclePriceData
|
|
926
|
+
): NodeToFill[] {
|
|
927
|
+
const nodesToFill = new Array<NodeToFill>();
|
|
980
928
|
|
|
981
|
-
const
|
|
982
|
-
|
|
929
|
+
for (const askNode of this.getLimitAsks(
|
|
930
|
+
marketIndex,
|
|
931
|
+
slot,
|
|
932
|
+
marketType,
|
|
933
|
+
oraclePriceData
|
|
934
|
+
)) {
|
|
935
|
+
for (const bidNode of this.getLimitBids(
|
|
936
|
+
marketIndex,
|
|
937
|
+
slot,
|
|
938
|
+
marketType,
|
|
939
|
+
oraclePriceData
|
|
940
|
+
)) {
|
|
941
|
+
const bidPrice = bidNode.getPrice(oraclePriceData, slot);
|
|
942
|
+
const askPrice = askNode.getPrice(oraclePriceData, slot);
|
|
983
943
|
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
askNode.userAccount.toString()
|
|
989
|
-
);
|
|
944
|
+
// orders don't cross - we're done walking the book
|
|
945
|
+
if (bidPrice.lt(askPrice)) {
|
|
946
|
+
return nodesToFill;
|
|
947
|
+
}
|
|
990
948
|
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
if (sameAuthority || (bidOrder.postOnly && askOrder.postOnly)) {
|
|
994
|
-
// don't have a principle way to pick which one to exhaust,
|
|
995
|
-
// exhaust each one 50% of the time so we can try each one against other orders
|
|
996
|
-
const exhaustedSide = Math.random() < 0.5 ? 'bid' : 'ask';
|
|
997
|
-
return {
|
|
998
|
-
crossingNodes: [],
|
|
999
|
-
exhaustedSide,
|
|
1000
|
-
};
|
|
1001
|
-
}
|
|
949
|
+
const bidOrder = bidNode.order;
|
|
950
|
+
const askOrder = askNode.order;
|
|
1002
951
|
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
952
|
+
const bidUserAuthority = this.userMap.getUserAuthority(
|
|
953
|
+
bidNode.userAccount.toString()
|
|
954
|
+
);
|
|
955
|
+
const askUserAuthority = this.userMap.getUserAuthority(
|
|
956
|
+
askNode.userAccount.toString()
|
|
957
|
+
);
|
|
1007
958
|
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
);
|
|
959
|
+
// Can't match orders from the same authority
|
|
960
|
+
const sameAuthority = bidUserAuthority.equals(askUserAuthority);
|
|
961
|
+
if (sameAuthority || (bidOrder.postOnly && askOrder.postOnly)) {
|
|
962
|
+
continue;
|
|
963
|
+
}
|
|
1014
964
|
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
exhaustedSide = 'ask';
|
|
1020
|
-
} else {
|
|
1021
|
-
exhaustedSide = 'bid';
|
|
1022
|
-
}
|
|
965
|
+
const { takerNode, makerNode } = this.determineMakerAndTaker(
|
|
966
|
+
askNode,
|
|
967
|
+
bidNode
|
|
968
|
+
);
|
|
1023
969
|
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
// bid partially filled
|
|
1031
|
-
const newBidOrder = { ...bidOrder };
|
|
1032
|
-
newBidOrder.baseAssetAmountFilled =
|
|
1033
|
-
bidOrder.baseAssetAmountFilled.add(askBaseRemaining);
|
|
1034
|
-
this.getListForOrder(newBidOrder).update(
|
|
1035
|
-
newBidOrder,
|
|
1036
|
-
bidNode.userAccount
|
|
1037
|
-
);
|
|
970
|
+
const bidBaseRemaining = bidOrder.baseAssetAmount.sub(
|
|
971
|
+
bidOrder.baseAssetAmountFilled
|
|
972
|
+
);
|
|
973
|
+
const askBaseRemaining = askOrder.baseAssetAmount.sub(
|
|
974
|
+
askOrder.baseAssetAmountFilled
|
|
975
|
+
);
|
|
1038
976
|
|
|
1039
|
-
|
|
1040
|
-
const newAskOrder = { ...askOrder };
|
|
1041
|
-
newAskOrder.baseAssetAmountFilled = askOrder.baseAssetAmount;
|
|
1042
|
-
this.getListForOrder(newAskOrder).update(
|
|
1043
|
-
newAskOrder,
|
|
1044
|
-
askNode.userAccount
|
|
1045
|
-
);
|
|
1046
|
-
} else if (exhaustedSide === 'bid') {
|
|
1047
|
-
// ask partially filled
|
|
1048
|
-
const newAskOrder = { ...askOrder };
|
|
1049
|
-
newAskOrder.baseAssetAmountFilled =
|
|
1050
|
-
askOrder.baseAssetAmountFilled.add(bidBaseRemaining);
|
|
1051
|
-
this.getListForOrder(newAskOrder).update(
|
|
1052
|
-
newAskOrder,
|
|
1053
|
-
askNode.userAccount
|
|
1054
|
-
);
|
|
977
|
+
const baseFilled = BN.min(bidBaseRemaining, askBaseRemaining);
|
|
1055
978
|
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
} else {
|
|
1064
|
-
// both completely filled
|
|
1065
|
-
const newBidOrder = { ...bidOrder };
|
|
1066
|
-
newBidOrder.baseAssetAmountFilled = bidOrder.baseAssetAmount;
|
|
1067
|
-
this.getListForOrder(newBidOrder).update(
|
|
1068
|
-
newBidOrder,
|
|
1069
|
-
bidNode.userAccount
|
|
1070
|
-
);
|
|
979
|
+
const newBidOrder = { ...bidOrder };
|
|
980
|
+
newBidOrder.baseAssetAmountFilled =
|
|
981
|
+
bidOrder.baseAssetAmountFilled.add(baseFilled);
|
|
982
|
+
this.getListForOrder(newBidOrder).update(
|
|
983
|
+
newBidOrder,
|
|
984
|
+
bidNode.userAccount
|
|
985
|
+
);
|
|
1071
986
|
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
987
|
+
// ask completely filled
|
|
988
|
+
const newAskOrder = { ...askOrder };
|
|
989
|
+
newAskOrder.baseAssetAmountFilled =
|
|
990
|
+
askOrder.baseAssetAmountFilled.add(baseFilled);
|
|
991
|
+
this.getListForOrder(newAskOrder).update(
|
|
992
|
+
newAskOrder,
|
|
993
|
+
askNode.userAccount
|
|
994
|
+
);
|
|
1079
995
|
|
|
1080
|
-
|
|
1081
|
-
crossingNodes: [
|
|
1082
|
-
{
|
|
996
|
+
nodesToFill.push({
|
|
1083
997
|
node: takerNode,
|
|
1084
998
|
makerNode: makerNode,
|
|
1085
|
-
}
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
999
|
+
});
|
|
1000
|
+
|
|
1001
|
+
if (newAskOrder.baseAssetAmount.eq(newAskOrder.baseAssetAmountFilled)) {
|
|
1002
|
+
break;
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
return nodesToFill;
|
|
1089
1008
|
}
|
|
1090
1009
|
|
|
1091
1010
|
determineMakerAndTaker(
|
|
1092
1011
|
askNode: DLOBNode,
|
|
1093
1012
|
bidNode: DLOBNode
|
|
1094
|
-
): { takerNode: DLOBNode; makerNode: DLOBNode
|
|
1013
|
+
): { takerNode: DLOBNode; makerNode: DLOBNode } {
|
|
1095
1014
|
if (bidNode.order.postOnly) {
|
|
1096
1015
|
return {
|
|
1097
1016
|
takerNode: askNode,
|
|
1098
1017
|
makerNode: bidNode,
|
|
1099
|
-
makerSide: 'bid',
|
|
1100
1018
|
};
|
|
1101
1019
|
} else if (askNode.order.postOnly) {
|
|
1102
1020
|
return {
|
|
1103
1021
|
takerNode: bidNode,
|
|
1104
1022
|
makerNode: askNode,
|
|
1105
|
-
makerSide: 'ask',
|
|
1106
1023
|
};
|
|
1107
1024
|
} else if (askNode.order.slot.lt(bidNode.order.slot)) {
|
|
1108
1025
|
return {
|
|
1109
1026
|
takerNode: bidNode,
|
|
1110
1027
|
makerNode: askNode,
|
|
1111
|
-
makerSide: 'ask',
|
|
1112
1028
|
};
|
|
1113
1029
|
} else {
|
|
1114
1030
|
return {
|
|
1115
1031
|
takerNode: askNode,
|
|
1116
1032
|
makerNode: bidNode,
|
|
1117
|
-
makerSide: 'bid',
|
|
1118
1033
|
};
|
|
1119
1034
|
}
|
|
1120
1035
|
}
|
package/src/idl/drift.json
CHANGED
|
@@ -1432,7 +1432,7 @@
|
|
|
1432
1432
|
},
|
|
1433
1433
|
{
|
|
1434
1434
|
"name": "spotMarket",
|
|
1435
|
-
"isMut":
|
|
1435
|
+
"isMut": true,
|
|
1436
1436
|
"isSigner": false
|
|
1437
1437
|
},
|
|
1438
1438
|
{
|
|
@@ -3233,6 +3233,48 @@
|
|
|
3233
3233
|
}
|
|
3234
3234
|
]
|
|
3235
3235
|
},
|
|
3236
|
+
{
|
|
3237
|
+
"name": "updateInitialPctToLiquidate",
|
|
3238
|
+
"accounts": [
|
|
3239
|
+
{
|
|
3240
|
+
"name": "admin",
|
|
3241
|
+
"isMut": false,
|
|
3242
|
+
"isSigner": true
|
|
3243
|
+
},
|
|
3244
|
+
{
|
|
3245
|
+
"name": "state",
|
|
3246
|
+
"isMut": true,
|
|
3247
|
+
"isSigner": false
|
|
3248
|
+
}
|
|
3249
|
+
],
|
|
3250
|
+
"args": [
|
|
3251
|
+
{
|
|
3252
|
+
"name": "initialPctToLiquidate",
|
|
3253
|
+
"type": "u16"
|
|
3254
|
+
}
|
|
3255
|
+
]
|
|
3256
|
+
},
|
|
3257
|
+
{
|
|
3258
|
+
"name": "updateLiquidationDuration",
|
|
3259
|
+
"accounts": [
|
|
3260
|
+
{
|
|
3261
|
+
"name": "admin",
|
|
3262
|
+
"isMut": false,
|
|
3263
|
+
"isSigner": true
|
|
3264
|
+
},
|
|
3265
|
+
{
|
|
3266
|
+
"name": "state",
|
|
3267
|
+
"isMut": true,
|
|
3268
|
+
"isSigner": false
|
|
3269
|
+
}
|
|
3270
|
+
],
|
|
3271
|
+
"args": [
|
|
3272
|
+
{
|
|
3273
|
+
"name": "liquidationDuration",
|
|
3274
|
+
"type": "u8"
|
|
3275
|
+
}
|
|
3276
|
+
]
|
|
3277
|
+
},
|
|
3236
3278
|
{
|
|
3237
3279
|
"name": "updateOracleGuardRails",
|
|
3238
3280
|
"accounts": [
|
|
@@ -4320,12 +4362,20 @@
|
|
|
4320
4362
|
"defined": "ExchangeStatus"
|
|
4321
4363
|
}
|
|
4322
4364
|
},
|
|
4365
|
+
{
|
|
4366
|
+
"name": "liquidationDuration",
|
|
4367
|
+
"type": "u8"
|
|
4368
|
+
},
|
|
4369
|
+
{
|
|
4370
|
+
"name": "initialPctToLiquidate",
|
|
4371
|
+
"type": "u16"
|
|
4372
|
+
},
|
|
4323
4373
|
{
|
|
4324
4374
|
"name": "padding",
|
|
4325
4375
|
"type": {
|
|
4326
4376
|
"array": [
|
|
4327
4377
|
"u8",
|
|
4328
|
-
|
|
4378
|
+
14
|
|
4329
4379
|
]
|
|
4330
4380
|
}
|
|
4331
4381
|
}
|
|
@@ -4420,8 +4470,8 @@
|
|
|
4420
4470
|
"type": "u64"
|
|
4421
4471
|
},
|
|
4422
4472
|
{
|
|
4423
|
-
"name": "
|
|
4424
|
-
"type": "
|
|
4473
|
+
"name": "liquidationStartSlot",
|
|
4474
|
+
"type": "u64"
|
|
4425
4475
|
},
|
|
4426
4476
|
{
|
|
4427
4477
|
"name": "nextOrderId",
|
|
@@ -5596,11 +5646,11 @@
|
|
|
5596
5646
|
"type": "u64"
|
|
5597
5647
|
},
|
|
5598
5648
|
{
|
|
5599
|
-
"name": "
|
|
5649
|
+
"name": "lastBaseAssetAmountPerLp",
|
|
5600
5650
|
"type": "i64"
|
|
5601
5651
|
},
|
|
5602
5652
|
{
|
|
5603
|
-
"name": "
|
|
5653
|
+
"name": "lastQuoteAssetAmountPerLp",
|
|
5604
5654
|
"type": "i64"
|
|
5605
5655
|
},
|
|
5606
5656
|
{
|
|
@@ -6016,6 +6066,9 @@
|
|
|
6016
6066
|
},
|
|
6017
6067
|
{
|
|
6018
6068
|
"name": "OrderFillWithSerum"
|
|
6069
|
+
},
|
|
6070
|
+
{
|
|
6071
|
+
"name": "NoBorrowLiquidity"
|
|
6019
6072
|
}
|
|
6020
6073
|
]
|
|
6021
6074
|
}
|
|
@@ -8454,11 +8507,16 @@
|
|
|
8454
8507
|
},
|
|
8455
8508
|
{
|
|
8456
8509
|
"code": 6219,
|
|
8510
|
+
"name": "UnableToGetLimitPrice",
|
|
8511
|
+
"msg": "Unable To Get Limit Price"
|
|
8512
|
+
},
|
|
8513
|
+
{
|
|
8514
|
+
"code": 6220,
|
|
8457
8515
|
"name": "InvalidLiquidation",
|
|
8458
8516
|
"msg": "Invalid Liquidation"
|
|
8459
8517
|
},
|
|
8460
8518
|
{
|
|
8461
|
-
"code":
|
|
8519
|
+
"code": 6221,
|
|
8462
8520
|
"name": "SpotFulfillmentConfigDisabled",
|
|
8463
8521
|
"msg": "Spot Fulfullment Config Disabled"
|
|
8464
8522
|
}
|