Skip to content

Commit 414e8c3

Browse files
authored
fix: don't allow trades that are taking you from invalid account state to MORE invalid (#1900)
1 parent 8192efd commit 414e8c3

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

src/bonsai/calculators/subaccount.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ export function calculateParentSubaccountSummary(
7171
marginUsage: parentSummary.marginUsage,
7272
leverage: parentSummary.leverage,
7373
freeCollateral: parentSummary.freeCollateral,
74+
rawFreeCollateral: parentSummary.rawFreeCollateral,
7475
parentSubaccountEquity: parentSummary.equity,
7576
equity: Object.values(summaries)
7677
.filter(isPresent)
@@ -151,7 +152,8 @@ function calculateSubaccountSummaryDerived(core: SubaccountSummaryCore): Subacco
151152
const { initialRiskTotal, notionalTotal, quoteBalance, valueTotal } = core;
152153
const equity = BigNumber.max(valueTotal.plus(quoteBalance), BIG_NUMBERS.ZERO);
153154

154-
const freeCollateral = BigNumber.max(equity.minus(initialRiskTotal), BIG_NUMBERS.ZERO);
155+
const rawFreeCollateral = equity.minus(initialRiskTotal);
156+
const freeCollateral = BigNumber.max(rawFreeCollateral, BIG_NUMBERS.ZERO);
155157

156158
let leverage = null;
157159
let marginUsage = null;
@@ -163,6 +165,7 @@ function calculateSubaccountSummaryDerived(core: SubaccountSummaryCore): Subacco
163165

164166
return {
165167
freeCollateral,
168+
rawFreeCollateral,
166169
equity,
167170
leverage,
168171
marginUsage,

src/bonsai/forms/trade/errors.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,7 @@ function validateParentSubaccountMarginUsage(
710710
// Check if margin usage is invalid
711711
const isInvalidAfter = equityAfter <= 0 || marginUsageAfter == null || marginUsageAfter >= 1;
712712
const wasInvalidBefore = equityBefore <= 0 || marginUsageBefore == null || marginUsageBefore >= 1;
713+
713714
// only error if they're going from valid->invalid
714715
// invalid->invalid is fine and invalid->valid is fine
715716
if (isInvalidAfter && !wasInvalidBefore) {
@@ -722,6 +723,19 @@ function validateParentSubaccountMarginUsage(
722723
});
723724
}
724725

726+
const rawFreeCollateralBefore = accountBefore.rawFreeCollateral.toNumber();
727+
const rawFreeCollateralAfter = accountAfter.rawFreeCollateral.toNumber();
728+
729+
if (rawFreeCollateralBefore <= 0 && rawFreeCollateralAfter < rawFreeCollateralBefore) {
730+
return simpleValidationError({
731+
code: 'INVALID_NEW_ACCOUNT_MARGIN_USAGE',
732+
type: ErrorType.error,
733+
fields: ['size.size'],
734+
titleKey: STRING_KEYS.MODIFY_SIZE_FIELD,
735+
textKey: STRING_KEYS.INVALID_NEW_ACCOUNT_MARGIN_USAGE,
736+
});
737+
}
738+
725739
return undefined;
726740
}
727741

src/bonsai/types/summaryTypes.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ export type SubaccountSummaryCore = {
5858
};
5959

6060
export type SubaccountSummaryDerived = {
61+
// clamped at 0
6162
freeCollateral: BigNumber;
63+
// allowed to be negative
64+
rawFreeCollateral: BigNumber;
65+
// clamped at 0
6266
equity: BigNumber;
6367
leverage: BigNumber | null;
6468
marginUsage: BigNumber | null;

0 commit comments

Comments
 (0)