Skip to content

Commit

Permalink
[IND-442] Don't send cancel messages if orders are fully filled in st…
Browse files Browse the repository at this point in the history
  • Loading branch information
vincentwschau committed Nov 7, 2023
1 parent 1726c43 commit c1c7595
Show file tree
Hide file tree
Showing 11 changed files with 275 additions and 26 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
import { deleteAllAsync, ttl } from '../../src/helpers/redis';
import { redis as client } from '../helpers/utils';
import { orderId } from './constants';
import { OrderTable } from '@dydxprotocol-indexer/postgres';
import {
STATE_FILLED_QUANTUMS_TTL_SECONDS,
getCacheKey,
getStateFilledQuantums,
updateStateFilledQuantums,
} from '../../src/caches/state-filled-quantums-cache';

describe('stateFilledQuantumsCache', () => {
const orderUuid: string = OrderTable.orderIdToUuid(orderId);

beforeEach(async () => {
await deleteAllAsync(client);
});

afterEach(async () => {
await deleteAllAsync(client);
});

describe('updateStateFilledQuantums', () => {
it('updates the state filled amount for an order id', async () => {
const filledQuantums: string = '1000';
await updateStateFilledQuantums(orderUuid, filledQuantums, client);

expect(await getStateFilledQuantums(orderUuid, client)).toEqual(filledQuantums);
expect(await ttl(client, getCacheKey(orderUuid))).toEqual(STATE_FILLED_QUANTUMS_TTL_SECONDS);
});
});

describe('getStateFilledQuantums', () => {
it('gets the state filled amount for an order id', async () => {
const filledQuantums: string = '1000';
await updateStateFilledQuantums(orderUuid, filledQuantums, client);

expect(await getStateFilledQuantums(orderUuid, client)).toEqual(filledQuantums);
});

it('returns undefined if order id does not exist', async () => {
expect(await getStateFilledQuantums(orderUuid, client)).toEqual(undefined);
});
});
});
52 changes: 52 additions & 0 deletions indexer/packages/redis/src/caches/state-filled-quantums-cache.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { RedisClient } from 'redis';

import { getAsync, setexAsync } from '../helpers/redis';

export const STATE_FILLED_QUANTUMS_CACHE_KEY_PREFIX: string = 'v4/state_filled_quantums/';
export const STATE_FILLED_QUANTUMS_TTL_SECONDS: number = 300; // 5 minutes

/**
* Updates the state-filled quantums for an order id. This is the total filled quantums of the order
* in the state of the network.
* @param orderId
* @param filledQuantums
* @param client
*/
export async function updateStateFilledQuantums(
orderId: string,
filledQuantums: string,
client: RedisClient,
): Promise<void> {
await setexAsync({
key: getCacheKey(orderId),
value: filledQuantums,
timeToLiveSeconds: STATE_FILLED_QUANTUMS_TTL_SECONDS,
}, client);
}

/**
* Gets the state-filled quantums for an order id. This is the total filled quantums of the order
* in the state of the network.
* @param orderId
* @param client
* @returns
*/
export async function getStateFilledQuantums(
orderId: string,
client: RedisClient,
): Promise<string | undefined> {
const filledQuantums: string | null = await getAsync(
getCacheKey(orderId),
client,
);

if (filledQuantums === null) {
return undefined;
}

return filledQuantums;
}

export function getCacheKey(orderId: string): string {
return `${STATE_FILLED_QUANTUMS_CACHE_KEY_PREFIX}${orderId}`;
}
1 change: 1 addition & 0 deletions indexer/packages/redis/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export * as OrderbookLevelsCache from './caches/orderbook-levels-cache';
export * as LatestAccountPnlTicksCache from './caches/latest-account-pnl-ticks-cache';
export * as CanceledOrdersCache from './caches/canceled-orders-cache';
export * as StatefulOrderUpdatesCache from './caches/stateful-order-updates-cache';
export * as StateFilledQuantumsCache from './caches/state-filled-quantums-cache';
export { placeOrder } from './caches/place-order';
export { removeOrder } from './caches/remove-order';
export { updateOrder } from './caches/update-order';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ import { clearCandlesMap } from '../../../src/caches/candle-cache';
import Long from 'long';
import { createPostgresFunctions } from '../../../src/helpers/postgres/postgres-functions';
import config from '../../../src/config';
import { expectStateFilledQuantums } from '../../helpers/redis-helpers';

