@drift-labs/sdk-browser 2.161.0-beta.2 → 2.161.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 2.161.0-beta.2
1
+ 2.161.0-beta.4
@@ -1362,6 +1362,17 @@ exports.MainnetPerpMarkets = [
1362
1362
  pythFeedId: '0xc0c83f00c39165892d55dcd17ade2191e289697e2ac132d9ab721e20834e2a9e',
1363
1363
  pythLazerId: 2921,
1364
1364
  },
1365
+ {
1366
+ fullName: 'Backpack',
1367
+ category: ['Exchange'],
1368
+ symbol: 'BP-PERP',
1369
+ baseAssetSymbol: 'BP',
1370
+ marketIndex: 85,
1371
+ oracle: new web3_js_1.PublicKey('BrwBRpuJZzqa1VufrgfT3dNy44XkL31xmbS8PUNrsR5z'),
1372
+ launchTs: 1774454728000,
1373
+ oracleSource: types_1.OracleSource.PYTH_LAZER,
1374
+ pythLazerId: 3076,
1375
+ },
1365
1376
  ];
1366
1377
  exports.PerpMarkets = {
1367
1378
  devnet: exports.DevnetPerpMarkets,
@@ -64,6 +64,10 @@ export declare class User {
64
64
  getEmptyPosition(marketIndex: number): PerpPosition;
65
65
  isPositionEmpty(position: PerpPosition): boolean;
66
66
  getIsolatePerpPositionTokenAmount(perpMarketIndex: number): BN;
67
+ /**
68
+ * Returns the total USD value of deposits across all isolated perp positions.
69
+ */
70
+ getTotalIsolatedPositionDeposits(): BN;
67
71
  getClonedPosition(position: PerpPosition): PerpPosition;
68
72
  getOrderForUserAccount(userAccount: UserAccount, orderId: number): Order | undefined;
69
73
  /**
@@ -207,6 +207,23 @@ class User {
207
207
  return (0, spotBalance_2.getTokenAmount)((_a = perpPosition.isolatedPositionScaledBalance) !== null && _a !== void 0 ? _a : numericConstants_1.ZERO, //TODO remove ? later
208
208
  spotMarket, types_2.SpotBalanceType.DEPOSIT);
209
209
  }
210
+ /**
211
+ * Returns the total USD value of deposits across all isolated perp positions.
212
+ */
213
+ getTotalIsolatedPositionDeposits() {
214
+ return this.getActivePerpPositions().reduce((total, perpPosition) => {
215
+ var _a;
216
+ if (!((_a = perpPosition.isolatedPositionScaledBalance) === null || _a === void 0 ? void 0 : _a.gt(numericConstants_1.ZERO))) {
217
+ return total;
218
+ }
219
+ const perpMarket = this.driftClient.getPerpMarketAccount(perpPosition.marketIndex);
220
+ const quoteSpotMarket = this.driftClient.getSpotMarketAccount(perpMarket.quoteSpotMarketIndex);
221
+ const quoteOraclePriceData = this.getOracleDataForSpotMarket(perpMarket.quoteSpotMarketIndex);
222
+ const strictOracle = new strictOraclePrice_1.StrictOraclePrice(quoteOraclePriceData.price, quoteOraclePriceData.twap);
223
+ const tokenAmount = (0, spotBalance_2.getTokenAmount)(perpPosition.isolatedPositionScaledBalance, quoteSpotMarket, types_2.SpotBalanceType.DEPOSIT);
224
+ return total.add((0, spotBalance_1.getStrictTokenValue)(tokenAmount, quoteSpotMarket.decimals, strictOracle));
225
+ }, numericConstants_1.ZERO);
226
+ }
210
227
  getClonedPosition(position) {
211
228
  const clonedPosition = Object.assign({}, position);
212
229
  return clonedPosition;
@@ -884,10 +901,13 @@ class User {
884
901
  const perpLiability = this.getTotalPerpPositionLiability(marginCategory, undefined, includeOpenOrders);
885
902
  const perpPnl = this.getUnrealizedPNL(true, undefined, marginCategory);
886
903
  const { totalAssetValue: spotAssetValue, totalLiabilityValue: spotLiabilityValue, } = this.getSpotMarketAssetAndLiabilityValue(undefined, marginCategory, undefined, includeOpenOrders);
904
+ const isolatedDeposits = marginCategory === undefined
905
+ ? this.getTotalIsolatedPositionDeposits()
906
+ : numericConstants_1.ZERO;
887
907
  return {
888
908
  perpLiabilityValue: perpLiability,
889
909
  perpPnl,
890
- spotAssetValue,
910
+ spotAssetValue: spotAssetValue.add(isolatedDeposits),
891
911
  spotLiabilityValue,
892
912
  };
893
913
  }
@@ -924,12 +944,17 @@ class User {
924
944
  return this.getTotalPerpPositionLiability(marginCategory, undefined, true).add(this.getSpotMarketLiabilityValue(undefined, marginCategory, undefined, true));
925
945
  }
926
946
  getTotalAssetValue(marginCategory) {
927
- return this.getSpotMarketAssetValue(undefined, marginCategory, true).add(this.getUnrealizedPNL(true, undefined, marginCategory));
947
+ const value = this.getSpotMarketAssetValue(undefined, marginCategory, true).add(this.getUnrealizedPNL(true, undefined, marginCategory));
948
+ if (marginCategory === undefined) {
949
+ return value.add(this.getTotalIsolatedPositionDeposits());
950
+ }
951
+ return value;
928
952
  }
929
953
  getNetUsdValue() {
930
954
  const netSpotValue = this.getNetSpotMarketValue();
931
955
  const unrealizedPnl = this.getUnrealizedPNL(true, undefined, undefined);
932
- return netSpotValue.add(unrealizedPnl);
956
+ const isolatedDeposits = this.getTotalIsolatedPositionDeposits();
957
+ return netSpotValue.add(unrealizedPnl).add(isolatedDeposits);
933
958
  }
934
959
  /**
935
960
  * Calculates the all time P&L of the user.
@@ -1 +1 @@
1
- {"version":3,"file":"perpMarkets.d.ts","sourceRoot":"","sources":["../../../src/constants/perpMarkets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EA0X/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EA6iChD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE;KAAG,GAAG,IAAI,QAAQ,GAAG,gBAAgB,EAAE;CAGhE,CAAC"}
1
+ {"version":3,"file":"perpMarkets.d.ts","sourceRoot":"","sources":["../../../src/constants/perpMarkets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,gBAAgB,EA0X/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EAwjChD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE;KAAG,GAAG,IAAI,QAAQ,GAAG,gBAAgB,EAAE;CAGhE,CAAC"}
@@ -1362,6 +1362,17 @@ exports.MainnetPerpMarkets = [
1362
1362
  pythFeedId: '0xc0c83f00c39165892d55dcd17ade2191e289697e2ac132d9ab721e20834e2a9e',
1363
1363
  pythLazerId: 2921,
1364
1364
  },
1365
+ {
1366
+ fullName: 'Backpack',
1367
+ category: ['Exchange'],
1368
+ symbol: 'BP-PERP',
1369
+ baseAssetSymbol: 'BP',
1370
+ marketIndex: 85,
1371
+ oracle: new web3_js_1.PublicKey('BrwBRpuJZzqa1VufrgfT3dNy44XkL31xmbS8PUNrsR5z'),
1372
+ launchTs: 1774454728000,
1373
+ oracleSource: types_1.OracleSource.PYTH_LAZER,
1374
+ pythLazerId: 3076,
1375
+ },
1365
1376
  ];
1366
1377
  exports.PerpMarkets = {
1367
1378
  devnet: exports.DevnetPerpMarkets,
@@ -64,6 +64,10 @@ export declare class User {
64
64
  getEmptyPosition(marketIndex: number): PerpPosition;
65
65
  isPositionEmpty(position: PerpPosition): boolean;
66
66
  getIsolatePerpPositionTokenAmount(perpMarketIndex: number): BN;
67
+ /**
68
+ * Returns the total USD value of deposits across all isolated perp positions.
69
+ */
70
+ getTotalIsolatedPositionDeposits(): BN;
67
71
  getClonedPosition(position: PerpPosition): PerpPosition;
68
72
  getOrderForUserAccount(userAccount: UserAccount, orderId: number): Order | undefined;
69
73
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/user.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,kBAAkB,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EACN,eAAe,EACf,gBAAgB,EAEhB,cAAc,EACd,KAAK,EACL,iBAAiB,EACjB,YAAY,EAEZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,yBAAyB,EACzB,MAAM,SAAS,CAAC;AA0BjB,OAAO,EACN,WAAW,EACX,iBAAiB,EACjB,qBAAqB,EACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAoBvC,OAAO,EACN,UAAU,EACV,iBAAiB,EAGjB,iBAAiB,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAgBxC,OAAO,EAAqB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EACN,yBAAyB,EACzB,iBAAiB,EAEjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;AAE9C,qBAAa,IAAI;IAChB,WAAW,EAAE,WAAW,CAAC;IACzB,oBAAoB,EAAE,SAAS,CAAC;IAChC,iBAAiB,EAAE,qBAAqB,CAAC;IACzC,aAAa,UAAS;IACtB,YAAY,EAAE,kBAAkB,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAElE,IAAW,YAAY,IAIM,OAAO,CAFnC;IAED,IAAW,YAAY,CAAC,GAAG,EAAE,OAAO,EAEnC;gBAEkB,MAAM,EAAE,UAAU;IAwDrC;;;OAGG;IACU,SAAS,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnE;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC,cAAc,IAAI,WAAW;IAIvB,mBAAmB,IAAI,OAAO,CAAC,WAAW,CAAC;IAKjD,qBAAqB,IAAI,WAAW,CAAC,WAAW,CAAC,GAAG,SAAS;IAI7D,6BAA6B,CACnC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,GACjB,YAAY,GAAG,SAAS;IAM3B;;;;OAIG;IACI,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAK9D,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY;IAQzD,sBAAsB,CAC5B,WAAW,EAAE,MAAM,GACjB,WAAW,CAAC,YAAY,GAAG,SAAS,CAAC;IAYjC,6BAA6B,CACnC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,GACjB,YAAY,GAAG,SAAS;IAM3B;;;;OAIG;IACI,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAK9D,sBAAsB,CAC5B,WAAW,EAAE,MAAM,GACjB,WAAW,CAAC,YAAY,GAAG,SAAS,CAAC;IAYxC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY;IAYvD;;;;;OAKG;IACI,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,EAAE;IAgBvC,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY;IAsBnD,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAIhD,iCAAiC,CAAC,eAAe,EAAE,MAAM,GAAG,EAAE;IAiB9D,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY;IAKvD,sBAAsB,CAC5B,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,MAAM,GACb,KAAK,GAAG,SAAS;IAIpB;;;OAGG;IACI,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAK5C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC;IAShE,8BAA8B,CACpC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,MAAM,GACjB,KAAK,GAAG,SAAS;IAMpB;;;OAGG;IACI,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAK7D,4BAA4B,CAClC,WAAW,EAAE,MAAM,GACjB,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC;IAY1B,2BAA2B,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,KAAK,EAAE;IAM/D,aAAa,IAAI,KAAK,EAAE;IAKxB,oBAAoB,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;IAS5C,uBAAuB,IAAI,SAAS;IAI9B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAQvC;;;;OAIG;IACI,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;IASpD;;;OAGG;IACI,kBAAkB,CACxB,WAAW,EAAE,MAAM,EACnB,gBAAgB,KAAO,EACvB,qBAAqB,MAAY,EACjC,cAAc,MAAY,EAC1B,YAAY,GAAE,UAAU,GAAG,OAAiB,GAC1C,EAAE;IAyDL,sDAAsD,CACrD,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,EAAE,EAClB,eAAe,EAAE,EAAE,EACnB,qBAAqB,MAAY,EACjC,wBAAwB,MAAY,GAClC,EAAE;IAgBL;;;OAGG;IACI,iBAAiB,CACvB,cAAc,GAAE,cAA0B,EAC1C,qBAAqB,UAAQ,EAC7B,eAAe,CAAC,EAAE,MAAM,GACtB,EAAE;IAkBL;;OAEG;IACI,oBAAoB,CAC1B,cAAc,EAAE,cAAc,EAC9B,iBAAiB,CAAC,EAAE,EAAE,EACtB,MAAM,CAAC,EAAE,OAAO,EAChB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,oBAAoB,CAAC,EAAE,OAAO,GAC5B,EAAE;IAEL;;;;;;;;;;;OAWG;IACI,oBAAoB,CAC1B,cAAc,EAAE,cAAc,EAC9B,iBAAiB,CAAC,EAAE,EAAE,EACtB,MAAM,CAAC,EAAE,OAAO,EAChB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,oBAAoB,CAAC,EAAE,OAAO,EAC9B,eAAe,CAAC,EAAE,MAAM,GACtB,EAAE;IA6CL;;OAEG;IACI,2BAA2B,CACjC,qBAAqB,UAAQ,EAC7B,eAAe,CAAC,EAAE,MAAM,GACtB,EAAE;IAWL;;OAEG;IACI,+BAA+B,CACrC,iBAAiB,CAAC,EAAE,EAAE,EACtB,eAAe,CAAC,EAAE,MAAM,GACtB,EAAE;IAWE,oCAAoC,CAC1C,WAAW,EAAE,WAAW,GACtB,YAAY,EAAE;IAUV,sBAAsB,IAAI,YAAY,EAAE;IAIxC,6BAA6B,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;IAW5D,oCAAoC,CAC1C,WAAW,EAAE,WAAW,GACtB,YAAY,EAAE;IAMV,sBAAsB,IAAI,YAAY,EAAE;IAIxC,6BAA6B,IAAI,WAAW,CAAC,YAAY,EAAE,CAAC;IAWnE;;;OAGG;IACI,gBAAgB,CACtB,WAAW,CAAC,EAAE,OAAO,EACrB,WAAW,CAAC,EAAE,MAAM,EACpB,wBAAwB,CAAC,EAAE,cAAc,EACzC,MAAM,UAAQ,EACd,iBAAiB,CAAC,EAAE,EAAE,GACpB,EAAE;IAwEL;;;OAGG;IACI,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,EAAE;IAajD,YAAY,CAClB,GAAG,EAAE,EAAE,EACP,cAAc,UAAO,EACrB,gBAAgB,UAAO,EACvB,cAAc,CAAC,EAAE,SAAS,GACxB;QACF,WAAW,EAAE,EAAE,CAAC;QAChB,UAAU,EAAE,EAAE,CAAC;QACf,YAAY,EAAE,EAAE,CAAC;QACjB,SAAS,EAAE,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,CAAC;QACd,aAAa,EAAE,EAAE,CAAC;KAClB;IA0HM,mCAAmC,CACzC,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,EAAE,EACtB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,MAAM,UAAQ,EACd,GAAG,CAAC,EAAE,EAAE,GACN;QAAE,eAAe,EAAE,EAAE,CAAC;QAAC,mBAAmB,EAAE,EAAE,CAAA;KAAE;IAwL5C,2BAA2B,CACjC,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,EAAE,EACtB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,MAAM,UAAQ,EACd,GAAG,CAAC,EAAE,EAAE,GACN,EAAE;IAYL,qBAAqB,CACpB,WAAW,EAAE,EAAE,EACf,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,EAAE,GACpB,EAAE;IAWE,uBAAuB,CAC7B,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,OAAO,EAC3B,MAAM,UAAQ,EACd,GAAG,CAAC,EAAE,EAAE,GACN,EAAE;IAYL,iBAAiB,CAChB,WAAW,EAAE,EAAE,EACf,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,CAAC,EAAE,cAAc,GAC7B,EAAE;IAUE,oBAAoB,CAC1B,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,OAAO,EAC3B,MAAM,UAAQ,EACd,GAAG,CAAC,EAAE,EAAE,GACN,EAAE;IAcE,qBAAqB,CAAC,wBAAwB,CAAC,EAAE,cAAc,GAAG,EAAE;IAU3E;;;OAGG;IACI,kBAAkB,CACxB,cAAc,GAAE,cAA0B,EAC1C,MAAM,UAAQ,EACd,iBAAiB,UAAO,EACxB,iBAAiB,CAAC,EAAE,EAAE,EACtB,eAAe,CAAC,EAAE,MAAM,GACtB,EAAE;IA8BE,oBAAoB,IAAI,GAAG,CAAC,MAAM,GAAG,OAAO,EAAE,EAAE,CAAC;IAwBxD;;;OAGG;IACI,SAAS,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM;IAkDlD,sCAAsC,CACrC,YAAY,EAAE,YAAY,EAC1B,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,EAAE,EACtB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,MAAM,UAAQ,EACd,oBAAoB,MAAY,GAC9B,EAAE;IA4FL;;;OAGG;IACI,2BAA2B,CACjC,WAAW,EAAE,MAAM,EACnB,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,EAAE,EACtB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,MAAM,UAAQ,GACZ,EAAE;IAWL;;;OAGG;IACH,6BAA6B,CAC5B,cAAc,CAAC,EAAE,cAAc,EAC/B,iBAAiB,CAAC,EAAE,EAAE,EACtB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,MAAM,UAAQ,EACd,oBAAoB,MAAY,GAC9B,EAAE;IAiBL;;;OAGG;IACI,oBAAoB,CAC1B,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,EAC/C,iBAAiB,UAAQ,GACvB,EAAE;IAaL;;;OAGG;IACI,qBAAqB,CAC3B,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,eAAe,EAChC,iBAAiB,UAAQ,GACvB,EAAE;IAqBE,eAAe,CACrB,eAAe,EAAE,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,GACpD,iBAAiB,GAAG,SAAS;IAUhC;;;OAGG;IACI,mCAAmC,CACzC,QAAQ,EAAE,YAAY,EACtB,aAAa,CAAC,EAAE,EAAE,EAClB,WAAW,UAAQ,GACjB,CAAC,EAAE,EAAE,EAAE,CAAC;IAsDX;;;OAGG;IACI,WAAW,CAAC,iBAAiB,UAAO,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,EAAE;IAM1E,+BAA+B,CAAC,EAC/B,kBAAkB,EAClB,OAAO,EACP,cAAc,EACd,kBAAkB,GAClB,EAAE;QACF,kBAAkB,EAAE,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,CAAC;QACZ,cAAc,EAAE,EAAE,CAAC;QACnB,kBAAkB,EAAE,EAAE,CAAC;KACvB,GAAG,EAAE;IAYN,qBAAqB,CACpB,iBAAiB,UAAO,EACxB,cAAc,GAAE,cAA0B,EAC1C,eAAe,CAAC,EAAE,MAAM,GACtB;QACF,kBAAkB,EAAE,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,CAAC;QACZ,cAAc,EAAE,EAAE,CAAC;QACnB,kBAAkB,EAAE,EAAE,CAAC;KACvB;IA+ED,qBAAqB,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,OAAO;IAmCpE,qCAAqC;IAerC,sBAAsB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,EAAE;IAe3D,kBAAkB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,EAAE;IAMvD,cAAc,IAAI,EAAE;IAMpB;;;;OAIG;IACH,kBAAkB,IAAI,EAAE;IAUxB;;;;;;;OAOG;IACI,qBAAqB,CAC3B,eAAe,EAAE,MAAM,EACvB,eAAe,GAAE,cAA0B,EAC3C,IAAI,UAAQ,EACZ,qBAAqB,MAAY,GAC/B,EAAE;IA+CL;;;;;OAKG;IACI,qBAAqB,CAC3B,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,iBAAiB,GAC1B,EAAE;IAmFL;;;OAGG;IACI,cAAc,IAAI,EAAE;IAgBpB,eAAe,IAAI,yBAAyB,GAAG;QACrD,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;KAC1D;IAsBD;;;;;OAKG;IACI,sBAAsB,CAC5B,UAAU,CAAC,EAAE,iBAAiB,GAC5B,GAAG,CAAC,OAAO,GAAG,MAAM,EAAE,yBAAyB,CAAC;IAqC5C,iBAAiB,IAAI,OAAO;IAO5B,4BAA4B,IAAI,OAAO;IAQ9C,2FAA2F;IACpF,0BAA0B,CAAC,UAAU,CAAC,EAAE,iBAAiB,GAAG,OAAO;IAKnE,kCAAkC,IAAI,OAAO;IAS7C,iCAAiC,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAY1E,6GAA6G;IACtG,gCAAgC,CACtC,UAAU,CAAC,EAAE,iBAAiB,GAC5B,MAAM,EAAE;IAWJ,qCAAqC,CAC3C,yBAAyB,EAAE,yBAAyB,GAClD,OAAO;IAMH,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO;IAItC,UAAU,IAAI,OAAO;IAIrB,kBAAkB,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO;IAQlE;;;OAGG;IACI,2BAA2B,IAAI,OAAO;IAyB7C;;;;OAIG;IACI,oBAAoB,CAC1B,WAAW,EAAE,MAAM,EACnB,sBAAsB,GAAE,EAAS,GAC/B,EAAE;IAsFL;;;;;;;;;OASG;IACI,gBAAgB,CACtB,WAAW,EAAE,MAAM,EACnB,sBAAsB,GAAE,EAAS,EACjC,mBAAmB,GAAE,EAAS,EAC9B,cAAc,GAAE,cAA8B,EAC9C,iBAAiB,UAAQ,EACzB,gBAAgB,KAAO,EACvB,oBAAoB,UAAQ,EAC5B,UAAU,CAAC,EAAE,UAAU,GACrB,EAAE;IAiKL,sCAAsC,CACrC,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,EAAE,EACf,YAAY,EAAE,YAAY,EAC1B,sBAAsB,EAAE,EAAE,EAC1B,mBAAmB,EAAE,EAAE,EACvB,iBAAiB,EAAE,OAAO,EAC1B,oBAAoB,MAAY,EAChC,cAAc,GAAE,cAA8B,GAC5C,EAAE;IAoFL,mCAAmC,CAClC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,sBAAsB,EAAE,EAAE,EAC1B,WAAW,EAAE,EAAE,EACf,cAAc,GAAE,cAA8B,EAC9C,iBAAiB,UAAQ,EACzB,oBAAoB,MAAY,GAC9B,EAAE,GAAG,SAAS;IAoEjB,mCAAmC,CAClC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,EAAE,EACrB,cAAc,GAAE,cAA8B,GAC5C,EAAE;IA8BL;;;;;OAKG;IACI,0BAA0B,CAChC,mBAAmB,EAAE,MAAM,EAC3B,gBAAgB,EAAE,EAAE,EACpB,mBAAmB,GAAE,EAAS,GAC5B,EAAE;IAoBE,6BAA6B,CACnC,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,EAAE,EACZ,aAAa,CAAC,EAAE,EAAE,EAClB,wBAAwB,CAAC,EAAE,MAAM,GAC/B,EAAE;IAeE,oCAAoC,CAC1C,iBAAiB,EAAE,MAAM,EACzB,QAAQ,EAAE,EAAE,EACZ,eAAe,EAAE,MAAM,EACvB,wBAAwB,CAAC,EAAE,MAAM,GAC/B,EAAE;IAeL;;;;;;;;OAQG;IACI,0BAA0B,CAChC,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,iBAAiB,EAC5B,IAAI,UAAQ,EACZ,qBAAqB,MAAY,EACjC,cAAc,MAAY,EAC1B,YAAY,GAAE,UAAU,GAAG,OAAiB,GAC1C;QAAE,SAAS,EAAE,EAAE,CAAC;QAAC,qBAAqB,EAAE,EAAE,CAAA;KAAE;IAmJ/C;;;;;;;;OAQG;IACI,0BAA0B,CAChC,iBAAiB,EAAE,MAAM,EACzB,SAAS,EAAE,iBAAiB,EAC5B,sBAAsB,CAAC,EAAE,EAAE,EAC3B,yBAAyB,CAAC,EAAE,EAAE,GAC5B,EAAE;IAyEL;;;;;;;;OAQG;IACI,gBAAgB,CAAC,EACvB,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAqB,GACrB,EAAE;QACF,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;QACrC,cAAc,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG;QAAE,QAAQ,EAAE,EAAE,CAAC;QAAC,SAAS,EAAE,EAAE,CAAC;QAAC,QAAQ,EAAE,EAAE,CAAA;KAAE;IA0M1C,0BAA0B,CAChC,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,EAAE,EACf,MAAM,EAAE,iBAAiB,GACvB,YAAY;IA8Cf,+CAA+C,CAC9C,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,GAClC,EAAE;IAiBL,yCAAyC,CACxC,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,GAClC;QACF,eAAe,EAAE,EAAE,CAAC;QACpB,mBAAmB,EAAE,EAAE,CAAC;KACxB;IAiCD;;;;;;OAMG;IACI,wBAAwB,CAAC,EAC/B,aAAa,EACb,cAAc,EACd,QAAQ,EACR,SAAS,GACT,EAAE;QACF,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,QAAQ,EAAE,EAAE,CAAC;QACb,SAAS,EAAE,EAAE,CAAC;KACd,GAAG,EAAE;IAuFN;;;;;;;;OAQG;IACI,8BAA8B,CACpC,iBAAiB,EAAE,MAAM,EACzB,gBAAgB,EAAE,UAAU,EAC5B,gBAAgB,EAAE,EAAE,EACpB,SAAS,EAAE,iBAAiB,EAC5B,iBAAiB,UAAO,GACtB,EAAE;IAyKE,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE;IAoEtD;;;;OAIG;IACI,0BAA0B,CAChC,WAAW,EAAE,EAAE,EACf,WAAW,CAAC,EAAE,MAAM,EACpB,wBAAwB,CAAC,EAAE,OAAO,GAChC,EAAE;IAoBL;;;;;OAKG;IACI,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,EAAE;IAwFjE,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG;QACpD,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,EAAE,CAAC;QAChB,aAAa,EAAE,EAAE,CAAC;QAClB,gBAAgB,EAAE,EAAE,CAAC;KACrB;IAkDM,WAAW,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO;IAuD9B,YAAY,CAClB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,GAAG,CAAC,EAAE,EAAE,GACN;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IAkEnC,cAAc,IAAI;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAgCxD,qBAAqB,CAAC,EAC5B,cAAc,EACd,YAAY,EACZ,eAAe,EACf,oBAAoB,EACpB,iBAAwB,GACxB,EAAE;QACF,cAAc,EAAE,cAAc,CAAC;QAC/B,YAAY,EAAE,YAAY,CAAC;QAC3B,eAAe,CAAC,EAAE,eAAe,CAAC;QAClC,oBAAoB,CAAC,EAAE,eAAe,CAAC;QACvC,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC5B,GAAG,eAAe;IAiEZ,mBAAmB,CAAC,EAC1B,cAAc,GACd,EAAE;QACF,cAAc,EAAE,cAAc,CAAC;KAC/B,GAAG,gBAAgB;IAiLpB;;;;OAIG;IACH,OAAO,CAAC,wCAAwC;IA0BhD,OAAO,CAAC,4BAA4B;IAIpC,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,0BAA0B;IAIlC;;OAEG;IACI,kBAAkB,IAAI;QAC5B,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,mBAAmB,EAAE,MAAM,EAAE,CAAC;KAC9B;IAeD;;;;OAIG;IACI,oBAAoB,CAC1B,cAAc,GAAE,cAA0B,EAC1C,IAAI,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,oBAAoB,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC;KACjD,GACC,iBAAiB;IAmSb,sBAAsB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO;CAGlE"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/user.ts"],"names":[],"mappings":"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"}
package/lib/node/user.js CHANGED
@@ -207,6 +207,23 @@ class User {
207
207
  return (0, spotBalance_2.getTokenAmount)((_a = perpPosition.isolatedPositionScaledBalance) !== null && _a !== void 0 ? _a : numericConstants_1.ZERO, //TODO remove ? later
208
208
  spotMarket, types_2.SpotBalanceType.DEPOSIT);
209
209
  }
210
+ /**
211
+ * Returns the total USD value of deposits across all isolated perp positions.
212
+ */
213
+ getTotalIsolatedPositionDeposits() {
214
+ return this.getActivePerpPositions().reduce((total, perpPosition) => {
215
+ var _a;
216
+ if (!((_a = perpPosition.isolatedPositionScaledBalance) === null || _a === void 0 ? void 0 : _a.gt(numericConstants_1.ZERO))) {
217
+ return total;
218
+ }
219
+ const perpMarket = this.driftClient.getPerpMarketAccount(perpPosition.marketIndex);
220
+ const quoteSpotMarket = this.driftClient.getSpotMarketAccount(perpMarket.quoteSpotMarketIndex);
221
+ const quoteOraclePriceData = this.getOracleDataForSpotMarket(perpMarket.quoteSpotMarketIndex);
222
+ const strictOracle = new strictOraclePrice_1.StrictOraclePrice(quoteOraclePriceData.price, quoteOraclePriceData.twap);
223
+ const tokenAmount = (0, spotBalance_2.getTokenAmount)(perpPosition.isolatedPositionScaledBalance, quoteSpotMarket, types_2.SpotBalanceType.DEPOSIT);
224
+ return total.add((0, spotBalance_1.getStrictTokenValue)(tokenAmount, quoteSpotMarket.decimals, strictOracle));
225
+ }, numericConstants_1.ZERO);
226
+ }
210
227
  getClonedPosition(position) {
211
228
  const clonedPosition = Object.assign({}, position);
212
229
  return clonedPosition;
@@ -884,10 +901,13 @@ class User {
884
901
  const perpLiability = this.getTotalPerpPositionLiability(marginCategory, undefined, includeOpenOrders);
885
902
  const perpPnl = this.getUnrealizedPNL(true, undefined, marginCategory);
886
903
  const { totalAssetValue: spotAssetValue, totalLiabilityValue: spotLiabilityValue, } = this.getSpotMarketAssetAndLiabilityValue(undefined, marginCategory, undefined, includeOpenOrders);
904
+ const isolatedDeposits = marginCategory === undefined
905
+ ? this.getTotalIsolatedPositionDeposits()
906
+ : numericConstants_1.ZERO;
887
907
  return {
888
908
  perpLiabilityValue: perpLiability,
889
909
  perpPnl,
890
- spotAssetValue,
910
+ spotAssetValue: spotAssetValue.add(isolatedDeposits),
891
911
  spotLiabilityValue,
892
912
  };
893
913
  }
@@ -924,12 +944,17 @@ class User {
924
944
  return this.getTotalPerpPositionLiability(marginCategory, undefined, true).add(this.getSpotMarketLiabilityValue(undefined, marginCategory, undefined, true));
925
945
  }
926
946
  getTotalAssetValue(marginCategory) {
927
- return this.getSpotMarketAssetValue(undefined, marginCategory, true).add(this.getUnrealizedPNL(true, undefined, marginCategory));
947
+ const value = this.getSpotMarketAssetValue(undefined, marginCategory, true).add(this.getUnrealizedPNL(true, undefined, marginCategory));
948
+ if (marginCategory === undefined) {
949
+ return value.add(this.getTotalIsolatedPositionDeposits());
950
+ }
951
+ return value;
928
952
  }
929
953
  getNetUsdValue() {
930
954
  const netSpotValue = this.getNetSpotMarketValue();
931
955
  const unrealizedPnl = this.getUnrealizedPNL(true, undefined, undefined);
932
- return netSpotValue.add(unrealizedPnl);
956
+ const isolatedDeposits = this.getTotalIsolatedPositionDeposits();
957
+ return netSpotValue.add(unrealizedPnl).add(isolatedDeposits);
933
958
  }
934
959
  /**
935
960
  * Calculates the all time P&L of the user.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk-browser",
3
- "version": "2.161.0-beta.2",
3
+ "version": "2.161.0-beta.4",
4
4
  "main": "lib/node/index.js",
5
5
  "types": "lib/node/index.d.ts",
6
6
  "module": "./lib/browser/index.js",
@@ -1465,6 +1465,17 @@ export const MainnetPerpMarkets: PerpMarketConfig[] = [
1465
1465
  '0xc0c83f00c39165892d55dcd17ade2191e289697e2ac132d9ab721e20834e2a9e',
1466
1466
  pythLazerId: 2921,
1467
1467
  },
1468
+ {
1469
+ fullName: 'Backpack',
1470
+ category: ['Exchange'],
1471
+ symbol: 'BP-PERP',
1472
+ baseAssetSymbol: 'BP',
1473
+ marketIndex: 85,
1474
+ oracle: new PublicKey('BrwBRpuJZzqa1VufrgfT3dNy44XkL31xmbS8PUNrsR5z'),
1475
+ launchTs: 1774454728000,
1476
+ oracleSource: OracleSource.PYTH_LAZER,
1477
+ pythLazerId: 3076,
1478
+ },
1468
1479
  ];
1469
1480
 
1470
1481
  export const PerpMarkets: { [key in DriftEnv]: PerpMarketConfig[] } = {
package/src/user.ts CHANGED
@@ -375,6 +375,41 @@ export class User {
375
375
  );
376
376
  }
377
377
 
378
+ /**
379
+ * Returns the total USD value of deposits across all isolated perp positions.
380
+ */
381
+ public getTotalIsolatedPositionDeposits(): BN {
382
+ return this.getActivePerpPositions().reduce((total, perpPosition) => {
383
+ if (!perpPosition.isolatedPositionScaledBalance?.gt(ZERO)) {
384
+ return total;
385
+ }
386
+
387
+ const perpMarket = this.driftClient.getPerpMarketAccount(
388
+ perpPosition.marketIndex
389
+ );
390
+ const quoteSpotMarket = this.driftClient.getSpotMarketAccount(
391
+ perpMarket.quoteSpotMarketIndex
392
+ );
393
+ const quoteOraclePriceData = this.getOracleDataForSpotMarket(
394
+ perpMarket.quoteSpotMarketIndex
395
+ );
396
+ const strictOracle = new StrictOraclePrice(
397
+ quoteOraclePriceData.price,
398
+ quoteOraclePriceData.twap
399
+ );
400
+
401
+ const tokenAmount = getTokenAmount(
402
+ perpPosition.isolatedPositionScaledBalance,
403
+ quoteSpotMarket,
404
+ SpotBalanceType.DEPOSIT
405
+ );
406
+
407
+ return total.add(
408
+ getStrictTokenValue(tokenAmount, quoteSpotMarket.decimals, strictOracle)
409
+ );
410
+ }, ZERO);
411
+ }
412
+
378
413
  public getClonedPosition(position: PerpPosition): PerpPosition {
379
414
  const clonedPosition = Object.assign({}, position);
380
415
  return clonedPosition;
@@ -1781,10 +1816,15 @@ export class User {
1781
1816
  includeOpenOrders
1782
1817
  );
1783
1818
 
1819
+ const isolatedDeposits =
1820
+ marginCategory === undefined
1821
+ ? this.getTotalIsolatedPositionDeposits()
1822
+ : ZERO;
1823
+
1784
1824
  return {
1785
1825
  perpLiabilityValue: perpLiability,
1786
1826
  perpPnl,
1787
- spotAssetValue,
1827
+ spotAssetValue: spotAssetValue.add(isolatedDeposits),
1788
1828
  spotLiabilityValue,
1789
1829
  };
1790
1830
  }
@@ -1855,15 +1895,22 @@ export class User {
1855
1895
  }
1856
1896
 
1857
1897
  getTotalAssetValue(marginCategory?: MarginCategory): BN {
1858
- return this.getSpotMarketAssetValue(undefined, marginCategory, true).add(
1859
- this.getUnrealizedPNL(true, undefined, marginCategory)
1860
- );
1898
+ const value = this.getSpotMarketAssetValue(
1899
+ undefined,
1900
+ marginCategory,
1901
+ true
1902
+ ).add(this.getUnrealizedPNL(true, undefined, marginCategory));
1903
+ if (marginCategory === undefined) {
1904
+ return value.add(this.getTotalIsolatedPositionDeposits());
1905
+ }
1906
+ return value;
1861
1907
  }
1862
1908
 
1863
1909
  getNetUsdValue(): BN {
1864
1910
  const netSpotValue = this.getNetSpotMarketValue();
1865
1911
  const unrealizedPnl = this.getUnrealizedPNL(true, undefined, undefined);
1866
- return netSpotValue.add(unrealizedPnl);
1912
+ const isolatedDeposits = this.getTotalIsolatedPositionDeposits();
1913
+ return netSpotValue.add(unrealizedPnl).add(isolatedDeposits);
1867
1914
  }
1868
1915
 
1869
1916
  /**
@@ -0,0 +1,322 @@
1
+ import {
2
+ BN,
3
+ BASE_PRECISION,
4
+ QUOTE_PRECISION,
5
+ SPOT_MARKET_BALANCE_PRECISION,
6
+ PositionFlag,
7
+ SpotBalanceType,
8
+ ZERO,
9
+ } from '../../src';
10
+ import { assert } from '../../src/assert/assert';
11
+ import { mockPerpMarkets, mockSpotMarkets } from '../dlob/helpers';
12
+ import {
13
+ mockUserAccount,
14
+ makeMockUser as makeMockUserFromHelpers,
15
+ } from './helpers';
16
+ import * as _ from 'lodash';
17
+
18
+ const DEFAULT_ORACLES = [1, 1, 1, 1, 1, 1, 1, 1];
19
+
20
+ describe('User margin calculations', () => {
21
+ describe('cross collateral', () => {
22
+ it('getTotalCollateral for USDC-only account matches expected value', async () => {
23
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
24
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
25
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
26
+
27
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
28
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
29
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(10_000).mul(
30
+ SPOT_MARKET_BALANCE_PRECISION
31
+ );
32
+
33
+ const mockUser = await makeMockUserFromHelpers(
34
+ myMockPerpMarkets,
35
+ myMockSpotMarkets,
36
+ myMockUserAccount,
37
+ DEFAULT_ORACLES,
38
+ DEFAULT_ORACLES
39
+ );
40
+
41
+ const expectedValue = new BN(10_000).mul(QUOTE_PRECISION);
42
+ assert(mockUser.getTotalCollateral('Initial').eq(expectedValue));
43
+ assert(mockUser.getTotalCollateral('Maintenance').eq(expectedValue));
44
+ });
45
+
46
+ it('getInitialMarginRequirement is greater than or equal to maintenance', async () => {
47
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
48
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
49
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
50
+
51
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
52
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
53
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(200).mul(
54
+ SPOT_MARKET_BALANCE_PRECISION
55
+ );
56
+
57
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
58
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION;
59
+ myMockUserAccount.perpPositions[0].quoteAssetAmount =
60
+ QUOTE_PRECISION.neg();
61
+ myMockUserAccount.perpPositions[0].quoteEntryAmount =
62
+ QUOTE_PRECISION.neg();
63
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
64
+ QUOTE_PRECISION.neg();
65
+
66
+ const mockUser = await makeMockUserFromHelpers(
67
+ myMockPerpMarkets,
68
+ myMockSpotMarkets,
69
+ myMockUserAccount,
70
+ DEFAULT_ORACLES,
71
+ DEFAULT_ORACLES
72
+ );
73
+
74
+ const initialMarginRequirement = mockUser.getInitialMarginRequirement();
75
+ const maintenanceMarginRequirement =
76
+ mockUser.getMaintenanceMarginRequirement();
77
+ assert(initialMarginRequirement.gte(maintenanceMarginRequirement));
78
+ assert(maintenanceMarginRequirement.gt(ZERO));
79
+ });
80
+
81
+ it('getFreeCollateral is positive for solvent cross account', async () => {
82
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
83
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
84
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
85
+
86
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
87
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
88
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(10_000).mul(
89
+ SPOT_MARKET_BALANCE_PRECISION
90
+ );
91
+
92
+ const mockUser = await makeMockUserFromHelpers(
93
+ myMockPerpMarkets,
94
+ myMockSpotMarkets,
95
+ myMockUserAccount,
96
+ DEFAULT_ORACLES,
97
+ DEFAULT_ORACLES
98
+ );
99
+
100
+ assert(mockUser.getFreeCollateral('Initial').gt(ZERO));
101
+ });
102
+
103
+ it('getFreeCollateral is zero for undercollateralized account', async () => {
104
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
105
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
106
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
107
+
108
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
109
+ myMockUserAccount.perpPositions[0].baseAssetAmount = new BN(20).mul(
110
+ BASE_PRECISION
111
+ );
112
+ myMockUserAccount.perpPositions[0].quoteAssetAmount = new BN(10)
113
+ .mul(QUOTE_PRECISION)
114
+ .neg();
115
+
116
+ const mockUser = await makeMockUserFromHelpers(
117
+ myMockPerpMarkets,
118
+ myMockSpotMarkets,
119
+ myMockUserAccount,
120
+ DEFAULT_ORACLES,
121
+ DEFAULT_ORACLES
122
+ );
123
+
124
+ assert(mockUser.getFreeCollateral('Initial').eq(ZERO));
125
+ });
126
+ });
127
+
128
+ describe('isolated collateral', () => {
129
+ it('cross total collateral excludes isolated deposits', async () => {
130
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
131
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
132
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
133
+
134
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
135
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
136
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(200).mul(
137
+ SPOT_MARKET_BALANCE_PRECISION
138
+ );
139
+
140
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
141
+ myMockUserAccount.perpPositions[0].positionFlag =
142
+ PositionFlag.IsolatedPosition;
143
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION;
144
+ myMockUserAccount.perpPositions[0].quoteAssetAmount =
145
+ QUOTE_PRECISION.neg();
146
+ myMockUserAccount.perpPositions[0].quoteEntryAmount =
147
+ QUOTE_PRECISION.neg();
148
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
149
+ QUOTE_PRECISION.neg();
150
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
151
+ 100
152
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
153
+
154
+ const mockUser = await makeMockUserFromHelpers(
155
+ myMockPerpMarkets,
156
+ myMockSpotMarkets,
157
+ myMockUserAccount,
158
+ DEFAULT_ORACLES,
159
+ DEFAULT_ORACLES
160
+ );
161
+
162
+ const crossTotalCollateral = mockUser.getTotalCollateral('Initial');
163
+ assert(crossTotalCollateral.eq(new BN(200).mul(QUOTE_PRECISION)));
164
+ });
165
+
166
+ it('getTotalCollateral with perpMarketIndex returns isolated collateral bucket', async () => {
167
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
168
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
169
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
170
+
171
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
172
+ myMockUserAccount.perpPositions[0].positionFlag =
173
+ PositionFlag.IsolatedPosition;
174
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION;
175
+ myMockUserAccount.perpPositions[0].quoteAssetAmount =
176
+ QUOTE_PRECISION.neg();
177
+ myMockUserAccount.perpPositions[0].quoteEntryAmount =
178
+ QUOTE_PRECISION.neg();
179
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
180
+ QUOTE_PRECISION.neg();
181
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
182
+ 100
183
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
184
+
185
+ const mockUser = await makeMockUserFromHelpers(
186
+ myMockPerpMarkets,
187
+ myMockSpotMarkets,
188
+ myMockUserAccount,
189
+ DEFAULT_ORACLES,
190
+ DEFAULT_ORACLES
191
+ );
192
+
193
+ const isolatedCollateral = mockUser.getTotalCollateral(
194
+ 'Maintenance',
195
+ false,
196
+ true,
197
+ undefined,
198
+ 0
199
+ );
200
+ assert(isolatedCollateral.eq(new BN(100).mul(QUOTE_PRECISION)));
201
+ });
202
+
203
+ it('getFreeCollateral with perpMarketIndex reads isolated free collateral', async () => {
204
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
205
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
206
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
207
+
208
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
209
+ myMockUserAccount.perpPositions[0].positionFlag =
210
+ PositionFlag.IsolatedPosition;
211
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION;
212
+ myMockUserAccount.perpPositions[0].quoteAssetAmount =
213
+ QUOTE_PRECISION.neg();
214
+ myMockUserAccount.perpPositions[0].quoteEntryAmount =
215
+ QUOTE_PRECISION.neg();
216
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
217
+ QUOTE_PRECISION.neg();
218
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
219
+ 100
220
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
221
+
222
+ const mockUser = await makeMockUserFromHelpers(
223
+ myMockPerpMarkets,
224
+ myMockSpotMarkets,
225
+ myMockUserAccount,
226
+ DEFAULT_ORACLES,
227
+ DEFAULT_ORACLES
228
+ );
229
+
230
+ assert(mockUser.getFreeCollateral('Initial', false, 0).gt(ZERO));
231
+ assert(mockUser.getFreeCollateral('Initial', false, 5).eq(ZERO));
232
+ });
233
+ });
234
+
235
+ describe('liquidationPrice', () => {
236
+ it('cross liquidationPrice returns a valid value for active position', async () => {
237
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
238
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
239
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
240
+ myMockPerpMarkets[0].amm.orderStepSize = BASE_PRECISION;
241
+
242
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
243
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
244
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(2).mul(
245
+ SPOT_MARKET_BALANCE_PRECISION
246
+ );
247
+
248
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
249
+ myMockUserAccount.perpPositions[0].baseAssetAmount = new BN(10).mul(
250
+ BASE_PRECISION
251
+ );
252
+ myMockUserAccount.perpPositions[0].quoteAssetAmount = new BN(10)
253
+ .mul(QUOTE_PRECISION)
254
+ .neg();
255
+ myMockUserAccount.perpPositions[0].quoteEntryAmount = new BN(10)
256
+ .mul(QUOTE_PRECISION)
257
+ .neg();
258
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount = new BN(10)
259
+ .mul(QUOTE_PRECISION)
260
+ .neg();
261
+
262
+ const mockUser = await makeMockUserFromHelpers(
263
+ myMockPerpMarkets,
264
+ myMockSpotMarkets,
265
+ myMockUserAccount,
266
+ DEFAULT_ORACLES,
267
+ DEFAULT_ORACLES
268
+ );
269
+
270
+ const liqPrice = mockUser.liquidationPrice(0);
271
+ assert(liqPrice.gte(ZERO));
272
+ assert(!liqPrice.eq(new BN(-1)));
273
+ });
274
+
275
+ it('isolated liquidationPrice returns a valid value for isolated position', async () => {
276
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
277
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
278
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
279
+ myMockPerpMarkets[0].amm.orderStepSize = BASE_PRECISION;
280
+
281
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
282
+ myMockUserAccount.perpPositions[0].positionFlag =
283
+ PositionFlag.IsolatedPosition;
284
+ myMockUserAccount.perpPositions[0].baseAssetAmount = new BN(10).mul(
285
+ BASE_PRECISION
286
+ );
287
+ myMockUserAccount.perpPositions[0].quoteAssetAmount = new BN(10)
288
+ .mul(QUOTE_PRECISION)
289
+ .neg();
290
+ myMockUserAccount.perpPositions[0].quoteEntryAmount = new BN(10)
291
+ .mul(QUOTE_PRECISION)
292
+ .neg();
293
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount = new BN(10)
294
+ .mul(QUOTE_PRECISION)
295
+ .neg();
296
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
297
+ 2
298
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
299
+
300
+ const mockUser = await makeMockUserFromHelpers(
301
+ myMockPerpMarkets,
302
+ myMockSpotMarkets,
303
+ myMockUserAccount,
304
+ DEFAULT_ORACLES,
305
+ DEFAULT_ORACLES
306
+ );
307
+
308
+ const liqPrice = mockUser.liquidationPrice(
309
+ 0,
310
+ ZERO,
311
+ ZERO,
312
+ 'Maintenance',
313
+ false,
314
+ ZERO,
315
+ false,
316
+ 'Isolated'
317
+ );
318
+ assert(liqPrice.gte(ZERO));
319
+ assert(!liqPrice.eq(new BN(-1)));
320
+ });
321
+ });
322
+ });
@@ -21,7 +21,10 @@ import {
21
21
  } from '../../src';
22
22
  import { MockUserMap, mockPerpMarkets, mockSpotMarkets } from '../dlob/helpers';
23
23
  import { assert } from '../../src/assert/assert';
24
- import { mockUserAccount } from './helpers';
24
+ import {
25
+ mockUserAccount,
26
+ makeMockUser as makeMockUserFromHelpers,
27
+ } from './helpers';
25
28
  import * as _ from 'lodash';
26
29
 
27
30
  async function makeMockUser(
@@ -514,4 +517,253 @@ describe('User Tests', () => {
514
517
  assert(iLev == 2000);
515
518
  assert(mLev == 10000);
516
519
  });
520
+
521
+ it('getTotalIsolatedPositionDeposits sums isolated USDC deposits', async () => {
522
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
523
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
524
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
525
+
526
+ // Give perp position 0 an isolated deposit of 100 USDC
527
+ // mockSpotMarkets[0] is USDC with cumulativeDepositInterest = SPOT_MARKET_CUMULATIVE_INTEREST_PRECISION
528
+ // so scaledBalance of 100 * SPOT_MARKET_BALANCE_PRECISION = 100 USDC token amount
529
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
530
+ myMockUserAccount.perpPositions[0].baseAssetAmount = new BN(1); // make position active
531
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
532
+ 100
533
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
534
+
535
+ // Give perp position 1 an isolated deposit of 50 USDC
536
+ myMockUserAccount.perpPositions[1].marketIndex = 1;
537
+ myMockUserAccount.perpPositions[1].baseAssetAmount = new BN(1);
538
+ myMockUserAccount.perpPositions[1].isolatedPositionScaledBalance = new BN(
539
+ 50
540
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
541
+
542
+ const mockUser = await makeMockUserFromHelpers(
543
+ myMockPerpMarkets,
544
+ myMockSpotMarkets,
545
+ myMockUserAccount,
546
+ [1, 1, 1, 1, 1, 1, 1, 1],
547
+ [1, 1, 1, 1, 1, 1, 1, 1]
548
+ );
549
+
550
+ const totalIsolatedDeposits = mockUser.getTotalIsolatedPositionDeposits();
551
+ // 150 USDC = 150 * QUOTE_PRECISION
552
+ assert(totalIsolatedDeposits.eq(new BN(150).mul(QUOTE_PRECISION)));
553
+ });
554
+
555
+ it('getTotalIsolatedPositionDeposits applies oracle price for depeg', async () => {
556
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
557
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
558
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
559
+
560
+ // Give spot market 0 (USDC) a unique oracle so it gets its own price
561
+ // (all mock markets share PublicKey.default, causing oracle map overwrites)
562
+ const usdcOracle = new PublicKey(
563
+ 'Erq8cpkof3kitj7rkzKba3j1Hdib6gFFZ7QktwGpsa3w'
564
+ );
565
+ myMockSpotMarkets[0].oracle = usdcOracle;
566
+
567
+ // 100 USDC isolated deposit on perp position 0
568
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
569
+ myMockUserAccount.perpPositions[0].baseAssetAmount = new BN(1);
570
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
571
+ 100
572
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
573
+
574
+ // Spot oracle price list: index 0 = USDC at $0.99 (depeg)
575
+ const mockUser = await makeMockUserFromHelpers(
576
+ myMockPerpMarkets,
577
+ myMockSpotMarkets,
578
+ myMockUserAccount,
579
+ [1, 1, 1, 1, 1, 1, 1, 1],
580
+ [0.99, 1, 1, 1, 1, 1, 1, 1]
581
+ );
582
+
583
+ const totalIsolatedDeposits = mockUser.getTotalIsolatedPositionDeposits();
584
+ // 100 tokens * $0.99 = $99 = 99 * QUOTE_PRECISION
585
+ assert(totalIsolatedDeposits.eq(new BN(99).mul(QUOTE_PRECISION)));
586
+ });
587
+
588
+ it('getNetUsdValue includes isolated position deposits', async () => {
589
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
590
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
591
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
592
+
593
+ // 200 USDC cross-margin deposit in spot position 0 (USDC market)
594
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
595
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(200).mul(
596
+ SPOT_MARKET_BALANCE_PRECISION
597
+ );
598
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
599
+
600
+ // 100 USDC isolated deposit on perp position 0
601
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
602
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION; // 1 unit long
603
+ myMockUserAccount.perpPositions[0].quoteAssetAmount = QUOTE_PRECISION.neg(); // entered at $1, PnL=0
604
+ myMockUserAccount.perpPositions[0].quoteEntryAmount = QUOTE_PRECISION.neg(); // entered at $1
605
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
606
+ QUOTE_PRECISION.neg();
607
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
608
+ 100
609
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
610
+
611
+ const mockUser = await makeMockUserFromHelpers(
612
+ myMockPerpMarkets,
613
+ myMockSpotMarkets,
614
+ myMockUserAccount,
615
+ [1, 1, 1, 1, 1, 1, 1, 1],
616
+ [1, 1, 1, 1, 1, 1, 1, 1]
617
+ );
618
+
619
+ const netUsdValue = mockUser.getNetUsdValue();
620
+ // Cross spot: 200 USDC + Isolated deposit: 100 USDC + PnL: 0 = 300 USDC
621
+ assert(netUsdValue.eq(new BN(300).mul(QUOTE_PRECISION)));
622
+ });
623
+
624
+ it('getTotalAssetValue includes isolated position deposits', async () => {
625
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
626
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
627
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
628
+
629
+ // 200 USDC cross-margin deposit
630
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
631
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(200).mul(
632
+ SPOT_MARKET_BALANCE_PRECISION
633
+ );
634
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
635
+
636
+ // 100 USDC isolated deposit on perp position 0
637
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
638
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION;
639
+ myMockUserAccount.perpPositions[0].quoteAssetAmount = QUOTE_PRECISION.neg(); // PnL=0 at oracle $1
640
+ myMockUserAccount.perpPositions[0].quoteEntryAmount = QUOTE_PRECISION.neg();
641
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
642
+ QUOTE_PRECISION.neg();
643
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
644
+ 100
645
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
646
+
647
+ const mockUser = await makeMockUserFromHelpers(
648
+ myMockPerpMarkets,
649
+ myMockSpotMarkets,
650
+ myMockUserAccount,
651
+ [1, 1, 1, 1, 1, 1, 1, 1],
652
+ [1, 1, 1, 1, 1, 1, 1, 1]
653
+ );
654
+
655
+ const totalAssetValue = mockUser.getTotalAssetValue();
656
+ // Cross spot asset: 200 USDC + Isolated: 100 USDC + PnL: 0 = 300 USDC
657
+ assert(totalAssetValue.eq(new BN(300).mul(QUOTE_PRECISION)));
658
+ });
659
+
660
+ it('getTotalAssetValue with Initial margin excludes isolated position deposits', async () => {
661
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
662
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
663
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
664
+
665
+ // 200 USDC cross-margin deposit
666
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
667
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(200).mul(
668
+ SPOT_MARKET_BALANCE_PRECISION
669
+ );
670
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
671
+
672
+ // 100 USDC isolated deposit on perp position 0
673
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
674
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION;
675
+ myMockUserAccount.perpPositions[0].quoteAssetAmount = QUOTE_PRECISION.neg();
676
+ myMockUserAccount.perpPositions[0].quoteEntryAmount =
677
+ QUOTE_PRECISION.neg();
678
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
679
+ QUOTE_PRECISION.neg();
680
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
681
+ 100
682
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
683
+
684
+ const mockUser = await makeMockUserFromHelpers(
685
+ myMockPerpMarkets,
686
+ myMockSpotMarkets,
687
+ myMockUserAccount,
688
+ [1, 1, 1, 1, 1, 1, 1, 1],
689
+ [1, 1, 1, 1, 1, 1, 1, 1]
690
+ );
691
+
692
+ const totalAssetValue = mockUser.getTotalAssetValue('Initial');
693
+ // Cross spot asset only: 200 USDC. Isolated collateral is handled separately.
694
+ assert(totalAssetValue.eq(new BN(200).mul(QUOTE_PRECISION)));
695
+ });
696
+
697
+ it('getLeverageComponents aggregate path includes isolated deposits in spotAssetValue', async () => {
698
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
699
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
700
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
701
+
702
+ // 200 USDC cross-margin deposit
703
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
704
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(200).mul(
705
+ SPOT_MARKET_BALANCE_PRECISION
706
+ );
707
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
708
+
709
+ // 100 USDC isolated deposit on perp position 0 with 1 unit long at $1
710
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
711
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION;
712
+ myMockUserAccount.perpPositions[0].quoteEntryAmount = QUOTE_PRECISION.neg();
713
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
714
+ QUOTE_PRECISION.neg();
715
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
716
+ 100
717
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
718
+
719
+ const mockUser = await makeMockUserFromHelpers(
720
+ myMockPerpMarkets,
721
+ myMockSpotMarkets,
722
+ myMockUserAccount,
723
+ [1, 1, 1, 1, 1, 1, 1, 1],
724
+ [1, 1, 1, 1, 1, 1, 1, 1]
725
+ );
726
+
727
+ const { spotAssetValue } = mockUser.getLeverageComponents();
728
+ // Cross spot: 200 USDC + Isolated: 100 USDC = 300 USDC
729
+ assert(spotAssetValue.eq(new BN(300).mul(QUOTE_PRECISION)));
730
+ });
731
+
732
+ it('getLeverageComponents with Initial margin excludes isolated deposits from aggregate spotAssetValue', async () => {
733
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
734
+ const myMockSpotMarkets = _.cloneDeep(mockSpotMarkets);
735
+ const myMockUserAccount = _.cloneDeep(mockUserAccount);
736
+
737
+ // 200 USDC cross-margin deposit
738
+ myMockUserAccount.spotPositions[0].marketIndex = 0;
739
+ myMockUserAccount.spotPositions[0].scaledBalance = new BN(200).mul(
740
+ SPOT_MARKET_BALANCE_PRECISION
741
+ );
742
+ myMockUserAccount.spotPositions[0].balanceType = SpotBalanceType.DEPOSIT;
743
+
744
+ // 100 USDC isolated deposit on perp position 0 with 1 unit long at $1
745
+ myMockUserAccount.perpPositions[0].marketIndex = 0;
746
+ myMockUserAccount.perpPositions[0].baseAssetAmount = BASE_PRECISION;
747
+ myMockUserAccount.perpPositions[0].quoteEntryAmount = QUOTE_PRECISION.neg();
748
+ myMockUserAccount.perpPositions[0].quoteBreakEvenAmount =
749
+ QUOTE_PRECISION.neg();
750
+ myMockUserAccount.perpPositions[0].isolatedPositionScaledBalance = new BN(
751
+ 100
752
+ ).mul(SPOT_MARKET_BALANCE_PRECISION);
753
+
754
+ const mockUser = await makeMockUserFromHelpers(
755
+ myMockPerpMarkets,
756
+ myMockSpotMarkets,
757
+ myMockUserAccount,
758
+ [1, 1, 1, 1, 1, 1, 1, 1],
759
+ [1, 1, 1, 1, 1, 1, 1, 1]
760
+ );
761
+
762
+ const { spotAssetValue } = mockUser.getLeverageComponents(
763
+ true,
764
+ 'Initial'
765
+ );
766
+ // Cross spot asset only: 200 USDC. Isolated collateral is handled separately.
767
+ assert(spotAssetValue.eq(new BN(200).mul(QUOTE_PRECISION)));
768
+ });
517
769
  });