diff --git a/schema.graphql b/schema.graphql index d47d34fc..8dfd20aa 100644 --- a/schema.graphql +++ b/schema.graphql @@ -144,6 +144,11 @@ type VaultManagerGovernanceJson @jsonField { liquidationMarginNumerator: BigInt } +type OraclePriceJson @jsonField { + typeInAmount: BigInt + typeOutAmount: BigInt +} + type VaultLiquidation @entity { id: ID! blockHeight: BigInt! @@ -158,6 +163,7 @@ type VaultLiquidation @entity { currentState: Vault! liquidatingState: VaultLiquidation! vaultManagerGovernance: VaultManagerGovernanceJson + oraclePrice: OraclePriceJson } type VaultManagerMetrics @entity { diff --git a/src/mappings/events/vaults.ts b/src/mappings/events/vaults.ts index 922f69a8..7899e059 100644 --- a/src/mappings/events/vaults.ts +++ b/src/mappings/events/vaults.ts @@ -6,6 +6,7 @@ import { Wallet, Vault, VaultLiquidation, + OraclePrice, } from '../../types'; import { VAULT_STATES } from '../constants'; import { dateToDayKey, extractBrand } from '../utils'; @@ -77,6 +78,9 @@ export const vaultsEventKit = (block: any, data: any, module: string, path: stri async function saveVaultsLiquidation(payload: any): Promise { const id = `${path}-${payload?.vaultState}`; const liquidatingId = `${path}-${VAULT_STATES.LIQUIDATING}`; + + const denom = payload?.locked?.__brand; + let vault = await VaultLiquidation.get(id); if (!vault) { vault = new VaultLiquidation( @@ -92,15 +96,25 @@ export const vaultsEventKit = (block: any, data: any, module: string, path: stri const vaultGovernanceId = id.split('.').slice(0, 4).join('.') + '.governance'; const vaultManagerGovernance = await VaultManagerGovernance.get(vaultGovernanceId); - if (vaultManagerGovernance && payload?.vaultState === 'liquidated' && vault.vaultManagerGovernance === undefined) { - vault.vaultManagerGovernance = { - liquidationMarginNumerator: vaultManagerGovernance?.liquidationMarginNumerator, - liquidationMarginDenominator: vaultManagerGovernance?.liquidationMarginDenominator, - }; + const oraclPriceId = `${denom}-USD`; + const oraclePrice = await OraclePrice.get(oraclPriceId); + + if (payload?.vaultState === 'liquidated') { + if (vaultManagerGovernance && vault.vaultManagerGovernance === undefined) + vault.vaultManagerGovernance = { + liquidationMarginNumerator: vaultManagerGovernance.liquidationMarginNumerator, + liquidationMarginDenominator: vaultManagerGovernance.liquidationMarginDenominator, + }; + + if (oraclePrice && vault.oraclePrice === undefined) + vault.oraclePrice = { + typeInAmount: oraclePrice.typeInAmount, + typeOutAmount: oraclePrice.typeOutAmount, + }; } - vault.coin = payload?.locked?.__brand; - vault.denom = payload?.locked?.__brand; + vault.coin = denom; + vault.denom = denom; vault.debt = payload?.debtSnapshot?.debt?.__value; vault.balance = payload?.locked?.__value; vault.lockedValue = payload?.locked?.__value;