Skip to content

Commit

Permalink
remove adjusted IMF calculation (#903)
Browse files Browse the repository at this point in the history
  • Loading branch information
dydxwill authored Dec 21, 2023
1 parent 3ee5be0 commit 24adb6c
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 101 deletions.
67 changes: 13 additions & 54 deletions indexer/services/comlink/__tests__/lib/helpers.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import {
filterAssetPositions,
filterPositionsByLatestEventIdPerPerpetual,
getFundingIndexMaps,
getAdjustedMarginFraction,
getMarginFraction,
getSignedNotionalAndRisk,
getTotalUnsettledFunding,
getPerpetualPositionsWithUpdatedFunding,
Expand Down Expand Up @@ -224,63 +224,22 @@ describe('helpers', () => {
);
});

it.each([
['less than base', 20, 0.05],
['base', 1_000_000, 0.05],
['greater than base', 4_000_000, 0.1],
['max', 400_000_000, 1],
['greater than max', 4_000_000_000, 1],
])('getAdjustedInitialMarginFraction: %s', async (
_name: string,
notionalValue: number,
expectedResult: number,
) => {
it('maintenance fraction', async () => {
const liquidityTierFromDatabase: LiquidityTiersFromDatabase = await
LiquidityTiersTable.create(defaultLiquidityTier);
const positionNotional: Big = Big(notionalValue);
expect(
getAdjustedMarginFraction(
{ liquidityTier: liquidityTierFromDatabase, positionNotional, initial: true },
getMarginFraction(
{ liquidityTier: liquidityTierFromDatabase, initial: true },
),
).toEqual(Big(expectedResult));
});

it.each([
['less than base', 20, 0.03],
['base', 1_000_000, 0.03],
['greater than base', 4_000_000, 0.06],
['greater than max', 4_000_000_000, 1],
])('getAdjustedMaintenanceMarginFraction: %s', async (
_name: string,
notionalValue: number,
expectedResult: number,
) => {
const liquidityTierFromDatabase: LiquidityTiersFromDatabase = await
LiquidityTiersTable.create(defaultLiquidityTier);
const positionNotional: Big = Big(notionalValue);
).toEqual(Big('0.05'));
expect(
getAdjustedMarginFraction(
{ liquidityTier: liquidityTierFromDatabase, positionNotional, initial: false },
getMarginFraction(
{ liquidityTier: liquidityTierFromDatabase, initial: false },
),
).toEqual(Big(expectedResult));
).toEqual(Big('0.03'));
});

it.each([
['less than base', 20, 200_000, 10_000, 6_000],
['base', 100, 1_000_000, 50_000, 30_000],
['greater than base', 400, 4_000_000, 400_000, 240_000],
['max', 400_000, 4_000_000_000, 4_000_000_000, 4_000_000_000],
['less than base SHORT', -20, -200_000, 10_000, 6_000],
['base SHORT', -100, -1_000_000, 50_000, 30_000],
['greater than base SHORT', -400, -4_000_000, 400_000, 240_000],
['max SHORT', -400_000, -4_000_000_000, 4_000_000_000, 4_000_000_000],
])('getSignedNotionalAndRisk: %s', async (
_name: string,
size: number,
signedNotional: number,
initial: number,
maintenance: number,
) => {
it('getSignedNotionalAndRisk', async () => {
await LiquidityTiersTable.create(defaultLiquidityTier);
await liquidityTierRefresher.updateLiquidityTiers();
const perpetualMarketFromDatabase: PerpetualMarketFromDatabase = {
Expand All @@ -291,17 +250,17 @@ describe('helpers', () => {
...defaultMarket,
oraclePrice: '10000',
};
const bigSize: Big = Big(size);
const bigSize: Big = Big('20');
expect(
getSignedNotionalAndRisk(
{ perpetualMarket: perpetualMarketFromDatabase, market, size: bigSize },
),
).toEqual(
{
signedNotional: Big(signedNotional),
signedNotional: Big('200000'),
individualRisk: {
initial: Big(initial),
maintenance: Big(maintenance),
initial: Big('10000'),
maintenance: Big('6000'),
},
},
);
Expand Down
66 changes: 19 additions & 47 deletions indexer/services/comlink/src/lib/helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import {
PerpetualPositionWithFunding,
Risk,
} from '../types';
import { ONE, ZERO, ZERO_USDC_POSITION } from './constants';
import { ZERO, ZERO_USDC_POSITION } from './constants';
import { NotFoundError } from './errors';

/* ------- GENERIC HELPERS ------- */
Expand Down Expand Up @@ -237,71 +237,53 @@ export function getSignedNotionalAndRisk({
// Used to calculate risk / margin fracitons, as risk of a position should always be positive
const positionNotional: Big = signedNotional.abs();
const {
adjustedInitialMarginFraction,
adjustedMaintenanceMarginFraction,
initialMarginFraction,
maintenanceMarginFraction,
}: {
adjustedInitialMarginFraction: Big,
adjustedMaintenanceMarginFraction: Big,
} = getAdjustedMarginFractions({
liquidityTier,
positionNotional,
});
initialMarginFraction: Big,
maintenanceMarginFraction: Big,
} = getMarginFractions(liquidityTier);
return {
signedNotional,
individualRisk: {
initial: positionNotional.times(adjustedInitialMarginFraction),
maintenance: positionNotional.times(adjustedMaintenanceMarginFraction),
initial: positionNotional.times(initialMarginFraction),
maintenance: positionNotional.times(maintenanceMarginFraction),
},
};
}

export function getAdjustedMarginFractions(
{
liquidityTier,
positionNotional,
}: {
liquidityTier: LiquidityTiersFromDatabase,
positionNotional: Big,
},
): {
adjustedInitialMarginFraction: Big,
adjustedMaintenanceMarginFraction: Big,
export function getMarginFractions(liquidityTier: LiquidityTiersFromDatabase): {
initialMarginFraction: Big,
maintenanceMarginFraction: Big,
} {
const adjustedInitialMarginFraction: Big = getAdjustedMarginFraction({
const initialMarginFraction: Big = getMarginFraction({
liquidityTier,
positionNotional,
initial: true,
});
const adjustedMaintenanceMarginFraction: Big = getAdjustedMarginFraction({
const maintenanceMarginFraction: Big = getMarginFraction({
liquidityTier,
positionNotional,
initial: false,
});
return {
adjustedInitialMarginFraction,
adjustedMaintenanceMarginFraction,
initialMarginFraction,
maintenanceMarginFraction,
};
}

/**
* Get the adjusted margin fraction for a position in a given perpetual market.
* Uses the `positionNotional`, `initialMarginFraction`, and `basePositionNotional`
* of the associated liquidity tier to calculate the adjusted initial margin fraction.
* Get the margin fraction for a position in a given perpetual market.
*
* @param liquidityTier The liquidity tier of the position.
* @param positionNotional The notional value of the position.
* @param initial Whether to compute the initial margin fraction or the maintenance margin fraction.
*
* @returns The adjusted margin fraction for the position in human-readable form.
* @returns The margin fraction for the position in human-readable form.
*/
export function getAdjustedMarginFraction(
export function getMarginFraction(
{
liquidityTier,
positionNotional,
initial,
}: {
liquidityTier: LiquidityTiersFromDatabase,
positionNotional: Big,
initial: boolean,
},
): Big {
Expand All @@ -313,17 +295,7 @@ export function getAdjustedMarginFraction(
Number(liquidityTier.maintenanceFractionPpm),
),
);

if (positionNotional.lte(liquidityTier.basePositionNotional)) {
return Big(margin);
}
const adjustedImf: Big = Big(
positionNotional.div(liquidityTier.basePositionNotional),
).sqrt().times(margin);
if (adjustedImf.gte(ONE)) {
return ONE;
}
return adjustedImf;
return Big(margin);
}

/**
Expand Down

0 comments on commit 24adb6c

Please sign in to comment.