@drift-labs/sdk 0.2.0-master.37 → 0.2.0-master.39

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.
Files changed (75) hide show
  1. package/README.md +14 -14
  2. package/lib/accounts/bulkUserStatsSubscription.d.ts +2 -2
  3. package/lib/accounts/bulkUserSubscription.d.ts +2 -2
  4. package/lib/accounts/{pollingClearingHouseAccountSubscriber.d.ts → pollingDriftClientAccountSubscriber.d.ts} +3 -8
  5. package/lib/accounts/{pollingClearingHouseAccountSubscriber.js → pollingDriftClientAccountSubscriber.js} +6 -13
  6. package/lib/accounts/{pollingOracleSubscriber.d.ts → pollingOracleAccountSubscriber.d.ts} +2 -2
  7. package/lib/accounts/{pollingOracleSubscriber.js → pollingOracleAccountSubscriber.js} +3 -3
  8. package/lib/accounts/types.d.ts +4 -4
  9. package/lib/accounts/{webSocketClearingHouseAccountSubscriber.d.ts → webSocketDriftClientAccountSubscriber.d.ts} +3 -3
  10. package/lib/accounts/{webSocketClearingHouseAccountSubscriber.js → webSocketDriftClientAccountSubscriber.js} +4 -4
  11. package/lib/addresses/pda.d.ts +3 -3
  12. package/lib/addresses/pda.js +10 -10
  13. package/lib/{admin.d.ts → adminClient.d.ts} +12 -4
  14. package/lib/{admin.js → adminClient.js} +89 -15
  15. package/lib/config.js +1 -1
  16. package/lib/constants/numericConstants.d.ts +3 -0
  17. package/lib/constants/numericConstants.js +5 -2
  18. package/lib/dlob/DLOB.d.ts +2 -2
  19. package/lib/dlob/DLOB.js +4 -4
  20. package/lib/{clearingHouse.d.ts → driftClient.d.ts} +21 -20
  21. package/lib/{clearingHouse.js → driftClient.js} +48 -37
  22. package/lib/{clearingHouseConfig.d.ts → driftClientConfig.d.ts} +3 -3
  23. package/lib/{clearingHouseConfig.js → driftClientConfig.js} +0 -0
  24. package/lib/examples/makeTradeExample.js +13 -13
  25. package/lib/idl/{clearing_house.json → drift.json} +717 -143
  26. package/lib/index.d.ts +10 -10
  27. package/lib/index.js +10 -10
  28. package/lib/math/orders.d.ts +4 -4
  29. package/lib/math/orders.js +3 -3
  30. package/lib/serum/serumFulfillmentConfigMap.d.ts +3 -3
  31. package/lib/serum/serumFulfillmentConfigMap.js +3 -3
  32. package/lib/types.d.ts +38 -2
  33. package/lib/types.js +2 -1
  34. package/lib/{clearingHouseUser.d.ts → user.d.ts} +16 -10
  35. package/lib/{clearingHouseUser.js → user.js} +54 -46
  36. package/lib/userConfig.d.ts +14 -0
  37. package/lib/{clearingHouseUserConfig.js → userConfig.js} +0 -0
  38. package/lib/userMap/userMap.d.ts +17 -17
  39. package/lib/userMap/userMap.js +15 -15
  40. package/lib/userMap/userStatsMap.d.ts +7 -7
  41. package/lib/userMap/userStatsMap.js +10 -10
  42. package/lib/{clearingHouseUserStats.d.ts → userStats.d.ts} +5 -5
  43. package/lib/{clearingHouseUserStats.js → userStats.js} +8 -8
  44. package/lib/userStatsConfig.d.ts +14 -0
  45. package/lib/{clearingHouseUserStatsConfig.js → userStatsConfig.js} +0 -0
  46. package/package.json +1 -1
  47. package/src/accounts/bulkUserStatsSubscription.ts +2 -2
  48. package/src/accounts/bulkUserSubscription.ts +2 -2
  49. package/src/accounts/{pollingClearingHouseAccountSubscriber.ts → pollingDriftClientAccountSubscriber.ts} +11 -25
  50. package/src/accounts/{pollingOracleSubscriber.ts → pollingOracleAccountSubscriber.ts} +2 -2
  51. package/src/accounts/types.ts +4 -4
  52. package/src/accounts/{webSocketClearingHouseAccountSubscriber.ts → webSocketDriftClientAccountSubscriber.ts} +7 -7
  53. package/src/addresses/pda.ts +6 -8
  54. package/src/{admin.ts → adminClient.ts} +185 -18
  55. package/src/config.ts +1 -1
  56. package/src/constants/numericConstants.ts +4 -0
  57. package/src/dlob/DLOB.ts +5 -5
  58. package/src/{clearingHouse.ts → driftClient.ts} +85 -68
  59. package/src/{clearingHouseConfig.ts → driftClientConfig.ts} +3 -3
  60. package/src/examples/makeTradeExample.ts +15 -17
  61. package/src/idl/{clearing_house.json → drift.json} +717 -143
  62. package/src/index.ts +10 -10
  63. package/src/math/orders.ts +7 -13
  64. package/src/serum/serumFulfillmentConfigMap.ts +5 -5
  65. package/src/types.ts +41 -2
  66. package/src/{clearingHouseUser.ts → user.ts} +60 -54
  67. package/src/{clearingHouseUserConfig.ts → userConfig.ts} +5 -5
  68. package/src/userMap/userMap.ts +29 -29
  69. package/src/userMap/userStatsMap.ts +21 -23
  70. package/src/{clearingHouseUserStats.ts → userStats.ts} +10 -10
  71. package/src/userStatsConfig.ts +18 -0
  72. package/tests/dlob/helpers.ts +55 -13
  73. package/lib/clearingHouseUserConfig.d.ts +0 -14
  74. package/lib/clearingHouseUserStatsConfig.d.ts +0 -14
  75. package/src/clearingHouseUserStatsConfig.ts +0 -18
