From 880ff9fdbcb58b7d8f9b02bef9e0243345021300 Mon Sep 17 00:00:00 2001 From: Fraz Arshad Date: Wed, 15 May 2024 13:26:43 +0500 Subject: [PATCH] feat: added vaultStateDaily entity --- schema.graphql | 11 +++++ src/mappings/constants.ts | 2 + src/mappings/events/vaults.ts | 80 ++++++++++++++++++++++++++++++++++- 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/schema.graphql b/schema.graphql index ee51c0eb..404daeba 100644 --- a/schema.graphql +++ b/schema.graphql @@ -280,3 +280,14 @@ type IBCTransfer @entity { amount: String! transferType: TransferType! } + +type VaultStatesDaily @entity { + id: ID! + blockHeightLast: BigInt! + blockTimeLast: Date! + active: BigInt! + closed: BigInt! + liquidating: BigInt! + liquidated: BigInt! + liquidatedClosed: BigInt! +} diff --git a/src/mappings/constants.ts b/src/mappings/constants.ts index 9dff9cdd..34b97eb5 100644 --- a/src/mappings/constants.ts +++ b/src/mappings/constants.ts @@ -24,6 +24,8 @@ export const EVENT_TYPES = { }; export const VAULT_STATES = { + ACTIVE: 'active', + CLOSED: 'closed', LIQUIDATING: 'liquidating', LIQUIDATED: 'liquidated', }; diff --git a/src/mappings/events/vaults.ts b/src/mappings/events/vaults.ts index 00535679..8f15138a 100644 --- a/src/mappings/events/vaults.ts +++ b/src/mappings/events/vaults.ts @@ -1,4 +1,3 @@ -import { P } from 'pino'; import { VaultManagerMetrics, VaultManagerMetricsDaily, @@ -6,6 +5,7 @@ import { Wallet, Vault, VaultLiquidation, + VaultStatesDaily, } from '../../types'; import { VAULT_STATES } from '../constants'; import { dateToDayKey, extractBrand } from '../utils'; @@ -53,8 +53,84 @@ export const vaultsEventKit = (block: any, data: any, module: string, path: stri return promises; } + async function updateDailyVaultState( + oldState: string | undefined, + newState: string, + blockTime: Date, + blockHeight: number, + ): Promise { + const dateKey = dateToDayKey(blockTime).toString(); + let vaultState: VaultStatesDaily | undefined = await VaultStatesDaily.get(dateKey); + + if (!vaultState) { + const yesterdayDate = new Date(blockTime); + yesterdayDate.setDate(yesterdayDate.getDate() - 1); + const yesterdayDateKey = dateToDayKey(yesterdayDate).toString(); + const yesterdayVaultState: VaultStatesDaily | undefined = await VaultStatesDaily.get(yesterdayDateKey); + + if (yesterdayVaultState) { + vaultState = new VaultStatesDaily( + dateKey, + BigInt(blockHeight), + blockTime, + yesterdayVaultState.active, + yesterdayVaultState.closed, + yesterdayVaultState.liquidating, + yesterdayVaultState.liquidated, + yesterdayVaultState.liquidatedClosed, + ); + } else { + vaultState = new VaultStatesDaily( + dateKey, + BigInt(blockHeight), + blockTime, + BigInt(0), + BigInt(0), + BigInt(0), + BigInt(0), + BigInt(0), + ); + } + } + + const propertyMap = { + [VAULT_STATES.ACTIVE]: 'active', + [VAULT_STATES.LIQUIDATED]: 'liquidated', + [VAULT_STATES.LIQUIDATING]: 'liquidating', + [VAULT_STATES.CLOSED]: 'closed', + }; + + const closedPropertyMap = { + [VAULT_STATES.ACTIVE]: 'closed', + [VAULT_STATES.LIQUIDATED]: 'liquidatedClosed', + }; + + if (oldState) { + const oldProperty = propertyMap[oldState]; + if ((vaultState as any)[oldProperty] === BigInt(0)) { + throw Error(oldState + ' vaults are 0. cannot subtract more'); + } + (vaultState as any)[oldProperty] -= BigInt(1); + } + + const newProperty = + newState === VAULT_STATES.CLOSED && oldState ? closedPropertyMap[oldState] : propertyMap[newState]; + (vaultState as any)[newProperty] += BigInt(1); + + vaultState.blockHeightLast = BigInt(blockHeight); + vaultState.blockTimeLast = blockTime; + + return vaultState; + } + async function saveVaults(payload: any): Promise[]> { let vault = await Vault.get(path); + const dailyVaultState = await updateDailyVaultState( + vault?.state, + payload?.vaultState, + block.block.header.time, + data.blockHeight, + ); if (!vault) { vault = new Vault(path, BigInt(data.blockHeight), block.block.header.time as any, ''); } @@ -71,7 +147,7 @@ export const vaultsEventKit = (block: any, data: any, module: string, path: stri liquidation = await saveVaultsLiquidation(payload); } - return [liquidation, vault.save()]; + return [liquidation, vault.save(), dailyVaultState.save()]; } async function saveVaultsLiquidation(payload: any): Promise {