diff --git a/indexer/packages/postgres/__tests__/helpers/constants.ts b/indexer/packages/postgres/__tests__/helpers/constants.ts index 8fec414605..49df378318 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 cc210f63fb..a2c52739ce 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 e7e5f2d1cb..a8b9a53a00 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 0000000000..038e0b14c3 --- /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('wallets', (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 8825aab74d..e4661abbcb 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 42dd465074..fff59d251c 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 66e52d0036..f2dea5e936 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 a8ef3567e1..a89c3c027e 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 b99fe937b9..608c4bab1c 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 22845f7121..28d02b00af 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;