@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 +1 -1
- package/lib/browser/constants/perpMarkets.js +11 -0
- package/lib/browser/user.d.ts +4 -0
- package/lib/browser/user.js +28 -3
- package/lib/node/constants/perpMarkets.d.ts.map +1 -1
- package/lib/node/constants/perpMarkets.js +11 -0
- package/lib/node/user.d.ts +4 -0
- package/lib/node/user.d.ts.map +1 -1
- package/lib/node/user.js +28 -3
- package/package.json +1 -1
- package/src/constants/perpMarkets.ts +11 -0
- package/src/user.ts +52 -5
- package/tests/user/marginCalculations.test.ts +322 -0
- package/tests/user/test.ts +253 -1
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.161.0-beta.
|
|
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,
|
package/lib/browser/user.d.ts
CHANGED
|
@@ -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
|
/**
|
package/lib/browser/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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
package/lib/node/user.d.ts
CHANGED
|
@@ -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
|
/**
|
package/lib/node/user.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/user.ts"],"names":[],"mappings":"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"}
|
|
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
|
-
|
|
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
|
-
|
|
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
|
@@ -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
|
-
|
|
1859
|
-
|
|
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
|
-
|
|
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
|
+
});
|
package/tests/user/test.ts
CHANGED
|
@@ -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 {
|
|
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
|
});
|