const defaultClobPairId: string = testConstants.defaultPerpetualMarket.clobPairId;
const defaultMakerFeeQuantum: number = 1_000_000;
Expand Down Expand Up @@ -424,6 +425,10 @@ describe('LiquidationHandler', () => {
exitPrice: makerPrice,
},
),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(makerOrderProto.orderId!),
orderFillEvent.totalFilledMaker.toString(),
),
expectCandlesUpdated(),
]);

Expand Down Expand Up @@ -666,6 +671,10 @@ describe('LiquidationHandler', () => {
eventId,
),
expectCandlesUpdated(),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(makerOrderProto.orderId!),
orderFillEvent.totalFilledMaker.toString(),
),
]);

if (!useSqlFunction) {
Expand Down Expand Up @@ -827,6 +836,10 @@ describe('LiquidationHandler', () => {
eventId,
),
expectCandlesUpdated(),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(makerOrderProto.orderId!),
orderFillEvent.totalFilledMaker.toString(),
),
]);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ import Long from 'long';
import { createPostgresFunctions } from '../../../src/helpers/postgres/postgres-functions';
import config from '../../../src/config';
import { redisClient } from '../../../src/helpers/redis/redis-controller';
import { expectStateFilledQuantums } from '../../helpers/redis-helpers';

const defaultClobPairId: string = testConstants.defaultPerpetualMarket.clobPairId;
const defaultMakerFeeQuantum: number = 1_000_000;
Expand Down Expand Up @@ -479,6 +480,14 @@ describe('OrderHandler', () => {
},
),
expectCandlesUpdated(),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(makerOrderProto.orderId!),
orderFillEvent.totalFilledMaker.toString(),
),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(takerOrderProto.orderId!),
orderFillEvent.totalFilledTaker.toString(),
),
]);

if (!useSqlFunction) {
Expand Down Expand Up @@ -833,6 +842,14 @@ describe('OrderHandler', () => {
eventId,
),
expectCandlesUpdated(),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(makerOrderProto.orderId!),
orderFillEvent.totalFilledMaker.toString(),
),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(takerOrderProto.orderId!),
orderFillEvent.totalFilledTaker.toString(),
),
]);

if (!useSqlFunction) {
Expand Down Expand Up @@ -1042,6 +1059,14 @@ describe('OrderHandler', () => {
eventId,
),
expectCandlesUpdated(),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(makerOrderProto.orderId!),
orderFillEvent.totalFilledMaker.toString(),
),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(takerOrderProto.orderId!),
orderFillEvent.totalFilledTaker.toString(),
),
]);
});

Expand Down Expand Up @@ -1253,6 +1278,14 @@ describe('OrderHandler', () => {
eventId,
),
expectCandlesUpdated(),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(makerOrderProto.orderId!),
orderFillEvent.totalFilledMaker.toString(),
),
expectStateFilledQuantums(
OrderTable.orderIdToUuid(takerOrderProto.orderId!),
orderFillEvent.totalFilledTaker.toString(),
),
]);
});

Expand Down
18 changes: 17 additions & 1 deletion indexer/services/ender/__tests__/helpers/redis-helpers.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { NextFundingCache } from '@dydxprotocol-indexer/redis';
import {
NextFundingCache,
StateFilledQuantumsCache,
} from '@dydxprotocol-indexer/redis';
import Big from 'big.js';

import { redisClient } from '../../src/helpers/redis/redis-controller';
Expand All @@ -13,3 +16,16 @@ export async function expectNextFundingRate(
);
expect(rates[ticker]).toEqual(rate);
}

