diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ca9a3514..8cdf73987 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - [ExperimentalWebviewProvider: fix android communication](https://github.com/multiversx/mx-sdk-dapp/pull/1163) -- +- [Extract MultiEsdtTrasfer parser for multiple transactions in a separate function](https://github.com/multiversx/mx-sdk-dapp/pull/1157) + ## [[v2.31.7]](https://github.com/multiversx/mx-sdk-dapp/pull/1161)] - 2024-04-23 - [Fixed `AuthenticatedRoutesWrapper` redirects to unlock route during webview login](https://github.com/multiversx/mx-sdk-dapp/pull/1160) diff --git a/src/hooks/transactions/useParseMultiEsdtTransferData.ts b/src/hooks/transactions/useParseMultiEsdtTransferData.ts index 2b88ccc89..e0d7551bd 100644 --- a/src/hooks/transactions/useParseMultiEsdtTransferData.ts +++ b/src/hooks/transactions/useParseMultiEsdtTransferData.ts @@ -5,8 +5,7 @@ import { TransactionDataTokenType, TransactionsDataTokensType } from 'types'; -import { getTokenFromData } from 'utils/transactions/getTokenFromData'; -import { parseMultiEsdtTransferData } from 'utils/transactions/parseMultiEsdtTransferData'; +import { parseMultiEsdtTransferDataForMultipleTransactions } from 'utils/transactions/parseMultiEsdtTransferDataForMultipleTransactions'; const defaultTransactionInfo: TransactionDataTokenType = { tokenId: '', @@ -38,16 +37,6 @@ export function useParseMultiEsdtTransferData({ MultiSignTransactionType[] >([]); - function addTransactionDataToParsedInfo( - data: string, - txInfo: TransactionDataTokenType - ) { - setParsedTransactions((existing) => ({ - ...existing, - [data]: txInfo - })); - } - function getTxInfoByDataField( data: string, multiTransactionData?: string @@ -71,51 +60,13 @@ export function useParseMultiEsdtTransferData({ } function extractTransactionESDTData() { - if (transactions && transactions.length > 0) { - const allTxs: MultiSignTransactionType[] = []; - transactions.forEach((transaction, transactionIndex) => { - const txData = transaction.getData().toString(); - const multiTxs = parseMultiEsdtTransferData(txData); - - if (multiTxs.length > 0) { - multiTxs.forEach((trx, idx) => { - const newTx: MultiSignTransactionType = { - transaction, - multiTxData: trx.data, - transactionIndex: idx - }; - addTransactionDataToParsedInfo(trx.data, { - tokenId: trx.token ? trx.token : '', - amount: trx.amount ? trx.amount : '', - type: trx.type, - nonce: trx.nonce ? trx.nonce : '', - multiTxData: trx.data, - receiver: trx.receiver - }); - allTxs.push(newTx); - }); - } else { - const transactionData = transaction.getData().toString(); - - const { tokenId, amount } = getTokenFromData(transactionData); - - if (tokenId) { - addTransactionDataToParsedInfo(transactionData, { - tokenId, - amount, - receiver: transaction.getReceiver().bech32() - }); - } - allTxs.push({ - transaction, - transactionIndex, - multiTxData: transactionData - }); - } + const { allTransactions, parsedTransactionsByDataField } = + parseMultiEsdtTransferDataForMultipleTransactions({ + transactions }); - setAllTransactions(allTxs); - } + setAllTransactions(allTransactions); + setParsedTransactions(parsedTransactionsByDataField); } useEffect(() => { diff --git a/src/utils/transactions/parseMultiEsdtTransferDataForMultipleTransactions.ts b/src/utils/transactions/parseMultiEsdtTransferDataForMultipleTransactions.ts new file mode 100644 index 000000000..7d221d1d1 --- /dev/null +++ b/src/utils/transactions/parseMultiEsdtTransferDataForMultipleTransactions.ts @@ -0,0 +1,96 @@ +import type { Transaction } from '@multiversx/sdk-core'; +import { + MultiSignTransactionType, + TransactionDataTokenType, + TransactionsDataTokensType +} from 'types'; +import { getTokenFromData } from './getTokenFromData'; +import { parseMultiEsdtTransferData } from './parseMultiEsdtTransferData'; + +function addTransactionDataToParsedInfo({ + parsedTransactionsByDataField, + data, + txInfo +}: { + parsedTransactionsByDataField?: TransactionsDataTokensType; + data: string; + txInfo: TransactionDataTokenType; +}) { + if (!parsedTransactionsByDataField) { + return; + } + + parsedTransactionsByDataField[data] = txInfo; +} + +export function parseMultiEsdtTransferDataForMultipleTransactions({ + transactions +}: { + transactions?: Transaction[]; +}) { + const parsedTransactionsByDataField: TransactionsDataTokensType = {}; + const allTransactions: MultiSignTransactionType[] = []; + + if (!transactions || transactions.length === 0) { + return { + allTransactions, + parsedTransactionsByDataField + }; + } + + transactions.forEach((transaction, transactionIndex) => { + const txData = transaction.getData().toString(); + const multiTxs = parseMultiEsdtTransferData(txData); + + if (multiTxs.length > 0) { + multiTxs.forEach((trx, idx) => { + const newTx: MultiSignTransactionType = { + transaction, + multiTxData: trx.data, + transactionIndex: idx + }; + + addTransactionDataToParsedInfo({ + parsedTransactionsByDataField, + data: trx.data, + txInfo: { + tokenId: trx.token ? trx.token : '', + amount: trx.amount ? trx.amount : '', + type: trx.type, + nonce: trx.nonce ? trx.nonce : '', + multiTxData: trx.data, + receiver: trx.receiver + } + }); + + allTransactions.push(newTx); + }); + } else { + const transactionData = transaction.getData().toString(); + + const { tokenId, amount } = getTokenFromData(transactionData); + + if (tokenId) { + addTransactionDataToParsedInfo({ + parsedTransactionsByDataField, + data: transactionData, + txInfo: { + tokenId, + amount, + receiver: transaction.getReceiver().bech32() + } + }); + } + allTransactions.push({ + transaction, + transactionIndex, + multiTxData: transactionData + }); + } + }); + + return { + allTransactions, + parsedTransactionsByDataField + }; +}