From 1bcfb52c4644809403148d43cde4022ae153a026 Mon Sep 17 00:00:00 2001 From: rabi-siddique Date: Thu, 2 May 2024 20:10:32 +0500 Subject: [PATCH] chore: verify BLD transactions and handle multiple tokens --- src/mappings/events/balances.ts | 30 ++++++++++++++++++++----- src/mappings/mappingHandlers.ts | 39 +++++++++++++++++++++------------ 2 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/mappings/events/balances.ts b/src/mappings/events/balances.ts index 56545d92..9aad7669 100644 --- a/src/mappings/events/balances.ts +++ b/src/mappings/events/balances.ts @@ -16,6 +16,11 @@ export enum Operation { Increment = 'increment', Decrement = 'decrement', } + +interface BLDTransaction { + isBLDTransaction: boolean; + amount: string; +} export const balancesEventKit = () => { function getAttributeValue(decodedData: DecodedEvent, key: string) { const attribute = decodedData.attributes.find((attr) => attr.key === key); @@ -63,11 +68,26 @@ export const balancesEventKit = () => { logger.info(`Created new entry for address: ${address}`); } - function isBLDTransaction(amount: string) { - if (amount.slice(-4) === 'ubld') { - return true; + function validateBLDTransaction(amount: string | null): BLDTransaction { + const result: BLDTransaction = { + isBLDTransaction: false, + amount: '', + }; + + if (!amount) { + return result; } - return false; + const coins = amount.split(','); + + for (let coin of coins) { + if (coin.endsWith('ubld')) { + result.isBLDTransaction = true; + result.amount = coin; + return result; + } + } + + return result; } async function updateBalance( @@ -110,7 +130,7 @@ export const balancesEventKit = () => { } return { - isBLDTransaction, + validateBLDTransaction, getAttributeValue, decodeEvent, addressExists, diff --git a/src/mappings/mappingHandlers.ts b/src/mappings/mappingHandlers.ts index e049ef54..22d614d4 100644 --- a/src/mappings/mappingHandlers.ts +++ b/src/mappings/mappingHandlers.ts @@ -205,8 +205,11 @@ export async function handleTransferEvent( return; } - if (!transactionAmount || !balancesKit.isBLDTransaction(transactionAmount)) { - logger.error(`Amount ${transactionAmount?.slice(0, -4)} invalid.`); + const { isBLDTransaction, amount } = + balancesKit.validateBLDTransaction(transactionAmount); + + if (!transactionAmount || !isBLDTransaction) { + logger.error(`Amount ${transactionAmount} invalid.`); return; } @@ -223,11 +226,19 @@ export async function handleTransferEvent( await balancesKit.createBalancesEntry(senderAddress); } - const adjustedAmount = BigInt(Math.round(Number(transactionAmount.slice(0, -4)))); + const adjustedAmount = BigInt(Math.round(Number(amount.slice(0, -4)))); await Promise.all([ - balancesKit.updateBalance(senderAddress, adjustedAmount, Operation.Decrement), - balancesKit.updateBalance(recipientAddress, adjustedAmount, Operation.Increment), + balancesKit.updateBalance( + senderAddress, + adjustedAmount, + Operation.Decrement + ), + balancesKit.updateBalance( + recipientAddress, + adjustedAmount, + Operation.Increment + ), ]); } @@ -235,7 +246,7 @@ export async function handleBalanceEvent( cosmosEvent: CosmosEvent ): Promise { const { event } = cosmosEvent; - + const incrementEventTypes = [ EVENT_TYPES.COMMISSION, EVENT_TYPES.REWARDS, @@ -244,10 +255,7 @@ export async function handleBalanceEvent( EVENT_TYPES.COINBASE, ]; - const decrementEventTypes = [ - EVENT_TYPES.COIN_SPENT, - EVENT_TYPES.BURN, - ]; + const decrementEventTypes = [EVENT_TYPES.COIN_SPENT, EVENT_TYPES.BURN]; let operation: Operation | null = null; @@ -261,7 +269,7 @@ export async function handleBalanceEvent( } logger.info(`Event:${event.type}`); - + const balancesKit = balancesEventKit(); const decodedData: DecodedEvent = balancesKit.decodeEvent(cosmosEvent); logger.info(`Decoded transaction data ${JSON.stringify(decodedData)}`); @@ -281,7 +289,10 @@ export async function handleBalanceEvent( return; } - if (!transactionAmount || !balancesKit.isBLDTransaction(transactionAmount)) { + const { isBLDTransaction, amount } = + balancesKit.validateBLDTransaction(transactionAmount); + + if (!transactionAmount || !isBLDTransaction) { logger.error(`Amount ${transactionAmount} invalid.`); return; } @@ -292,6 +303,6 @@ export async function handleBalanceEvent( await balancesKit.createBalancesEntry(address); } - const amount = BigInt(Math.round(Number(transactionAmount.slice(0, -4)))); - await balancesKit.updateBalance(address, amount, operation); + const formattedAmount = BigInt(Math.round(Number(amount.slice(0, -4)))); + await balancesKit.updateBalance(address, formattedAmount, operation); }