Skip to content

Commit

Permalink
Merge branch 'main' into jonfung/ro_replacement_validation
Browse files Browse the repository at this point in the history
  • Loading branch information
jonfung-dydx committed Jan 11, 2024
2 parents 09dfefc + 6385473 commit 8eda61f
Show file tree
Hide file tree
Showing 62 changed files with 4,706 additions and 300 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@ export const DENOM_COIN_SCALE: number = 18;
export function denomToHumanReadableConversion(denom: number): string {
return Big(denom).times(DENOM_TO_COIN_CONVERSION).toFixed(DENOM_COIN_SCALE);
}

export function convertToDenomScale(num: string): string {
return Big(num).toFixed(DENOM_COIN_SCALE);
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
import {
MarketCreateObject,
PerpetualMarketFromDatabase,
} from '../../src/types';
import { MarketCreateObject, PerpetualMarketFromDatabase, PerpetualMarketStatus } from '../../src/types';
import * as PerpetualMarketTable from '../../src/stores/perpetual-market-table';
import * as LiquidityTiersTable from '../../src/stores/liquidity-tiers-table';
import { clearData, migrate, teardown } from '../../src/helpers/db-helpers';
import {
clearData,
migrate,
teardown,
} from '../../src/helpers/db-helpers';
import {
defaultLiquidityTier, defaultLiquidityTier2,
defaultLiquidityTier,
defaultLiquidityTier2,
defaultMarket,
defaultMarket2,
defaultPerpetualMarket,
Expand Down Expand Up @@ -157,6 +151,21 @@ describe('PerpetualMarket store', () => {
}));
});

it('Successfully winds down a perpetual market', async () => {
await PerpetualMarketTable.create(defaultPerpetualMarket);

const perpetualMarket: PerpetualMarketFromDatabase | undefined = await PerpetualMarketTable
.update({
id: defaultPerpetualMarket.id,
status: PerpetualMarketStatus.FINAL_SETTLEMENT,
});

expect(perpetualMarket).toEqual(expect.objectContaining({
...defaultPerpetualMarket,
status: PerpetualMarketStatus.FINAL_SETTLEMENT,
}));
});