package/lib/index.d.ts CHANGED
@@ -8,23 +8,23 @@ export * from './oracles/switchboardClient';
8
8
  export * from './types';
9
9
  export * from './constants/perpMarkets';
10
10
  export * from './accounts/fetch';
11
- export * from './accounts/webSocketClearingHouseAccountSubscriber';
11
+ export * from './accounts/webSocketDriftClientAccountSubscriber';
12
12
  export * from './accounts/bulkAccountLoader';
13
13
  export * from './accounts/bulkUserSubscription';
14
14
  export * from './accounts/bulkUserStatsSubscription';
15
- export * from './accounts/pollingClearingHouseAccountSubscriber';
16
- export * from './accounts/pollingOracleSubscriber';
15
+ export * from './accounts/pollingDriftClientAccountSubscriber';
16
+ export * from './accounts/pollingOracleAccountSubscriber';
17
17
  export * from './accounts/pollingTokenAccountSubscriber';
18
18
  export * from './accounts/pollingUserAccountSubscriber';
19
19
  export * from './accounts/pollingUserStatsAccountSubscriber';
20
20
  export * from './accounts/types';
21
21
  export * from './addresses/pda';
22
- export * from './admin';
23
- export * from './clearingHouseUser';
24
- export * from './clearingHouseUserConfig';
25
- export * from './clearingHouseUserStats';
26
- export * from './clearingHouseUserStatsConfig';
27
- export * from './clearingHouse';
22
+ export * from './adminClient';
23
+ export * from './user';
24
+ export * from './userConfig';
25
+ export * from './userStats';
26
+ export * from './userStatsConfig';
27
+ export * from './driftClient';
28
28
  export * from './factory/oracleClient';
29
29
  export * from './factory/bigNum';
30
30
  export * from './events/types';
@@ -59,7 +59,7 @@ export * from './util/tps';
59
59
  export * from './util/promiseTimeout';
60
60
  export * from './math/spotBalance';
61
61
  export * from './constants/spotMarkets';
62
- export * from './clearingHouseConfig';
62
+ export * from './driftClientConfig';
63
63
  export * from './dlob/DLOB';
64
64
  export * from './dlob/DLOBNode';
65
65
  export * from './dlob/NodeList';
package/lib/index.js CHANGED
@@ -31,23 +31,23 @@ __exportStar(require("./oracles/switchboardClient"), exports);
31
31
  __exportStar(require("./types"), exports);
32
32
  __exportStar(require("./constants/perpMarkets"), exports);
33
33
  __exportStar(require("./accounts/fetch"), exports);
