From 5cc6cbfc2e89b96c85e4aa096e8119b8b665003e Mon Sep 17 00:00:00 2001 From: Christopher Li Date: Wed, 29 Nov 2023 13:05:59 -0500 Subject: [PATCH] [IND-495]: Update wallets postgres table with totalTradingRewards field --- .../postgres/__tests__/helpers/constants.ts | 1 + .../__tests__/stores/transfer-table.test.ts | 2 ++ .../__tests__/stores/wallet-table.test.ts | 1 + ...8175805_add_wallets_total_trading_rewards.ts | 17 +++++++++++++++++ .../postgres/src/models/wallet-model.ts | 5 +++++ .../postgres/src/types/db-model-types.ts | 1 + .../packages/postgres/src/types/wallet-types.ts | 2 ++ .../api/v4/transfers-controller.test.ts | 1 + .../__tests__/handlers/transfer-handler.test.ts | 15 ++++++++++++--- .../ender/src/scripts/dydx_transfer_handler.sql | 4 +++- 10 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 indexer/packages/postgres/src/db/migrations/migration_files/20231128175805_add_wallets_total_trading_rewards.ts diff --git a/indexer/packages/postgres/__tests__/helpers/constants.ts b/indexer/packages/postgres/__tests__/helpers/constants.ts index 8fec4146056..49df3783186 100644 --- a/indexer/packages/postgres/__tests__/helpers/constants.ts +++ b/indexer/packages/postgres/__tests__/helpers/constants.ts @@ -96,6 +96,7 @@ export const defaultSubaccountId3: string = SubaccountTable.uuid( // ============== Wallets ============== export const defaultWallet: WalletCreateObject = { address: defaultAddress, + totalTradingRewards: '0', }; // ============== Assets ============== diff --git a/indexer/packages/postgres/__tests__/stores/transfer-table.test.ts b/indexer/packages/postgres/__tests__/stores/transfer-table.test.ts index cc210f63fb9..a2c52739cee 100644 --- a/indexer/packages/postgres/__tests__/stores/transfer-table.test.ts +++ b/indexer/packages/postgres/__tests__/stores/transfer-table.test.ts @@ -267,6 +267,7 @@ describe('Transfer store', () => { it('Recipient/sender must exist', async () => { await WalletTable.create({ address: defaultWalletAddress, + totalTradingRewards: '0', }); const invalidDeposit: TransferCreateObject = { ...defaultDeposit, @@ -297,6 +298,7 @@ describe('Transfer store', () => { it('Successfully creates/finds a transfer/deposit/withdrawal', async () => { await WalletTable.create({ address: defaultWalletAddress, + totalTradingRewards: '0', }); 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 e7e5f2d1cb4..a8b9a53a007 100644 --- a/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts +++ b/indexer/packages/postgres/__tests__/stores/wallet-table.test.ts @@ -40,6 +40,7 @@ describe('Wallet store', () => { WalletTable.create(defaultWallet), WalletTable.create({ address: 'fake_address', + totalTradingRewards: '0', }), ]); diff --git a/indexer/packages/postgres/src/db/migrations/migration_files/20231128175805_add_wallets_total_trading_rewards.ts b/indexer/packages/postgres/src/db/migrations/migration_files/20231128175805_add_wallets_total_trading_rewards.ts new file mode 100644 index 00000000000..e0e6ca900c0 --- /dev/null +++ b/indexer/packages/postgres/src/db/migrations/migration_files/20231128175805_add_wallets_total_trading_rewards.ts @@ -0,0 +1,17 @@ +import * as Knex from 'knex'; + +export async function up(knex: Knex): Promise { + return knex + .schema + .alterTable('wallets', (table) => { + table.decimal('totalTradingRewards', null).defaultTo('0').notNullable(); + }); +} + +export async function down(knex: Knex): Promise { + return knex + .schema + .alterTable('perpetual_markets', (table) => { + table.dropColumn('totalTradingRewards'); + }); +} diff --git a/indexer/packages/postgres/src/models/wallet-model.ts b/indexer/packages/postgres/src/models/wallet-model.ts index 8825aab74d0..e4661abbcb4 100644 --- a/indexer/packages/postgres/src/models/wallet-model.ts +++ b/indexer/packages/postgres/src/models/wallet-model.ts @@ -1,3 +1,4 @@ +import { NumericPattern } from '../lib/validators'; import UpsertQueryBuilder from '../query-builders/upsert'; import BaseModel from './base-model'; @@ -17,9 +18,11 @@ export default class WalletModel extends BaseModel { type: 'object', required: [ 'address', + 'totalTradingRewards', ], properties: { address: { type: 'string' }, + totalTradingRewards: { type: 'string', pattern: NumericPattern }, }, }; } @@ -39,4 +42,6 @@ export default class WalletModel extends BaseModel { QueryBuilderType!: UpsertQueryBuilder; address!: string; + + totalTradingRewards!: string; } diff --git a/indexer/packages/postgres/src/types/db-model-types.ts b/indexer/packages/postgres/src/types/db-model-types.ts index 42dd465074d..fff59d251c0 100644 --- a/indexer/packages/postgres/src/types/db-model-types.ts +++ b/indexer/packages/postgres/src/types/db-model-types.ts @@ -25,6 +25,7 @@ export interface SubaccountFromDatabase extends IdBasedModelFromDatabase { export interface WalletFromDatabase { address: string, + totalTradingRewards: string, } export interface PerpetualPositionFromDatabase extends IdBasedModelFromDatabase { diff --git a/indexer/packages/postgres/src/types/wallet-types.ts b/indexer/packages/postgres/src/types/wallet-types.ts index 66e52d00360..f2dea5e936c 100644 --- a/indexer/packages/postgres/src/types/wallet-types.ts +++ b/indexer/packages/postgres/src/types/wallet-types.ts @@ -2,8 +2,10 @@ export interface WalletCreateObject { address: string, + totalTradingRewards: string, } export enum WalletColumns { address = 'address', + totalTradingRewards = 'totalTradingRewards', } 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 a8ef3567e16..a89c3c027ea 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 @@ -39,6 +39,7 @@ describe('transfers-controller#V4', () => { }; await WalletTable.create({ address: testConstants.defaultWalletAddress, + totalTradingRewards: '0', }); await Promise.all([ TransferTable.create(testConstants.defaultTransfer), diff --git a/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts b/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts index b99fe937b9e..608c4bab1c9 100644 --- a/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts +++ b/indexer/services/ender/__tests__/handlers/transfer-handler.test.ts @@ -301,7 +301,10 @@ describe('transferHandler', () => { const wallet: WalletFromDatabase | undefined = await WalletTable.findById( defaultWalletAddress, ); - expect(wallet).toBeDefined(); + expect(wallet).toEqual({ + address: defaultWalletAddress, + totalTradingRewards: '0', + }); }); it('creates new deposit for previously non-existent subaccount', async () => { @@ -350,7 +353,10 @@ describe('transferHandler', () => { defaultRecipientSubaccountId, ); expect(newRecipientSubaccount).toBeDefined(); - expect(wallet).toBeDefined(); + expect(wallet).toEqual({ + address: defaultWalletAddress, + totalTradingRewards: '0', + }); }); it('creates new withdrawal for existing subaccount', async () => { @@ -400,7 +406,10 @@ describe('transferHandler', () => { const wallet: WalletFromDatabase | undefined = await WalletTable.findById( defaultWalletAddress, ); - expect(wallet).toBeDefined(); + expect(wallet).toEqual({ + address: defaultWalletAddress, + totalTradingRewards: '0', + }); }); it('creates new transfer and the recipient subaccount', async () => { diff --git a/indexer/services/ender/src/scripts/dydx_transfer_handler.sql b/indexer/services/ender/src/scripts/dydx_transfer_handler.sql index 22845f71219..28d02b00af9 100644 --- a/indexer/services/ender/src/scripts/dydx_transfer_handler.sql +++ b/indexer/services/ender/src/scripts/dydx_transfer_handler.sql @@ -54,6 +54,7 @@ BEGIN transfer_record."recipientWalletAddress" = event_data->'recipient'->>'address'; recipient_wallet_record."address" = transfer_record."recipientWalletAddress"; + recipient_wallet_record."totalTradingRewards" = '0'; INSERT INTO wallets VALUES (recipient_wallet_record.*) ON CONFLICT DO NOTHING; END IF; @@ -61,6 +62,7 @@ BEGIN transfer_record."senderWalletAddress" = event_data->'sender'->>'address'; sender_wallet_record."address" = transfer_record."senderWalletAddress"; + sender_wallet_record."totalTradingRewards" = '0'; INSERT INTO wallets VALUES (sender_wallet_record.*) ON CONFLICT DO NOTHING; END IF; @@ -92,4 +94,4 @@ BEGIN dydx_to_jsonb(transfer_record) ); END; -$$ LANGUAGE plpgsql; \ No newline at end of file +$$ LANGUAGE plpgsql;