export async function expectStateFilledQuantums(
orderUuid: string,
quantums: string,
): Promise<void> {
const stateFilledQuantums: string | undefined = await StateFilledQuantumsCache
.getStateFilledQuantums(
orderUuid,
redisClient,
);
expect(stateFilledQuantums).toBeDefined();
expect(stateFilledQuantums).toEqual(quantums);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
USDC_ASSET_ID,
OrderStatus, FillType,
} from '@dydxprotocol-indexer/postgres';
import { CanceledOrderStatus } from '@dydxprotocol-indexer/redis';
import { CanceledOrderStatus, StateFilledQuantumsCache } from '@dydxprotocol-indexer/redis';
import { isStatefulOrder } from '@dydxprotocol-indexer/v4-proto-parser';
import {
LiquidationOrderV1, IndexerOrderId, OrderFillEventV1,
Expand All @@ -27,6 +27,7 @@ import * as pg from 'pg';
import config from '../../config';
import { STATEFUL_ORDER_ORDER_FILL_EVENT_TYPE, SUBACCOUNT_ORDER_FILL_EVENT_TYPE } from '../../constants';
import { convertPerpetualPosition } from '../../helpers/kafka-helper';
import { redisClient } from '../../helpers/redis/redis-controller';
import {
orderFillWithLiquidityToOrderFillEventWithLiquidation,
} from '../../helpers/translation-helper';
Expand Down Expand Up @@ -136,6 +137,13 @@ export class LiquidationHandler extends AbstractOrderFillHandler<OrderFillWithLi
const makerOrder: OrderFromDatabase = OrderModel.fromJson(
result.rows[0].result.order) as OrderFromDatabase;

// Update the cache tracking the state-filled amount per order for use in vulcan
await StateFilledQuantumsCache.updateStateFilledQuantums(
makerOrder!.id,
this.getTotalFilled(castedLiquidationFillEventMessage).toString(),
redisClient,
);

const kafkaEvents: ConsolidatedKafkaEvent[] = [
this.generateConsolidatedKafkaEvent(
castedLiquidationFillEventMessage.makerOrder.orderId!.subaccountId!,
Expand Down Expand Up @@ -225,6 +233,13 @@ export class LiquidationHandler extends AbstractOrderFillHandler<OrderFillWithLi
);

if (this.event.liquidity === Liquidity.MAKER) {
// Update the cache tracking the state-filled amount per order for use in vulcan
await StateFilledQuantumsCache.updateStateFilledQuantums(
makerOrder!.id,
this.getTotalFilled(castedLiquidationFillEventMessage).toString(),
redisClient,
);

const kafkaEvents: ConsolidatedKafkaEvent[] = [
this.generateConsolidatedKafkaEvent(
castedLiquidationFillEventMessage.makerOrder.orderId!.subaccountId!,
Expand Down
16 changes: 15 additions & 1 deletion indexer/services/ender/src/handlers/order-fills/order-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
USDC_ASSET_ID,
OrderStatus,
} from '@dydxprotocol-indexer/postgres';
import { CanceledOrderStatus, CanceledOrdersCache } from '@dydxprotocol-indexer/redis';
import { CanceledOrderStatus, CanceledOrdersCache, StateFilledQuantumsCache } from '@dydxprotocol-indexer/redis';
import { isStatefulOrder } from '@dydxprotocol-indexer/v4-proto-parser';
import {
OrderFillEventV1, IndexerOrderId, IndexerSubaccountId, IndexerOrder,
Expand Down Expand Up @@ -137,6 +137,13 @@ export class OrderHandler extends AbstractOrderFillHandler<OrderFillWithLiquidit
),
);

// Update the cache tracking the state-filled amount per order for use in vulcan
await StateFilledQuantumsCache.updateStateFilledQuantums(
order.id,
this.getTotalFilled(castedOrderFillEventMessage).toString(),
redisClient,
);

// If the order is stateful and fully-filled, send an order removal to vulcan. We only do this
// for stateful orders as we are guaranteed a stateful order cannot be replaced until the next
// block.
Expand Down Expand Up @@ -229,6 +236,13 @@ export class OrderHandler extends AbstractOrderFillHandler<OrderFillWithLiquidit
),
);

// Update the cache tracking the state-filled amount per order for use in vulcan
await StateFilledQuantumsCache.updateStateFilledQuantums(
order.id,
this.getTotalFilled(castedOrderFillEventMessage).toString(),
redisClient,
);

// If the order is stateful and fully-filled, send an order removal to vulcan. We only do this
// for stateful orders as we are guaranteed a stateful order cannot be replaced until the next
// block.
Expand Down
Loading

0 comments on commit c1c7595

Please sign in to comment.