diff --git a/db/migrations/1776422376102-Data.js b/db/migrations/1776771673268-Data.js similarity index 99% rename from db/migrations/1776422376102-Data.js rename to db/migrations/1776771673268-Data.js index 1968c8c7..c34ead56 100644 --- a/db/migrations/1776422376102-Data.js +++ b/db/migrations/1776771673268-Data.js @@ -1,5 +1,5 @@ -module.exports = class Data1776422376102 { - name = 'Data1776422376102' +module.exports = class Data1776771673268 { + name = 'Data1776771673268' async up(db) { await db.query(`CREATE TABLE "util_cache" ("id" character varying NOT NULL, "data" jsonb NOT NULL, CONSTRAINT "PK_d8dba67b2f156e569ad7ecf21d6" PRIMARY KEY ("id"))`) @@ -417,9 +417,11 @@ module.exports = class Data1776422376102 { await db.query(`CREATE INDEX "IDX_091cfbe0d977006e05144bd1fe" ON "o_token_vault" ("timestamp") `) await db.query(`CREATE INDEX "IDX_fa92b36d011441a02d9a231860" ON "o_token_vault" ("block_number") `) await db.query(`CREATE INDEX "IDX_3a2bfb2808c1d7cbb0a568910c" ON "o_token_vault" ("address") `) - await db.query(`CREATE TABLE "o_token_activity" ("id" character varying NOT NULL, "chain_id" integer NOT NULL, "otoken" text NOT NULL, "timestamp" TIMESTAMP WITH TIME ZONE NOT NULL, "block_number" integer NOT NULL, "tx_hash" text NOT NULL, "type" character varying(12), "data" jsonb, CONSTRAINT "PK_a6e9207d04e252b4de591283276" PRIMARY KEY ("id"))`) + await db.query(`CREATE TABLE "o_token_activity" ("id" character varying NOT NULL, "chain_id" integer NOT NULL, "otoken" text NOT NULL, "account" text, "counterparty" text, "timestamp" TIMESTAMP WITH TIME ZONE NOT NULL, "block_number" integer NOT NULL, "tx_hash" text NOT NULL, "type" character varying(12), "data" jsonb, CONSTRAINT "PK_a6e9207d04e252b4de591283276" PRIMARY KEY ("id"))`) await db.query(`CREATE INDEX "IDX_9c617918c3dc521bed5220a185" ON "o_token_activity" ("chain_id") `) await db.query(`CREATE INDEX "IDX_62bfeb1dee3bcefffdbd10172a" ON "o_token_activity" ("otoken") `) + await db.query(`CREATE INDEX "IDX_6030e60850370dc382959fa76c" ON "o_token_activity" ("account") `) + await db.query(`CREATE INDEX "IDX_7d58e25d0c7b1ddb7a17fa844d" ON "o_token_activity" ("counterparty") `) await db.query(`CREATE INDEX "IDX_57bb1f7d2fd6fe063b9cd434b2" ON "o_token_activity" ("timestamp") `) await db.query(`CREATE INDEX "IDX_d6cba0877ee9f5332e6d97e758" ON "o_token_activity" ("block_number") `) await db.query(`CREATE INDEX "IDX_b5826e68934ff671bbe28836ec" ON "o_token_activity" ("tx_hash") `) @@ -915,6 +917,8 @@ module.exports = class Data1776422376102 { await db.query(`DROP TABLE "o_token_activity"`) await db.query(`DROP INDEX "public"."IDX_9c617918c3dc521bed5220a185"`) await db.query(`DROP INDEX "public"."IDX_62bfeb1dee3bcefffdbd10172a"`) + await db.query(`DROP INDEX "public"."IDX_6030e60850370dc382959fa76c"`) + await db.query(`DROP INDEX "public"."IDX_7d58e25d0c7b1ddb7a17fa844d"`) await db.query(`DROP INDEX "public"."IDX_57bb1f7d2fd6fe063b9cd434b2"`) await db.query(`DROP INDEX "public"."IDX_d6cba0877ee9f5332e6d97e758"`) await db.query(`DROP INDEX "public"."IDX_b5826e68934ff671bbe28836ec"`) diff --git a/schema.graphql b/schema.graphql index b7b0d874..d7cc42a8 100644 --- a/schema.graphql +++ b/schema.graphql @@ -1176,6 +1176,8 @@ type OTokenActivity @entity { id: ID! chainId: Int! @index otoken: String! @index + account: String @index + counterparty: String @index timestamp: DateTime! @index blockNumber: Int! @index txHash: String! @index diff --git a/src/main-ousd.ts b/src/main-ousd.ts index 1a0317d9..15b03dc0 100644 --- a/src/main-ousd.ts +++ b/src/main-ousd.ts @@ -3,10 +3,11 @@ import 'tsconfig-paths/register' import { defineSquidProcessor } from '@originprotocol/squid-utils' import * as exchangeRatesPostProcessor from '@shared/post-processors/exchange-rates' +import { createOTokenActivityProcessor } from '@templates/otoken/activity-processor/activity-processor' import { createMorphoVaultApyProcessor } from '@templates/morpho/processor' import { processStatus } from '@templates/processor-status' import { createOTokenWithdrawalsProcessor } from '@templates/withdrawals' -import { addresses } from '@utils/addresses' +import { WOUSD_ADDRESS, addresses } from '@utils/addresses' import { DEFAULT_FIELDS } from '@utils/batch-proccesor-fields' import { initProcessorFromDump } from '@utils/dumps' @@ -19,6 +20,13 @@ export const processor = defineSquidProcessor({ stateSchema: 'ousd-processor', processors: [ ousdProcessor, + createOTokenActivityProcessor({ + from: 11590995, + otokenAddress: addresses.ousd.address, + wotokenAddress: WOUSD_ADDRESS, + vaultAddress: addresses.ousd.vault, + cowSwap: false, + }), ousdStrategiesProcessor, createOTokenWithdrawalsProcessor({ name: 'OUSD', diff --git a/src/model/generated/oTokenActivity.model.ts b/src/model/generated/oTokenActivity.model.ts index e4557e69..e5a9eb42 100644 --- a/src/model/generated/oTokenActivity.model.ts +++ b/src/model/generated/oTokenActivity.model.ts @@ -18,6 +18,14 @@ export class OTokenActivity { @StringColumn_({nullable: false}) otoken!: string + @Index_() + @StringColumn_({nullable: true}) + account!: string | undefined | null + + @Index_() + @StringColumn_({nullable: true}) + counterparty!: string | undefined | null + @Index_() @DateTimeColumn_({nullable: false}) timestamp!: Date diff --git a/src/templates/otoken/activity-processor/activity-processor.ts b/src/templates/otoken/activity-processor/activity-processor.ts index db383461..75488ec1 100644 --- a/src/templates/otoken/activity-processor/activity-processor.ts +++ b/src/templates/otoken/activity-processor/activity-processor.ts @@ -85,9 +85,9 @@ export const createOTokenActivityProcessor = (params: { // Mints & Redeems vaultActivityProcessor({ otokenAddress: params.otokenAddress, vaultAddress: params.vaultAddress }), - // Transfers & Swaps + // Transfers transferActivityProcessor({ otokenAddress: params.otokenAddress }), - ]).filter((p) => p.name.includes('Approval')) + ]) const from = params.from const setup = (processor: EvmBatchProcessor) => { diff --git a/src/templates/otoken/activity-processor/utils.ts b/src/templates/otoken/activity-processor/utils.ts index 4a1d8dd2..ffd8db2a 100644 --- a/src/templates/otoken/activity-processor/utils.ts +++ b/src/templates/otoken/activity-processor/utils.ts @@ -26,6 +26,8 @@ export const createActivity = ( status?: T['status'] } & Omit, ) => { + const { account, counterparty } = extractParticipants(partial) + const activity = new OTokenActivity({ chainId: ctx.chain.id, blockNumber: block.header.height, @@ -33,6 +35,8 @@ export const createActivity = ( txHash: log.transactionHash, type: OTokenActivityType[partial.type], otoken: otokenAddress, + account, + counterparty, data: { status: 'success', ...partial, @@ -47,3 +51,34 @@ export const createActivity = ( return activity } + +const extractParticipants = (partial: Record) => { + const account = firstAddress([ + partial.account, + partial.sender, + partial.from, + partial.owner, + partial.transactor, + partial.delegator, + partial.voter, + ]) + + const counterparty = firstAddress([ + partial.to, + partial.receiver, + partial.spender, + partial.delegateTo, + ]) + + return { account, counterparty } +} + +const firstAddress = (values: unknown[]) => { + for (const value of values) { + if (typeof value === 'string' && value.startsWith('0x') && value.length === 42) { + return value.toLowerCase() + } + } + + return null +} diff --git a/src/templates/otoken/otoken.graphql b/src/templates/otoken/otoken.graphql index 6179cb4e..bb0114fe 100644 --- a/src/templates/otoken/otoken.graphql +++ b/src/templates/otoken/otoken.graphql @@ -135,6 +135,8 @@ type OTokenActivity @entity { id: ID! chainId: Int! @index otoken: String! @index + account: String @index + counterparty: String @index timestamp: DateTime! @index blockNumber: Int! @index txHash: String! @index