Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[OTE-752] Add totalVolume and isWhitelistAffiliate to wallets table #2166

Merged
merged 6 commits into from
Aug 29, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions indexer/packages/postgres/__tests__/helpers/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,21 +158,29 @@ export const vaultSubaccountId: string = SubaccountTable.uuid(
export const defaultWallet: WalletCreateObject = {
address: defaultAddress,
totalTradingRewards: denomToHumanReadableConversion(0),
totalVolume: '0',
isWhitelistAffiliate: false,
};

export const defaultWallet2: WalletCreateObject = {
address: defaultWalletAddress,
totalTradingRewards: denomToHumanReadableConversion(1),
totalVolume: '0',
isWhitelistAffiliate: false,
};

export const vaultWallet: WalletCreateObject = {
address: vaultAddress,
totalTradingRewards: denomToHumanReadableConversion(0),
totalVolume: '0',
isWhitelistAffiliate: false,
};

export const defaultWallet3: WalletCreateObject = {
address: defaultAddress2,
totalTradingRewards: denomToHumanReadableConversion(0),
totalVolume: '0',
isWhitelistAffiliate: true,
};

// ============== Assets ==============
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,8 @@ describe('Transfer store', () => {
await WalletTable.create({
address: defaultWalletAddress,
totalTradingRewards: '0',
totalVolume: '0',
isWhitelistAffiliate: false,
});
const invalidDeposit: TransferCreateObject = {
...defaultDeposit,
Expand Down Expand Up @@ -353,6 +355,8 @@ describe('Transfer store', () => {
await WalletTable.create({
address: defaultWalletAddress,
totalTradingRewards: '0',
totalVolume: '0',
isWhitelistAffiliate: false,
});
await Promise.all([
TransferTable.create(defaultTransfer),
Expand Down
34 changes: 31 additions & 3 deletions indexer/packages/postgres/__tests__/stores/wallet-table.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { WalletFromDatabase } from '../../src/types';
import { clearData, migrate, teardown } from '../../src/helpers/db-helpers';
import { defaultWallet2 } from '../helpers/constants';
import { defaultWallet2, defaultWallet3 } from '../helpers/constants';
import * as WalletTable from '../../src/stores/wallet-table';

describe('Wallet store', () => {
Expand All @@ -27,10 +27,18 @@ describe('Wallet store', () => {
);

expect(wallet).toEqual(expect.objectContaining(defaultWallet2));
await WalletTable.upsert(defaultWallet2);
await WalletTable.upsert({
...defaultWallet2,
isWhitelistAffiliate: true,
totalVolume: '100.1',
});
wallet = await WalletTable.findById(defaultWallet2.address);

expect(wallet).toEqual(expect.objectContaining(defaultWallet2));
expect(wallet).toEqual(expect.objectContaining({
...defaultWallet2,
isWhitelistAffiliate: true,
totalVolume: '100.1',
}));
});

it('Successfully finds all Wallets', async () => {
Expand All @@ -39,6 +47,8 @@ describe('Wallet store', () => {
WalletTable.create({
address: 'fake_address',
totalTradingRewards: '0',
totalVolume: '0',
isWhitelistAffiliate: false,
}),
]);

Expand All @@ -64,4 +74,22 @@ describe('Wallet store', () => {

expect(wallet).toEqual(expect.objectContaining(defaultWallet2));
});

it('Successfully finds wallets by whitelist flag', async () => {
await Promise.all([
WalletTable.create(defaultWallet3),
WalletTable.create(defaultWallet2),
]);

const wallets: WalletFromDatabase[] = await WalletTable.findAll(
{
isWhitelistAffiliate: true,
},
[],
{ readReplica: true },
);

expect(wallets.length).toEqual(1);
expect(wallets[0]).toEqual(expect.objectContaining(defaultWallet3));
});
});
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
.alterTable('wallets', (table) => {
table.decimal('totalVolume', null).defaultTo(0).notNullable();
table.boolean('isWhitelistAffiliate').defaultTo(false).notNullable();
});
}

export async function down(knex: Knex): Promise<void> {
return knex
.schema
.alterTable('wallets', (table) => {
table.dropColumn('totalVolume');
table.dropColumn('isWhitelistAffiliate');
});
}
11 changes: 11 additions & 0 deletions indexer/packages/postgres/src/models/wallet-model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,14 @@ export default class WalletModel extends BaseModel {
required: [
'address',
'totalTradingRewards',
'totalVolume',
'isWhitelistAffiliate',
],
properties: {
address: { type: 'string' },
totalTradingRewards: { type: 'string', pattern: NonNegativeNumericPattern },
totalVolume: { type: 'string', pattern: NonNegativeNumericPattern },
isWhitelistAffiliate: { type: 'boolean' },
},
};
}
Expand All @@ -57,6 +61,9 @@ export default class WalletModel extends BaseModel {
static get sqlToJsonConversions() {
return {
address: 'string',
totalTradingRewards: 'string',
totalVolume: 'string',
isWhitelistAffiliate: 'boolean',
};
}

Expand All @@ -65,4 +72,8 @@ export default class WalletModel extends BaseModel {
address!: string;

totalTradingRewards!: string;

totalVolume!: string;

isWhitelistAffiliate!: boolean;
}
6 changes: 6 additions & 0 deletions indexer/packages/postgres/src/stores/wallet-table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
export async function findAll(
{
address,
isWhitelistAffiliate,
limit,
}: WalletQueryConfig,
requiredFields: QueryableField[],
Expand All @@ -27,6 +28,7 @@ export async function findAll(
verifyAllRequiredFields(
{
address,
isWhitelistAffiliate,
limit,
} as QueryConfig,
requiredFields,
Expand All @@ -41,6 +43,10 @@ export async function findAll(
baseQuery = baseQuery.where(WalletColumns.address, address);
}

if (isWhitelistAffiliate !== undefined) {
baseQuery = baseQuery.where(WalletColumns.isWhitelistAffiliate, isWhitelistAffiliate);
}

if (options.orderBy !== undefined) {
for (const [column, order] of options.orderBy) {
baseQuery = baseQuery.orderBy(
Expand Down
2 changes: 2 additions & 0 deletions indexer/packages/postgres/src/types/db-model-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ export interface SubaccountFromDatabase extends IdBasedModelFromDatabase {
export interface WalletFromDatabase {
address: string,
totalTradingRewards: string,
totalVolume: string,
isWhitelistAffiliate: boolean,
}

export interface PerpetualPositionFromDatabase extends IdBasedModelFromDatabase {
Expand Down
2 changes: 2 additions & 0 deletions indexer/packages/postgres/src/types/query-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ export enum QueryableField {
USERNAME = 'username',
TIMESPAN = 'timeSpan',
RANK = 'rank',
IS_WHITELIST_AFFILIATE = 'isWhitelistAffiliate',
}

export interface QueryConfig {
Expand All @@ -110,6 +111,7 @@ export interface SubaccountUsernamesQueryConfig extends QueryConfig {

export interface WalletQueryConfig extends QueryConfig {
[QueryableField.ADDRESS]?: string;
[QueryableField.IS_WHITELIST_AFFILIATE]?: boolean;
}

export interface PerpetualPositionQueryConfig extends QueryConfig {
Expand Down
6 changes: 6 additions & 0 deletions indexer/packages/postgres/src/types/wallet-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,20 @@
export interface WalletCreateObject {
address: string,
totalTradingRewards: string,
totalVolume: string,
isWhitelistAffiliate: boolean,
}

export interface WalletUpdateObject {
address: string,
totalTradingRewards: string,
totalVolume: string,
isWhitelistAffiliate: boolean,
}

export enum WalletColumns {
address = 'address',
totalTradingRewards = 'totalTradingRewards',
totalVolume = 'totalVolume',
isWhitelistAffiliate = 'isWhitelistAffiliate',
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ import {
} from '@dydxprotocol-indexer/postgres/build/__tests__/helpers/constants';
import Big from 'big.js';

const defaultWallet = {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: why not use testConstants.defaultWallet imported from postgres?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

good point

...testConstants.defaultWallet,
address: defaultWalletAddress, // defaultWalletAddress != testConstants.defaultWallet.address

};

describe('transfers-controller#V4', () => {
beforeAll(async () => {
await dbHelpers.migrate();
Expand All @@ -53,10 +59,8 @@ describe('transfers-controller#V4', () => {
createdAt: testConstants.createdDateTime.toISO(),
createdAtHeight: testConstants.createdHeight,
};
await WalletTable.create({
address: testConstants.defaultWalletAddress,
totalTradingRewards: '0',
});
// use wallet2 to not create duplicate
await WalletTable.create(testConstants.defaultWallet2);
await Promise.all([
TransferTable.create(testConstants.defaultTransfer),
TransferTable.create(transfer2),
Expand Down Expand Up @@ -177,10 +181,7 @@ describe('transfers-controller#V4', () => {
createdAt: testConstants.createdDateTime.toISO(),
createdAtHeight: testConstants.createdHeight,
};
await WalletTable.create({
address: testConstants.defaultWalletAddress,
totalTradingRewards: '0',
});
await WalletTable.create(defaultWallet);
await Promise.all([
TransferTable.create(testConstants.defaultTransfer),
TransferTable.create(transfer2),
Expand Down Expand Up @@ -458,10 +459,7 @@ describe('transfers-controller#V4', () => {
createdAt: testConstants.createdDateTime.toISO(),
createdAtHeight: testConstants.createdHeight,
};
await WalletTable.create({
address: testConstants.defaultWalletAddress,
totalTradingRewards: '0',
});
await WalletTable.create(defaultWallet);
await Promise.all([
TransferTable.create(testConstants.defaultTransfer),
TransferTable.create(transfer2),
Expand Down Expand Up @@ -582,10 +580,7 @@ describe('transfers-controller#V4', () => {
createdAt: testConstants.createdDateTime.toISO(),
createdAtHeight: testConstants.createdHeight,
};
await WalletTable.create({
address: testConstants.defaultWalletAddress,
totalTradingRewards: '0',
});
await WalletTable.create(defaultWallet);
await Promise.all([
TransferTable.create(testConstants.defaultTransfer),
TransferTable.create(transfer2),
Expand Down Expand Up @@ -735,10 +730,7 @@ describe('transfers-controller#V4', () => {
createdAt: testConstants.createdDateTime.toISO(),
createdAtHeight: testConstants.createdHeight,
};
await WalletTable.create({
address: testConstants.defaultWalletAddress,
totalTradingRewards: '0',
});
await WalletTable.create(defaultWallet);
await Promise.all([
TransferTable.create(testConstants.defaultTransfer),
TransferTable.create(transfer2),
Expand Down Expand Up @@ -821,10 +813,7 @@ describe('transfers-controller#V4', () => {
createdAt: createdDateTime.toISO(),
createdAtHeight: createdHeight,
};
await WalletTable.create({
address: testConstants.defaultWalletAddress,
totalTradingRewards: '0',
});
await WalletTable.create(defaultWallet);
await Promise.all([
TransferTable.create(transferFromNonParent),
TransferTable.create(transferToNonParent),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,9 @@ describe('tradingRewardHandler', () => {
const wallet: WalletFromDatabase | undefined = await WalletTable.findById(
testConstants.defaultWallet.address,
);

expect(wallet).toEqual({
address: testConstants.defaultWallet.address,
...testConstants.defaultWallet,
totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(1_000_000_000),
});
});
Expand All @@ -195,7 +196,7 @@ describe('tradingRewardHandler', () => {
});

await WalletTable.update({
address: testConstants.defaultWallet.address,
...testConstants.defaultWallet,
totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(1_000_000_000),
});

Expand All @@ -204,7 +205,7 @@ describe('tradingRewardHandler', () => {
testConstants.defaultWallet.address,
);
expect(wallet).toEqual({
address: testConstants.defaultWallet.address,
...testConstants.defaultWallet,
totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(2_000_000_000),
});
});
Expand Down
Loading
Loading