34
- __exportStar(require("./accounts/webSocketClearingHouseAccountSubscriber"), exports);
34
+ __exportStar(require("./accounts/webSocketDriftClientAccountSubscriber"), exports);
35
35
  __exportStar(require("./accounts/bulkAccountLoader"), exports);
36
36
  __exportStar(require("./accounts/bulkUserSubscription"), exports);
37
37
  __exportStar(require("./accounts/bulkUserStatsSubscription"), exports);
38
- __exportStar(require("./accounts/pollingClearingHouseAccountSubscriber"), exports);
39
- __exportStar(require("./accounts/pollingOracleSubscriber"), exports);
38
+ __exportStar(require("./accounts/pollingDriftClientAccountSubscriber"), exports);
39
+ __exportStar(require("./accounts/pollingOracleAccountSubscriber"), exports);
40
40
  __exportStar(require("./accounts/pollingTokenAccountSubscriber"), exports);
41
41
  __exportStar(require("./accounts/pollingUserAccountSubscriber"), exports);
42
42
  __exportStar(require("./accounts/pollingUserStatsAccountSubscriber"), exports);
43
43
  __exportStar(require("./accounts/types"), exports);
44
44
  __exportStar(require("./addresses/pda"), exports);
45
- __exportStar(require("./admin"), exports);
46
- __exportStar(require("./clearingHouseUser"), exports);
47
- __exportStar(require("./clearingHouseUserConfig"), exports);
48
- __exportStar(require("./clearingHouseUserStats"), exports);
49
- __exportStar(require("./clearingHouseUserStatsConfig"), exports);
50
- __exportStar(require("./clearingHouse"), exports);
45
+ __exportStar(require("./adminClient"), exports);
46
+ __exportStar(require("./user"), exports);
47
+ __exportStar(require("./userConfig"), exports);
48
+ __exportStar(require("./userStats"), exports);
49
+ __exportStar(require("./userStatsConfig"), exports);
50
+ __exportStar(require("./driftClient"), exports);
51
51
  __exportStar(require("./factory/oracleClient"), exports);
52
52
  __exportStar(require("./factory/bigNum"), exports);
53
53
  __exportStar(require("./events/types"), exports);
@@ -82,7 +82,7 @@ __exportStar(require("./util/tps"), exports);
82
82
  __exportStar(require("./util/promiseTimeout"), exports);
83
83
  __exportStar(require("./math/spotBalance"), exports);
84
84
  __exportStar(require("./constants/spotMarkets"), exports);
85
- __exportStar(require("./clearingHouseConfig"), exports);
85
+ __exportStar(require("./driftClientConfig"), exports);
86
86
  __exportStar(require("./dlob/DLOB"), exports);
87
87
  __exportStar(require("./dlob/DLOBNode"), exports);
88
88
  __exportStar(require("./dlob/NodeList"), exports);
@@ -1,11 +1,11 @@
1
1
  /// <reference types="bn.js" />
2
- import { ClearingHouseUser } from '../clearingHouseUser';
2
+ import { User } from '../user';
3
3
  import { PerpMarketAccount, Order } from '../types';
4
4
  import { BN } from '@project-serum/anchor';
5
5
  import { OraclePriceData } from '../oracles/types';
6
- export declare function isOrderRiskIncreasing(user: ClearingHouseUser, order: Order): boolean;
7
- export declare function isOrderRiskIncreasingInSameDirection(user: ClearingHouseUser, order: Order): boolean;
8
- export declare function isOrderReduceOnly(user: ClearingHouseUser, order: Order): boolean;
6
+ export declare function isOrderRiskIncreasing(user: User, order: Order): boolean;
7
+ export declare function isOrderRiskIncreasingInSameDirection(user: User, order: Order): boolean;
8
+ export declare function isOrderReduceOnly(user: User, order: Order): boolean;
9
9
  export declare function standardizeBaseAssetAmount(baseAssetAmount: BN, stepSize: BN): BN;
10
10
  export declare function getLimitPrice(order: Order, oraclePriceData: OraclePriceData, slot: number): BN;
11
11
  export declare function getOptionalLimitPrice(order: Order, oraclePriceData: OraclePriceData, slot: number): BN | undefined;
