mirror of
https://github.com/luxfi/explore.git
synced 2026-09-24 00:28:18 +00:00
82 lines
3.2 KiB
TypeScript
82 lines
3.2 KiB
TypeScript
import type { NovesResponseData } from 'types/api/noves';
|
|
|
|
import type { SummaryAddress, SummaryValues } from './createNovesSummaryObject';
|
|
|
|
const ADDRESS_REGEXP = /(0x[\da-f]+\b)/gi;
|
|
// eslint-disable-next-line regexp/no-unused-capturing-group
|
|
const CONTRACT_REGEXP = /(contract 0x[\da-f]+\b)/gi;
|
|
|
|
export const createAddressValues = (translateData: NovesResponseData, description: string) => {
|
|
const addressMatches = description.match(ADDRESS_REGEXP);
|
|
const contractMatches = description.match(CONTRACT_REGEXP);
|
|
|
|
let descriptionAddresses: Array<string> = addressMatches ? addressMatches : [];
|
|
let contractAddresses: Array<string> = [];
|
|
|
|
if (contractMatches?.length) {
|
|
contractAddresses = contractMatches.map(text => text.split(ADDRESS_REGEXP)[1]);
|
|
descriptionAddresses = addressMatches?.filter(address => !contractAddresses.includes(address)) || [];
|
|
}
|
|
|
|
const addresses = extractAddresses(translateData);
|
|
|
|
const descriptionSummaryValues = createAddressSummaryValues(descriptionAddresses, addresses);
|
|
const contractSummaryValues = createAddressSummaryValues(contractAddresses, addresses, true);
|
|
|
|
const summaryValues = [ ...descriptionSummaryValues, ...contractSummaryValues ];
|
|
|
|
return summaryValues;
|
|
};
|
|
|
|
const createAddressSummaryValues = (descriptionAddresses: Array<string>, addresses: Array<SummaryAddress>, isContract = false) => {
|
|
const summaryValues: Array<SummaryValues | undefined> = descriptionAddresses.map(match => {
|
|
const address = addresses.find(address => address.hash.toUpperCase().startsWith(match.toUpperCase()));
|
|
|
|
if (!address) {
|
|
return undefined;
|
|
}
|
|
|
|
const value: SummaryValues = {
|
|
match: match,
|
|
type: 'address',
|
|
value: isContract ? { ...address, is_contract: true } : address,
|
|
};
|
|
|
|
return value;
|
|
});
|
|
|
|
return summaryValues.filter(value => value !== undefined) as Array<SummaryValues>;
|
|
};
|
|
|
|
function extractAddresses(data: NovesResponseData) {
|
|
const addressesSet: Set<{ hash: string | null; name?: string | null }> = new Set(); // Use a Set to store unique addresses
|
|
|
|
addressesSet.add({ hash: data.rawTransactionData.fromAddress });
|
|
addressesSet.add({ hash: data.rawTransactionData.toAddress });
|
|
|
|
if (data.classificationData.approved) {
|
|
addressesSet.add({ hash: data.classificationData.approved.spender });
|
|
}
|
|
|
|
if (data.classificationData.deployedContractAddress) {
|
|
addressesSet.add({ hash: data.classificationData.deployedContractAddress });
|
|
}
|
|
|
|
if (data.txTypeVersion === 2) {
|
|
data.classificationData.sent.forEach((transaction) => {
|
|
addressesSet.add({ hash: transaction.from.address, name: transaction.from.name });
|
|
addressesSet.add({ hash: transaction.to.address, name: transaction.to.name });
|
|
});
|
|
|
|
data.classificationData.received.forEach((transaction) => {
|
|
addressesSet.add({ hash: transaction.from.address, name: transaction.from.name });
|
|
addressesSet.add({ hash: transaction.to.address, name: transaction.to.name });
|
|
});
|
|
}
|
|
|
|
const addresses = Array.from(addressesSet) as Array<{ hash: string; name?: string }>; // Convert Set to an array
|
|
|
|
// Remove empty and null values
|
|
return addresses.filter(address => address.hash !== null && address.hash !== '' && address.hash !== undefined);
|
|
}
|