From 0f0a9d9d514457e3b96958b4485ba7682920e8dc Mon Sep 17 00:00:00 2001 From: Jerry Fan Date: Tue, 27 Aug 2024 17:37:44 -0400 Subject: [PATCH 1/4] add totalVolume and isWhitelistAffiliate columsn to wallets table --- .../postgres/__tests__/helpers/constants.ts | 8 +++++++ .../__tests__/stores/transfer-table.test.ts | 4 ++++ .../__tests__/stores/wallet-table.test.ts | 2 ++ ...s_total_volume_and_affiliates_whitelist.ts | 22 +++++++++++++++++++ .../postgres/src/models/wallet-model.ts | 20 +++++++---------- .../postgres/src/stores/wallet-table.ts | 6 +++++ .../postgres/src/types/db-model-types.ts | 2 ++ .../postgres/src/types/query-types.ts | 2 ++ .../postgres/src/types/wallet-types.ts | 6 +++++ .../api/v4/transfers-controller.test.ts | 12 ++++++++++ .../handlers/trading-rewards-handler.test.ts | 4 ++++ .../handlers/transfer-handler.test.ts | 6 +++++ .../handlers/dydx_transfer_handler.sql | 4 ++++ 13 files changed, 86 insertions(+), 12 deletions(-) create mode 100644 indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts diff --git a/indexer/packages/postgres/__tests__/helpers/constants.ts b/indexer/packages/postgres/__tests__/helpers/constants.ts index 7a8a9a224b..eed0c63e76 100644 --- a/indexer/packages/postgres/__tests__/helpers/constants.ts +++ b/indexer/packages/postgres/__tests__/helpers/constants.ts @@ -158,21 +158,29 @@ export const vaultSubaccountId: string = SubaccountTable.uuid( export const defaultWallet: WalletCreateObject = { address: defaultAddress, totalTradingRewards: denomToHumanReadableConversion(0), + totalVolume: denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }; export const defaultWallet2: WalletCreateObject = { address: defaultWalletAddress, totalTradingRewards: denomToHumanReadableConversion(1), + totalVolume: denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }; export const vaultWallet: WalletCreateObject = { address: vaultAddress, totalTradingRewards: denomToHumanReadableConversion(0), + totalVolume: denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }; export const defaultWallet3: WalletCreateObject = { address: defaultAddress2, totalTradingRewards: denomToHumanReadableConversion(0), + totalVolume: denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }; // ============== Assets ============== diff --git a/indexer/packages/postgres/__tests__/stores/transfer-table.test.ts b/indexer/packages/postgres/__tests__/stores/transfer-table.test.ts index 758fad9d67..a6f011bfe4 100644 --- a/indexer/packages/postgres/__tests__/stores/transfer-table.test.ts +++ b/indexer/packages/postgres/__tests__/stores/transfer-table.test.ts @@ -322,6 +322,8 @@ describe('Transfer store', () => { await WalletTable.create({ address: defaultWalletAddress, totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }); const invalidDeposit: TransferCreateObject = { ...defaultDeposit, @@ -353,6 +355,8 @@ describe('Transfer store', () => { await WalletTable.create({ address: defaultWalletAddress, totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }); await Promise.all([ TransferTable.create(defaultTransfer), diff --git a/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts b/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts index 84cbabf639..97cdc893ce 100644 --- a/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts +++ b/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts @@ -39,6 +39,8 @@ describe('Wallet store', () => { WalletTable.create({ address: 'fake_address', totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }), ]); diff --git a/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts b/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts new file mode 100644 index 0000000000..535ce10a8a --- /dev/null +++ b/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts @@ -0,0 +1,22 @@ +import * as Knex from "knex"; + + +export async function up(knex: Knex): Promise { + 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 { + return knex + .schema + .alterTable('wallets', (table) => { + table.dropColumn('totalVolume'); + table.dropColumn('isWhitelistAffiliate'); + }); +} + + diff --git a/indexer/packages/postgres/src/models/wallet-model.ts b/indexer/packages/postgres/src/models/wallet-model.ts index a588a2d275..848651d246 100644 --- a/indexer/packages/postgres/src/models/wallet-model.ts +++ b/indexer/packages/postgres/src/models/wallet-model.ts @@ -40,29 +40,25 @@ 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'}, }, }; } - /** - * A mapping from column name to JSON conversion expected. - * See getSqlConversionForDydxModelTypes for valid conversions. - * - * TODO(IND-239): Ensure that jsonSchema() / sqlToJsonConversions() / model fields match. - */ - static get sqlToJsonConversions() { - return { - address: 'string', - }; - } - QueryBuilderType!: UpsertQueryBuilder; address!: string; totalTradingRewards!: string; + + totalVolume!: string; + + isWhitelistAffiliate!: boolean; } diff --git a/indexer/packages/postgres/src/stores/wallet-table.ts b/indexer/packages/postgres/src/stores/wallet-table.ts index fd04bb560d..8869aa5d36 100644 --- a/indexer/packages/postgres/src/stores/wallet-table.ts +++ b/indexer/packages/postgres/src/stores/wallet-table.ts @@ -19,6 +19,7 @@ import { export async function findAll( { address, + isWhitelistAffiliate, limit, }: WalletQueryConfig, requiredFields: QueryableField[], @@ -27,6 +28,7 @@ export async function findAll( verifyAllRequiredFields( { address, + isWhitelistAffiliate, limit, } as QueryConfig, requiredFields, @@ -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( diff --git a/indexer/packages/postgres/src/types/db-model-types.ts b/indexer/packages/postgres/src/types/db-model-types.ts index 0436578514..0200c4029c 100644 --- a/indexer/packages/postgres/src/types/db-model-types.ts +++ b/indexer/packages/postgres/src/types/db-model-types.ts @@ -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 { diff --git a/indexer/packages/postgres/src/types/query-types.ts b/indexer/packages/postgres/src/types/query-types.ts index 75417a6d8b..ac5cc10d4c 100644 --- a/indexer/packages/postgres/src/types/query-types.ts +++ b/indexer/packages/postgres/src/types/query-types.ts @@ -88,6 +88,7 @@ export enum QueryableField { USERNAME = 'username', TIMESPAN = 'timeSpan', RANK = 'rank', + IS_WHITELIST_AFFILIATE = 'isWhitelistAffiliate', } export interface QueryConfig { @@ -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 { diff --git a/indexer/packages/postgres/src/types/wallet-types.ts b/indexer/packages/postgres/src/types/wallet-types.ts index 48ad8307af..2466c91d28 100644 --- a/indexer/packages/postgres/src/types/wallet-types.ts +++ b/indexer/packages/postgres/src/types/wallet-types.ts @@ -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', } diff --git a/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts b/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts index 1550753c81..102bab7fa5 100644 --- a/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts +++ b/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts @@ -56,6 +56,8 @@ describe('transfers-controller#V4', () => { await WalletTable.create({ address: testConstants.defaultWalletAddress, totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), @@ -180,6 +182,8 @@ describe('transfers-controller#V4', () => { await WalletTable.create({ address: testConstants.defaultWalletAddress, totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), @@ -461,6 +465,8 @@ describe('transfers-controller#V4', () => { await WalletTable.create({ address: testConstants.defaultWalletAddress, totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), @@ -585,6 +591,8 @@ describe('transfers-controller#V4', () => { await WalletTable.create({ address: testConstants.defaultWalletAddress, totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), @@ -738,6 +746,8 @@ describe('transfers-controller#V4', () => { await WalletTable.create({ address: testConstants.defaultWalletAddress, totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), @@ -824,6 +834,8 @@ describe('transfers-controller#V4', () => { await WalletTable.create({ address: testConstants.defaultWalletAddress, totalTradingRewards: '0', + totalVolume: '0', + isWhitelistAffiliate: false, }); await Promise.all([ TransferTable.create(transferFromNonParent), diff --git a/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts b/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts index a71039261e..4eee49c8bd 100644 --- a/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts @@ -197,6 +197,8 @@ describe('tradingRewardHandler', () => { await WalletTable.update({ address: testConstants.defaultWallet.address, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(1_000_000_000), + totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }); await onMessage(kafkaMessage); @@ -206,6 +208,8 @@ describe('tradingRewardHandler', () => { expect(wallet).toEqual({ address: testConstants.defaultWallet.address, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(2_000_000_000), + totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }); }); }); diff --git a/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts b/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts index 898f5d2697..71f0a81c7c 100644 --- a/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts @@ -306,6 +306,8 @@ describe('transferHandler', () => { expect(wallet).toEqual({ address: defaultWalletAddress, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), + totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }); }); @@ -358,6 +360,8 @@ describe('transferHandler', () => { expect(wallet).toEqual({ address: defaultWalletAddress, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), + totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }); }); @@ -411,6 +415,8 @@ describe('transferHandler', () => { expect(wallet).toEqual({ address: defaultWalletAddress, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), + totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + isWhitelistAffiliate: false, }); }); diff --git a/indexer/services/ender/src/scripts/handlers/dydx_transfer_handler.sql b/indexer/services/ender/src/scripts/handlers/dydx_transfer_handler.sql index ced6bb5cd3..4685be0de8 100644 --- a/indexer/services/ender/src/scripts/handlers/dydx_transfer_handler.sql +++ b/indexer/services/ender/src/scripts/handlers/dydx_transfer_handler.sql @@ -57,6 +57,8 @@ BEGIN recipient_wallet_record."address" = transfer_record."recipientWalletAddress"; recipient_wallet_record."totalTradingRewards" = '0'; + recipient_wallet_record."totalVolume" = '0'; + recipient_wallet_record."isWhitelistAffiliate" = FALSE; INSERT INTO wallets VALUES (recipient_wallet_record.*) ON CONFLICT DO NOTHING; END IF; @@ -65,6 +67,8 @@ BEGIN sender_wallet_record."address" = transfer_record."senderWalletAddress"; sender_wallet_record."totalTradingRewards" = '0'; + sender_wallet_record."totalVolume" = '0'; + sender_wallet_record."isWhitelistAffiliate" = FALSE; INSERT INTO wallets VALUES (sender_wallet_record.*) ON CONFLICT DO NOTHING; END IF; From d5f035fe6c7ea3f51cbc788872dd4fcd2845d3ed Mon Sep 17 00:00:00 2001 From: Jerry Fan Date: Wed, 28 Aug 2024 10:54:34 -0400 Subject: [PATCH 2/4] fix types --- .../postgres/__tests__/helpers/constants.ts | 10 +++--- .../__tests__/stores/wallet-table.test.ts | 32 +++++++++++++++++-- ...s_total_volume_and_affiliates_whitelist.ts | 2 +- .../handlers/trading-rewards-handler.test.ts | 6 ++-- .../handlers/transfer-handler.test.ts | 6 ++-- 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/indexer/packages/postgres/__tests__/helpers/constants.ts b/indexer/packages/postgres/__tests__/helpers/constants.ts index eed0c63e76..75adcdea16 100644 --- a/indexer/packages/postgres/__tests__/helpers/constants.ts +++ b/indexer/packages/postgres/__tests__/helpers/constants.ts @@ -158,29 +158,29 @@ export const vaultSubaccountId: string = SubaccountTable.uuid( export const defaultWallet: WalletCreateObject = { address: defaultAddress, totalTradingRewards: denomToHumanReadableConversion(0), - totalVolume: denomToHumanReadableConversion(0), + totalVolume: '0', isWhitelistAffiliate: false, }; export const defaultWallet2: WalletCreateObject = { address: defaultWalletAddress, totalTradingRewards: denomToHumanReadableConversion(1), - totalVolume: denomToHumanReadableConversion(0), + totalVolume: '0', isWhitelistAffiliate: false, }; export const vaultWallet: WalletCreateObject = { address: vaultAddress, totalTradingRewards: denomToHumanReadableConversion(0), - totalVolume: denomToHumanReadableConversion(0), + totalVolume: '0', isWhitelistAffiliate: false, }; export const defaultWallet3: WalletCreateObject = { address: defaultAddress2, totalTradingRewards: denomToHumanReadableConversion(0), - totalVolume: denomToHumanReadableConversion(0), - isWhitelistAffiliate: false, + totalVolume: '0', + isWhitelistAffiliate: true, }; // ============== Assets ============== diff --git a/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts b/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts index 97cdc893ce..c74bd3eb26 100644 --- a/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts +++ b/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts @@ -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', () => { @@ -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', + }); wallet = await WalletTable.findById(defaultWallet2.address); - expect(wallet).toEqual(expect.objectContaining(defaultWallet2)); + expect(wallet).toEqual(expect.objectContaining({ + ...defaultWallet2, + isWhitelistAffiliate: true, + totalVolume: '100', + })); }); it('Successfully finds all Wallets', async () => { @@ -66,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)); + }); }); diff --git a/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts b/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts index 535ce10a8a..ba58a82a77 100644 --- a/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts +++ b/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts @@ -5,7 +5,7 @@ export async function up(knex: Knex): Promise { return knex .schema .alterTable('wallets', (table) => { - table.decimal('totalVolume', null).defaultTo(0).notNullable(); + table.decimal('totalVolume', null).defaultTo('0').notNullable(); table.boolean('isWhitelistAffiliate').defaultTo(false).notNullable(); }); } diff --git a/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts b/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts index 4eee49c8bd..aa0de26209 100644 --- a/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts @@ -174,6 +174,8 @@ describe('tradingRewardHandler', () => { expect(wallet).toEqual({ address: testConstants.defaultWallet.address, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(1_000_000_000), + totalVolume: '0', + isWhitelistAffiliate: false, }); }); @@ -197,7 +199,7 @@ describe('tradingRewardHandler', () => { await WalletTable.update({ address: testConstants.defaultWallet.address, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(1_000_000_000), - totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + totalVolume: '0', isWhitelistAffiliate: false, }); @@ -208,7 +210,7 @@ describe('tradingRewardHandler', () => { expect(wallet).toEqual({ address: testConstants.defaultWallet.address, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(2_000_000_000), - totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + totalVolume: '0', isWhitelistAffiliate: false, }); }); diff --git a/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts b/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts index 71f0a81c7c..eb9855c129 100644 --- a/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts @@ -306,7 +306,7 @@ describe('transferHandler', () => { expect(wallet).toEqual({ address: defaultWalletAddress, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), - totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + totalVolume: '0', isWhitelistAffiliate: false, }); }); @@ -360,7 +360,7 @@ describe('transferHandler', () => { expect(wallet).toEqual({ address: defaultWalletAddress, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), - totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + totalVolume: '0', isWhitelistAffiliate: false, }); }); @@ -415,7 +415,7 @@ describe('transferHandler', () => { expect(wallet).toEqual({ address: defaultWalletAddress, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), - totalVolume: testConversionHelpers.denomToHumanReadableConversion(0), + totalVolume: '0', isWhitelistAffiliate: false, }); }); From c9e4411bb32f27787030cd3058d8449518ce1f4e Mon Sep 17 00:00:00 2001 From: Jerry Fan Date: Wed, 28 Aug 2024 11:07:07 -0400 Subject: [PATCH 3/4] change db default to number type --- .../__tests__/stores/wallet-table.test.ts | 8 ++++---- ...ets_total_volume_and_affiliates_whitelist.ts | 7 ++----- .../postgres/src/models/wallet-model.ts | 17 ++++++++++++++++- .../api/v4/transfers-controller.test.ts | 2 +- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts b/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts index c74bd3eb26..d5c01982ce 100644 --- a/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts +++ b/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts @@ -30,14 +30,14 @@ describe('Wallet store', () => { await WalletTable.upsert({ ...defaultWallet2, isWhitelistAffiliate: true, - totalVolume: '100', + totalVolume: '100.1', }); wallet = await WalletTable.findById(defaultWallet2.address); expect(wallet).toEqual(expect.objectContaining({ ...defaultWallet2, isWhitelistAffiliate: true, - totalVolume: '100', + totalVolume: '100.1', })); }); @@ -78,8 +78,8 @@ describe('Wallet store', () => { it('Successfully finds wallets by whitelist flag', async () => { await Promise.all([ WalletTable.create(defaultWallet3), - WalletTable.create(defaultWallet2) - ]) + WalletTable.create(defaultWallet2), + ]); const wallets: WalletFromDatabase[] = await WalletTable.findAll( { diff --git a/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts b/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts index ba58a82a77..59c026b2a0 100644 --- a/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts +++ b/indexer/packages/postgres/src/db/migrations/migration_files/20240827162119_add_wallets_total_volume_and_affiliates_whitelist.ts @@ -1,11 +1,10 @@ -import * as Knex from "knex"; - +import * as Knex from 'knex'; export async function up(knex: Knex): Promise { return knex .schema .alterTable('wallets', (table) => { - table.decimal('totalVolume', null).defaultTo('0').notNullable(); + table.decimal('totalVolume', null).defaultTo(0).notNullable(); table.boolean('isWhitelistAffiliate').defaultTo(false).notNullable(); }); } @@ -18,5 +17,3 @@ export async function down(knex: Knex): Promise { table.dropColumn('isWhitelistAffiliate'); }); } - - diff --git a/indexer/packages/postgres/src/models/wallet-model.ts b/indexer/packages/postgres/src/models/wallet-model.ts index 848651d246..dfa771ce94 100644 --- a/indexer/packages/postgres/src/models/wallet-model.ts +++ b/indexer/packages/postgres/src/models/wallet-model.ts @@ -47,11 +47,26 @@ export default class WalletModel extends BaseModel { address: { type: 'string' }, totalTradingRewards: { type: 'string', pattern: NonNegativeNumericPattern }, totalVolume: { type: 'string', pattern: NonNegativeNumericPattern }, - isWhitelistAffiliate: { type: 'boolean'}, + isWhitelistAffiliate: { type: 'boolean' }, }, }; } + /** + * A mapping from column name to JSON conversion expected. + * See getSqlConversionForDydxModelTypes for valid conversions. + * + * TODO(IND-239): Ensure that jsonSchema() / sqlToJsonConversions() / model fields match. + */ + static get sqlToJsonConversions() { + return { + address: 'string', + totalTradingRewards: 'string', + totalVolume: 'string', + isWhitelistAffiliate: 'boolean', + }; + } + QueryBuilderType!: UpsertQueryBuilder; address!: string; diff --git a/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts b/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts index 45fc385737..102bab7fa5 100644 --- a/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts +++ b/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts @@ -1173,4 +1173,4 @@ describe('transfers-controller#V4', () => { ); }); }); -}); \ No newline at end of file +}); From 8a8a2c1687f232e947e6ed04eb6f244576c09862 Mon Sep 17 00:00:00 2001 From: Jerry Fan Date: Wed, 28 Aug 2024 17:40:11 -0400 Subject: [PATCH 4/4] clean up some unit tests --- .../api/v4/transfers-controller.test.ts | 49 +++++-------------- .../handlers/trading-rewards-handler.test.ts | 13 ++--- .../handlers/transfer-handler.test.ts | 28 ++++------- 3 files changed, 26 insertions(+), 64 deletions(-) diff --git a/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts b/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts index 102bab7fa5..89646c3d1e 100644 --- a/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts +++ b/indexer/services/comlink/__tests__/controllers/api/v4/transfers-controller.test.ts @@ -27,6 +27,12 @@ import { } from '@dydxprotocol-indexer/postgres/build/__tests__/helpers/constants'; import Big from 'big.js'; +const defaultWallet = { + ...testConstants.defaultWallet, + address: defaultWalletAddress, // defaultWalletAddress != testConstants.defaultWallet.address + +}; + describe('transfers-controller#V4', () => { beforeAll(async () => { await dbHelpers.migrate(); @@ -53,12 +59,8 @@ describe('transfers-controller#V4', () => { createdAt: testConstants.createdDateTime.toISO(), createdAtHeight: testConstants.createdHeight, }; - await WalletTable.create({ - address: testConstants.defaultWalletAddress, - totalTradingRewards: '0', - totalVolume: '0', - isWhitelistAffiliate: false, - }); + // use wallet2 to not create duplicate + await WalletTable.create(testConstants.defaultWallet2); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), TransferTable.create(transfer2), @@ -179,12 +181,7 @@ describe('transfers-controller#V4', () => { createdAt: testConstants.createdDateTime.toISO(), createdAtHeight: testConstants.createdHeight, }; - await WalletTable.create({ - address: testConstants.defaultWalletAddress, - totalTradingRewards: '0', - totalVolume: '0', - isWhitelistAffiliate: false, - }); + await WalletTable.create(defaultWallet); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), TransferTable.create(transfer2), @@ -462,12 +459,7 @@ describe('transfers-controller#V4', () => { createdAt: testConstants.createdDateTime.toISO(), createdAtHeight: testConstants.createdHeight, }; - await WalletTable.create({ - address: testConstants.defaultWalletAddress, - totalTradingRewards: '0', - totalVolume: '0', - isWhitelistAffiliate: false, - }); + await WalletTable.create(defaultWallet); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), TransferTable.create(transfer2), @@ -588,12 +580,7 @@ describe('transfers-controller#V4', () => { createdAt: testConstants.createdDateTime.toISO(), createdAtHeight: testConstants.createdHeight, }; - await WalletTable.create({ - address: testConstants.defaultWalletAddress, - totalTradingRewards: '0', - totalVolume: '0', - isWhitelistAffiliate: false, - }); + await WalletTable.create(defaultWallet); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), TransferTable.create(transfer2), @@ -743,12 +730,7 @@ describe('transfers-controller#V4', () => { createdAt: testConstants.createdDateTime.toISO(), createdAtHeight: testConstants.createdHeight, }; - await WalletTable.create({ - address: testConstants.defaultWalletAddress, - totalTradingRewards: '0', - totalVolume: '0', - isWhitelistAffiliate: false, - }); + await WalletTable.create(defaultWallet); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), TransferTable.create(transfer2), @@ -831,12 +813,7 @@ describe('transfers-controller#V4', () => { createdAt: createdDateTime.toISO(), createdAtHeight: createdHeight, }; - await WalletTable.create({ - address: testConstants.defaultWalletAddress, - totalTradingRewards: '0', - totalVolume: '0', - isWhitelistAffiliate: false, - }); + await WalletTable.create(defaultWallet); await Promise.all([ TransferTable.create(transferFromNonParent), TransferTable.create(transferToNonParent), diff --git a/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts b/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts index aa0de26209..337f493777 100644 --- a/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/trading-rewards-handler.test.ts @@ -171,11 +171,10 @@ 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), - totalVolume: '0', - isWhitelistAffiliate: false, }); }); @@ -197,10 +196,8 @@ describe('tradingRewardHandler', () => { }); await WalletTable.update({ - address: testConstants.defaultWallet.address, + ...testConstants.defaultWallet, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(1_000_000_000), - totalVolume: '0', - isWhitelistAffiliate: false, }); await onMessage(kafkaMessage); @@ -208,10 +205,8 @@ describe('tradingRewardHandler', () => { testConstants.defaultWallet.address, ); expect(wallet).toEqual({ - address: testConstants.defaultWallet.address, + ...testConstants.defaultWallet, totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(2_000_000_000), - totalVolume: '0', - isWhitelistAffiliate: false, }); }); }); diff --git a/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts b/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts index eb9855c129..4f7f959070 100644 --- a/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts @@ -25,7 +25,7 @@ import { assetRefresher, WalletTable, WalletFromDatabase, - testConversionHelpers, + testConstants, } from '@dydxprotocol-indexer/postgres'; import { KafkaMessage } from 'kafkajs'; import { createKafkaMessage, producer } from '@dydxprotocol-indexer/kafka'; @@ -52,6 +52,11 @@ import { import { updateBlockCache } from '../../src/caches/block-cache'; import { createPostgresFunctions } from '../../src/helpers/postgres/postgres-functions'; +const defaultWallet = { + ...testConstants.defaultWallet, + address: defaultWalletAddress, +}; + describe('transferHandler', () => { beforeAll(async () => { await dbHelpers.migrate(); @@ -303,12 +308,7 @@ describe('transferHandler', () => { const wallet: WalletFromDatabase | undefined = await WalletTable.findById( defaultWalletAddress, ); - expect(wallet).toEqual({ - address: defaultWalletAddress, - totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), - totalVolume: '0', - isWhitelistAffiliate: false, - }); + expect(wallet).toEqual(defaultWallet); }); it('creates new deposit for previously non-existent subaccount', async () => { @@ -357,12 +357,7 @@ describe('transferHandler', () => { defaultRecipientSubaccountId, ); expect(newRecipientSubaccount).toBeDefined(); - expect(wallet).toEqual({ - address: defaultWalletAddress, - totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), - totalVolume: '0', - isWhitelistAffiliate: false, - }); + expect(wallet).toEqual(defaultWallet); }); it('creates new withdrawal for existing subaccount', async () => { @@ -412,12 +407,7 @@ describe('transferHandler', () => { const wallet: WalletFromDatabase | undefined = await WalletTable.findById( defaultWalletAddress, ); - expect(wallet).toEqual({ - address: defaultWalletAddress, - totalTradingRewards: testConversionHelpers.denomToHumanReadableConversion(0), - totalVolume: '0', - isWhitelistAffiliate: false, - }); + expect(wallet).toEqual(defaultWallet); }); it('creates new transfer and the recipient subaccount', async () => {