@@ -10,7 +10,7 @@ function isOrderRiskIncreasing(user, order) {
10
10
  if ((0, types_1.isVariant)(order.status, 'init')) {
11
11
  return false;
12
12
  }
13
- const position = user.getUserPosition(order.marketIndex) ||
13
+ const position = user.getPerpPosition(order.marketIndex) ||
14
14
  user.getEmptyPosition(order.marketIndex);
15
15
  // if no position exists, it's risk increasing
16
16
  if (position.baseAssetAmount.eq(numericConstants_1.ZERO)) {
@@ -37,7 +37,7 @@ function isOrderRiskIncreasingInSameDirection(user, order) {
37
37
  if ((0, types_1.isVariant)(order.status, 'init')) {
38
38
  return false;
39
39
  }
40
- const position = user.getUserPosition(order.marketIndex) ||
40
+ const position = user.getPerpPosition(order.marketIndex) ||
41
41
  user.getEmptyPosition(order.marketIndex);
42
42
  // if no position exists, it's risk increasing
43
43
  if (position.baseAssetAmount.eq(numericConstants_1.ZERO)) {
@@ -59,7 +59,7 @@ function isOrderReduceOnly(user, order) {
59
59
  if ((0, types_1.isVariant)(order.status, 'init')) {
60
60
  return false;
61
61
  }
62
- const position = user.getUserPosition(order.marketIndex) ||
62
+ const position = user.getPerpPosition(order.marketIndex) ||
63
63
  user.getEmptyPosition(order.marketIndex);
64
64
  // if position is long and order is long
65
65
  if (position.baseAssetAmount.gte(numericConstants_1.ZERO) &&
@@ -1,10 +1,10 @@
1
1
  import { PublicKey } from '@solana/web3.js';
2
2
  import { SerumV3FulfillmentConfigAccount } from '../types';
3
- import { ClearingHouse } from '../clearingHouse';
3
+ import { DriftClient } from '../driftClient';
4
4
  export declare class SerumFulfillmentConfigMap {
5
- clearingHouse: ClearingHouse;
5
+ driftClient: DriftClient;
6
6
  map: Map<number, SerumV3FulfillmentConfigAccount>;
7
- constructor(clearingHouse: ClearingHouse);
7
+ constructor(driftClient: DriftClient);
8
8
  add(marketIndex: number, serumMarketAddress: PublicKey): Promise<void>;
9
9
  get(marketIndex: number): SerumV3FulfillmentConfigAccount;
10
10
  }
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SerumFulfillmentConfigMap = void 0;
4
4
  class SerumFulfillmentConfigMap {
5
- constructor(clearingHouse) {
5
+ constructor(driftClient) {
6
6
  this.map = new Map();
7
- this.clearingHouse = clearingHouse;
7
+ this.driftClient = driftClient;
8
8
  }
9
9
  async add(marketIndex, serumMarketAddress) {
10
- const account = await this.clearingHouse.getSerumV3FulfillmentConfig(serumMarketAddress);
10
+ const account = await this.driftClient.getSerumV3FulfillmentConfig(serumMarketAddress);
11
11
  this.map.set(marketIndex, account);
12
12
  }
13
13
  get(marketIndex) {
package/lib/types.d.ts CHANGED
@@ -71,9 +71,12 @@ export declare class ContractTier {
71
71
  static readonly C: {
72
72
  c: {};
73
73
  };
74
- static readonly Speculative: {
74
+ static readonly SPECULATIVE: {
75
75
  speculative: {};
76
76
  };
77
+ static readonly ISOLATED: {
78
+ isolated: {};
79
+ };
77
80
  }
78
81
  export declare class AssetTier {
79
82
  static readonly COLLATERAL: {
@@ -270,6 +273,7 @@ export declare type DepositRecord = {
270
273
  marketWithdrawBalance: BN;
271
274
  marketCumulativeDepositInterest: BN;
272
275
  marketCumulativeBorrowInterest: BN;
276
+ depositRecordId: BN;
273
277
  transferUser?: PublicKey;
274
278
  };
275
279
  export declare type SpotInterestRecord = {
@@ -436,6 +440,9 @@ export declare type LiquidatePerpPnlForDepositRecord = {
436
440
  export declare type PerpBankruptcyRecord = {
437
441
  marketIndex: number;
438
442
  pnl: BN;
443
+ ifPayment: BN;
444
+ clawbackUser: PublicKey | null;
445
+ clawbackUserPayment: BN | null;
439
446
  cumulativeFundingRateDelta: BN;
440
447
  };
441
448
  export declare type SpotBankruptcyRecord = {
@@ -511,6 +518,7 @@ export declare type StateAccount = {
511
518
  export declare type PerpMarketAccount = {
512
519
  status: MarketStatus;
513
520
  contractType: ContractType;
521
+ contractTier: ContractTier;
514
522
  expiryTs: BN;
515
523
  expiryPrice: BN;
516
524
  marketIndex: number;
@@ -522,6 +530,8 @@ export declare type PerpMarketAccount = {
522
530
  marginRatioInitial: number;
523
531
  marginRatioMaintenance: number;
524
532
  nextFillRecordId: BN;
533
+ nextFundingRateRecordId: BN;
534
+ nextCurveRecordId: BN;
525
535
  pnlPool: PoolBalance;
526
536
  liquidatorFee: number;
527
537
  ifLiquidationFee: number;
@@ -598,11 +608,13 @@ export declare type SpotMarketAccount = {
598
608
  depositTokenTwap: BN;
599
609
  borrowTokenTwap: BN;
600
610
  utilizationTwap: BN;
611
+ nextDepositRecordId: BN;
601
612
  orderStepSize: BN;
602
613
  orderTickSize: BN;
603
614
  nextFillRecordId: BN;
604
615
  spotFeePool: PoolBalance;
605
616
  totalSpotFee: BN;
617
+ ordersEnabled: boolean;
606
618
  };
607
619
  export declare type PoolBalance = {
608
620
  scaledBalance: BN;
@@ -617,6 +629,7 @@ export declare type AMM = {
617
629
  lastMarkPriceTwap: BN;
618
630
  lastMarkPriceTwap5min: BN;
619
631
  lastMarkPriceTwapTs: BN;
632
+ lastTradeTs: BN;
620
633
  oracle: PublicKey;
621
634
  oracleSource: OracleSource;
622
635
  historicalOracleData: HistoricalOracleData;
@@ -627,7 +640,10 @@ export declare type AMM = {
627
640
  pegMultiplier: BN;
628
641
  cumulativeFundingRateLong: BN;
629
642
  cumulativeFundingRateShort: BN;
630
- cumulativeFundingRateLp: BN;
643
+ last24hAvgFundingRate: BN;
644
+ lastFundingRateShort: BN;
645
+ lastFundingRateLong: BN;
646
+ totalLiquidationFee: BN;
631
647
  totalFeeMinusDistributions: BN;
632
648
  totalFeeWithdrawn: BN;
633
649
  totalFee: BN;
@@ -644,11 +660,13 @@ export declare type AMM = {
644
660
  baseAssetAmountShort: BN;
645
661
  quoteAssetAmount: BN;
646
662
  terminalQuoteAssetReserve: BN;
663
+ concentrationCoef: BN;
647
664
  feePool: PoolBalance;
648
665
  totalExchangeFee: BN;
649
666
  totalMmFee: BN;
650
667
  netRevenueSinceLastFunding: BN;
651
668
  lastUpdateSlot: BN;
669
+ lastOracleNormalisedPrice: BN;
652
670
  lastOracleValid: boolean;
653
671
  lastBidPriceTwap: BN;
654
672
  lastAskPriceTwap: BN;
@@ -658,9 +676,26 @@ export declare type AMM = {
658
676
  baseAssetAmountPerLp: BN;
659
677
  quoteAssetAmountPerLp: BN;
660
678
  ammJitIntensity: number;
679
+ maxOpenInterest: BN;
661
680
  maxBaseAssetReserve: BN;
662
681
  minBaseAssetReserve: BN;
663
682
  cumulativeSocialLoss: BN;
683
+ quoteBreakEvenAmountLong: BN;
684
+ quoteBreakEvenAmountShort: BN;
685
+ quoteEntryAmountLong: BN;
686
+ quoteEntryAmountShort: BN;
687
+ markStd: BN;
688
+ longIntensityCount: number;
689
+ longIntensityVolume: BN;
690
+ shortIntensityCount: number;
691
+ shortIntensityVolume: BN;
692
+ volume24h: BN;
693
+ minOrderSize: BN;
694
+ maxPositionSize: BN;
695
+ bidBaseAssetReserve: BN;
696
+ bidQuoteAssetReserve: BN;
697
+ askBaseAssetReserve: BN;
698
+ askQuoteAssetReserve: BN;
664
699
  };
665
700
  export declare type PerpPosition = {
666
701
  baseAssetAmount: BN;
@@ -717,6 +752,7 @@ export declare type UserAccount = {
717
752
  settledPerpPnl: BN;
718
753
  totalDeposits: BN;
719
754
  totalWithdraws: BN;
755
+ cumulativePerpFunding: BN;
720
756
  };
721
757
  export declare type SpotPosition = {
722
758
  marketIndex: number;
package/lib/types.js CHANGED
@@ -36,7 +36,8 @@ exports.ContractTier = ContractTier;
36
36
  ContractTier.A = { a: {} };
37
37
  ContractTier.B = { b: {} };
38
38
  ContractTier.C = { c: {} };
39
- ContractTier.Speculative = { speculative: {} };
39
+ ContractTier.SPECULATIVE = { speculative: {} };
40
+ ContractTier.ISOLATED = { isolated: {} };
40
41
  class AssetTier {
41
42
  }
42
43
  exports.AssetTier = AssetTier;
@@ -3,23 +3,23 @@
3
3
  import { PublicKey } from '@solana/web3.js';
4
4
  import { EventEmitter } from 'events';
5
5
  import StrictEventEmitter from 'strict-event-emitter-types';
6
- import { ClearingHouse } from './clearingHouse';
7
- import { MarginCategory, Order, UserAccount, PerpPosition } from './types';
6
+ import { DriftClient } from './driftClient';
7
+ import { MarginCategory, Order, UserAccount, PerpPosition, SpotPosition } from './types';
8
8
  import { UserAccountSubscriber, UserAccountEvents, DataAndSlot } from './accounts/types';
9
9
  import { PositionDirection, BN, SpotMarketAccount } from '.';
10
10
  import { OraclePriceData } from './oracles/types';
11
- import { ClearingHouseUserConfig } from './clearingHouseUserConfig';
12
- export declare class ClearingHouseUser {
13
- clearingHouse: ClearingHouse;
11
+ import { UserConfig } from './userConfig';
12
+ export declare class User {
13
+ driftClient: DriftClient;
14
14
  userAccountPublicKey: PublicKey;
15
15
  accountSubscriber: UserAccountSubscriber;
16
16
  _isSubscribed: boolean;
17
17
  eventEmitter: StrictEventEmitter<EventEmitter, UserAccountEvents>;
18
18
  get isSubscribed(): boolean;
19
19
  set isSubscribed(val: boolean);
20
- constructor(config: ClearingHouseUserConfig);
20
+ constructor(config: UserConfig);
21
21
  /**
22
- * Subscribe to ClearingHouseUser state accounts
22
+ * Subscribe to User state accounts
23
23
  * @returns SusbcriptionSuccess result
24
24
  */
25
25
  subscribe(): Promise<boolean>;
@@ -31,11 +31,17 @@ export declare class ClearingHouseUser {
31
31
  getUserAccount(): UserAccount;
32
32
  getUserAccountAndSlot(): DataAndSlot<UserAccount> | undefined;
33
33
  /**
34
- * Gets the user's current position for a given market. If the user has no position returns undefined
34
+ * Gets the user's current position for a given perp market. If the user has no position returns undefined
35
35
  * @param marketIndex
36
- * @returns userPosition
36
+ * @returns userPerpPosition
37
37
  */
38
- getUserPosition(marketIndex: number): PerpPosition | undefined;
38
+ getPerpPosition(marketIndex: number): PerpPosition | undefined;
39
+ /**
40
+ * Gets the user's current position for a given spot market. If the user has no position returns undefined
41
+ * @param marketIndex
42
+ * @returns userSpotPosition
43
+ */
44
+ getSpotPosition(marketIndex: number): SpotPosition | undefined;
39
45
  getEmptyPosition(marketIndex: number): PerpPosition;
40
46
  getClonedPosition(position: PerpPosition): PerpPosition;
41
47
  /**