Initial commit with 🏗️ create-eth @ 2.0.4
This commit is contained in:
65
packages/nextjs/utils/scaffold-eth/decodeTxData.ts
Normal file
65
packages/nextjs/utils/scaffold-eth/decodeTxData.ts
Normal file
@@ -0,0 +1,65 @@
|
||||
import { TransactionWithFunction } from "./block";
|
||||
import { GenericContractsDeclaration } from "./contract";
|
||||
import { Abi, AbiFunction, decodeFunctionData, getAbiItem } from "viem";
|
||||
import { hardhat } from "viem/chains";
|
||||
import contractData from "~~/contracts/deployedContracts";
|
||||
|
||||
type ContractsInterfaces = Record<string, Abi>;
|
||||
type TransactionType = TransactionWithFunction | null;
|
||||
|
||||
const deployedContracts = contractData as GenericContractsDeclaration | null;
|
||||
const chainMetaData = deployedContracts?.[hardhat.id];
|
||||
const interfaces = chainMetaData
|
||||
? Object.entries(chainMetaData).reduce((finalInterfacesObj, [contractName, contract]) => {
|
||||
finalInterfacesObj[contractName] = contract.abi;
|
||||
return finalInterfacesObj;
|
||||
}, {} as ContractsInterfaces)
|
||||
: {};
|
||||
|
||||
export const decodeTransactionData = (tx: TransactionWithFunction) => {
|
||||
if (tx.input.length >= 10 && !tx.input.startsWith("0x60e06040")) {
|
||||
let foundInterface = false;
|
||||
for (const [, contractAbi] of Object.entries(interfaces)) {
|
||||
try {
|
||||
const { functionName, args } = decodeFunctionData({
|
||||
abi: contractAbi,
|
||||
data: tx.input,
|
||||
});
|
||||
tx.functionName = functionName;
|
||||
tx.functionArgs = args as any[];
|
||||
tx.functionArgNames = getAbiItem<AbiFunction[], string>({
|
||||
abi: contractAbi as AbiFunction[],
|
||||
name: functionName,
|
||||
})?.inputs?.map((input: any) => input.name);
|
||||
tx.functionArgTypes = getAbiItem<AbiFunction[], string>({
|
||||
abi: contractAbi as AbiFunction[],
|
||||
name: functionName,
|
||||
})?.inputs.map((input: any) => input.type);
|
||||
foundInterface = true;
|
||||
break;
|
||||
} catch {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
if (!foundInterface) {
|
||||
tx.functionName = "⚠️ Unknown";
|
||||
}
|
||||
}
|
||||
return tx;
|
||||
};
|
||||
|
||||
export const getFunctionDetails = (transaction: TransactionType) => {
|
||||
if (
|
||||
transaction &&
|
||||
transaction.functionName &&
|
||||
transaction.functionArgNames &&
|
||||
transaction.functionArgTypes &&
|
||||
transaction.functionArgs
|
||||
) {
|
||||
const details = transaction.functionArgNames.map(
|
||||
(name, i) => `${transaction.functionArgTypes?.[i] || ""} ${name} = ${transaction.functionArgs?.[i] ?? ""}`,
|
||||
);
|
||||
return `${transaction.functionName}(${details.join(", ")})`;
|
||||
}
|
||||
return "";
|
||||
};
|
||||
Reference in New Issue
Block a user