it('Successfully updates a perpetual market by market id', async () => {
const market: MarketCreateObject = {
id: 5,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import * as Knex from 'knex';

export async function up(knex: Knex): Promise<void> {
return knex.schema.raw(`
ALTER TABLE "perpetual_markets"
DROP CONSTRAINT "perpetual_markets_status_check",
ADD CONSTRAINT "perpetual_markets_status_check"
CHECK (status IN ('ACTIVE', 'PAUSED', 'CANCEL_ONLY', 'POST_ONLY', 'INITIALIZING', 'FINAL_SETTLEMENT'))
`);
}

export async function down(knex: Knex): Promise<void> {
return knex.schema.raw(`
ALTER TABLE "perpetual_markets"
DROP CONSTRAINT "perpetual_markets_status_check",
ADD CONSTRAINT "perpetual_markets_status_check"
CHECK (status IN ('ACTIVE', 'PAUSED', 'CANCEL_ONLY', 'POST_ONLY', 'INITIALIZING'))
`);
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,25 @@ export function uuid(
export async function findAll(
{
address,
addresses,
startedAtHeight,
period,
limit,
startedAtBeforeOrAt,
startedAtHeightBeforeOrAt,
}: TradingRewardAggregationQueryConfig,
requiredFields: QueryableField[],
options: Options = DEFAULT_POSTGRES_OPTIONS,
): Promise<TradingRewardAggregationFromDatabase[]> {
verifyAllRequiredFields(
{
address,
addresses,
startedAtHeight,
period,
limit,
startedAtBeforeOrAt,
startedAtHeightBeforeOrAt,
} as QueryConfig,
requiredFields,
);
Expand All @@ -57,6 +63,10 @@ export async function findAll(
baseQuery = baseQuery.where(TradingRewardAggregationColumns.address, address);
}

if (addresses) {
baseQuery = baseQuery.whereIn(TradingRewardAggregationColumns.address, addresses);
}

if (startedAtHeight) {
baseQuery = baseQuery.where(TradingRewardAggregationColumns.startedAtHeight, startedAtHeight);
}
Expand All @@ -65,6 +75,18 @@ export async function findAll(
baseQuery = baseQuery.where(TradingRewardAggregationColumns.period, period);
}

if (startedAtBeforeOrAt) {
baseQuery = baseQuery.where(TradingRewardAggregationColumns.startedAt, '<=', startedAtBeforeOrAt);
}

if (startedAtHeightBeforeOrAt) {
baseQuery = baseQuery.where(
TradingRewardAggregationColumns.startedAtHeight,
'<=',
startedAtHeightBeforeOrAt,
);
}

if (options.orderBy !== undefined) {
for (const [column, order] of options.orderBy) {
baseQuery = baseQuery.orderBy(
Expand Down
18 changes: 18 additions & 0 deletions indexer/packages/postgres/src/stores/trading-reward-table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ export async function findAll(
address,
blockHeight,
blockTimeBeforeOrAt,
blockTimeAfterOrAt,
blockTimeBefore,
blockHeightBeforeOrAt,
limit,
}: TradingRewardQueryConfig,
requiredFields: QueryableField[],
Expand All @@ -36,6 +39,9 @@ export async function findAll(
address,
blockHeight,
blockTimeBeforeOrAt,
blockTimeAfterOrAt,
blockTimeBefore,
blockHeightBeforeOrAt,
limit,
} as QueryConfig,
requiredFields,
Expand All @@ -58,6 +64,18 @@ export async function findAll(
baseQuery = baseQuery.where(TradingRewardColumns.blockTime, '<=', blockTimeBeforeOrAt);
}

if (blockTimeAfterOrAt) {
baseQuery = baseQuery.where(TradingRewardColumns.blockTime, '>=', blockTimeAfterOrAt);
}

if (blockTimeBefore) {
baseQuery = baseQuery.where(TradingRewardColumns.blockTime, '<', blockTimeBefore);
}

if (blockHeightBeforeOrAt) {
baseQuery = baseQuery.where(TradingRewardColumns.blockHeight, '<=', blockHeightBeforeOrAt);
}

if (options.orderBy !== undefined) {
for (const [column, order] of options.orderBy) {
baseQuery = baseQuery.orderBy(
Expand Down
14 changes: 13 additions & 1 deletion indexer/packages/postgres/src/types/query-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,12 @@ export enum QueryableField {
STARTED_AT_HEIGHT = 'startedAtHeight',
PERIOD = 'period',
STARTED_AT_HEIGHT_OR_AFTER = 'startedAtHeightOrAfter',
BLOCK_TIME_AFTER_OR_AT = 'blockTimeAfterOrAt',
BLOCK_TIME_BEFORE = 'blockTimeBefore',
ADDRESSES = 'addresses',
BLOCK_HEIGHT_BEFORE_OR_AT = 'blockHeightBeforeOrAt',
STARTED_AT_BEFORE_OR_AT = 'startedAtBeforeOrAt',
STARTED_AT_HEIGHT_BEFORE_OR_AT = 'startedAtHeightBeforeOrAt',
}

export interface QueryConfig {
Expand Down Expand Up @@ -149,7 +155,7 @@ export interface FillQueryConfig extends QueryConfig {

export interface BlockQueryConfig extends QueryConfig {
[QueryableField.BLOCK_HEIGHT]?: string[];
[QueryableField.CREATED_ON_OR_AFTER]?: string[];
[QueryableField.CREATED_ON_OR_AFTER]?: string;
}

export interface TendermintEventQueryConfig extends QueryConfig {
Expand Down Expand Up @@ -275,11 +281,17 @@ export interface TradingRewardQueryConfig extends QueryConfig {
[QueryableField.ADDRESS]?: string;
[QueryableField.BLOCK_HEIGHT]?: string;
[QueryableField.BLOCK_TIME_BEFORE_OR_AT]?: IsoString;
[QueryableField.BLOCK_TIME_AFTER_OR_AT]?: IsoString;
[QueryableField.BLOCK_TIME_BEFORE]?: IsoString;
[QueryableField.BLOCK_HEIGHT_BEFORE_OR_AT]?: IsoString;
}

export interface TradingRewardAggregationQueryConfig extends QueryConfig {
[QueryableField.ADDRESS]?: string;
[QueryableField.ADDRESSES]?: string[];
[QueryableField.STARTED_AT_HEIGHT]?: string;
[QueryableField.STARTED_AT_HEIGHT_OR_AFTER]?: string;
[QueryableField.PERIOD]?: TradingRewardAggregationPeriod;
[QueryableField.STARTED_AT_BEFORE_OR_AT]?: IsoString;
[QueryableField.STARTED_AT_HEIGHT_BEFORE_OR_AT]?: string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
import {
HistoricalBlockTradingReward,
HistoricalBlockTradingRewardsResponse,
HistoricalTradingRewardAggregation,
HistoricalTradingRewardAggregationsResponse,
RequestMethod,
} from '../../../../src/types';
import { getQueryString, sendRequest } from '../../../helpers/helpers';
import {
TradingRewardCreateObject,
TradingRewardFromDatabase,
TradingRewardTable,
dbHelpers,
testConstants,
testConversionHelpers,
testMocks,
} from '@dydxprotocol-indexer/postgres';
import { stats } from '@dydxprotocol-indexer/base';
import request from 'supertest';
import { tradingRewardToResponse } from '../../../../src/request-helpers/request-transformer';

describe('historical-block-trading-reward-controller#V4', () => {
beforeAll(async () => {
await dbHelpers.migrate();
jest.spyOn(stats, 'increment');
jest.spyOn(stats, 'timing');
});

beforeEach(async () => {
await testMocks.seedData();
await Promise.all([
TradingRewardTable.create(defaultTradingRewardCreate),
TradingRewardTable.create(defaultTradingRewardCreate2),
]);

const rewards: TradingRewardFromDatabase[] = await TradingRewardTable.findAll({}, []);

defaultTradingReward = rewards[1];
defaultTradingReward2 = rewards[0];
});

afterAll(async () => {
await dbHelpers.teardown();
});

afterEach(async () => {
await dbHelpers.clearData();
});

const defaultTradingRewardCreate: TradingRewardCreateObject = {
address: testConstants.defaultAddress,
blockTime: testConstants.defaultBlock.time,
blockHeight: testConstants.defaultBlock.blockHeight,
amount: testConversionHelpers.convertToDenomScale('10'),
};
let defaultTradingReward: TradingRewardFromDatabase;
const defaultTradingRewardCreate2: TradingRewardCreateObject = {
address: testConstants.defaultAddress,
blockTime: testConstants.defaultBlock2.time,
blockHeight: testConstants.defaultBlock2.blockHeight,
amount: testConversionHelpers.convertToDenomScale('5'),
};
let defaultTradingReward2: TradingRewardFromDatabase;

describe('GET', () => {
it('Get /historicalBlockTradingReward/:address returns all valid rewards', async () => {
const response: request.Response = await sendRequest({
type: RequestMethod.GET,
path: `/v4/historicalBlockTradingRewards/${testConstants.defaultAddress}`,
});

const responseBody: HistoricalTradingRewardAggregationsResponse = response.body;
const rewards: HistoricalTradingRewardAggregation[] = responseBody.rewards;
expect(rewards.length).toEqual(2);
console.log(JSON.stringify(rewards));
expect(rewards[0]).toEqual(tradingRewardToResponse(
defaultTradingReward2,
));
expect(rewards[1]).toEqual(tradingRewardToResponse(
defaultTradingReward,
));
});

it('Get /historicalBlockTradingRewards/:address returns all valid rewards with limit', async () => {
const response: request.Response = await sendRequest({
type: RequestMethod.GET,
path: `/v4/historicalBlockTradingRewards/${testConstants.defaultAddress}` +
`?${getQueryString({ limit: 1 })}`,
});

const responseBody: HistoricalBlockTradingRewardsResponse = response.body;
const rewards: HistoricalBlockTradingReward[] = responseBody.rewards;
expect(rewards.length).toEqual(1);
expect(rewards[0]).toEqual(tradingRewardToResponse(
defaultTradingReward2,
));
});

it('Get /historicalBlockTradingRewards/:address returns no rewards when none exist', async () => {
const response: request.Response = await sendRequest({
type: RequestMethod.GET,
path: '/v4/historicalBlockTradingRewards/fakeAddress',
});

const responseBody: HistoricalBlockTradingRewardsResponse = response.body;
const rewards: HistoricalBlockTradingReward[] = responseBody.rewards;
expect(rewards.length).toEqual(0);
});

it('Get /historicalBlockTradingRewards/:address returns rewards with blockTimeBeforeOrAt', async () => {
const response: request.Response = await sendRequest({
type: RequestMethod.GET,
path: `/v4/historicalBlockTradingRewards/${testConstants.defaultAddress}` +
`?${getQueryString({ startingBeforeOrAt: testConstants.defaultBlock.time })}`,
});

const responseBody: HistoricalBlockTradingRewardsResponse = response.body;
const rewards: HistoricalBlockTradingReward[] = responseBody.rewards;
expect(rewards.length).toEqual(1);
expect(rewards[0]).toEqual(tradingRewardToResponse(
defaultTradingReward,
));
});

it('Get /historicalBlockTradingRewards/:address returns rewards with blockHeightBeforeOrAt', async () => {
const response: request.Response = await sendRequest({
type: RequestMethod.GET,
path: `/v4/historicalBlockTradingRewards/${testConstants.defaultAddress}` +
`?${getQueryString({ startingBeforeOrAtHeight: testConstants.defaultBlock.blockHeight })}`,
});

const responseBody: HistoricalBlockTradingRewardsResponse = response.body;
const rewards: HistoricalBlockTradingReward[] = responseBody.rewards;
expect(rewards.length).toEqual(1);
expect(rewards[0]).toEqual(tradingRewardToResponse(
defaultTradingReward,
));
});
});
});

0 comments on commit 8eda61f

Please sign in to comment.