diff --git a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/interact/FunctionField.tsx b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/interact/FunctionField.tsx index 3633db657c..48e8b17595 100644 --- a/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/interact/FunctionField.tsx +++ b/packages/explorer/src/app/(explorer)/[chainName]/worlds/[worldAddress]/interact/FunctionField.tsx @@ -4,7 +4,7 @@ import { Coins, ExternalLinkIcon, Eye, LoaderIcon, Send } from "lucide-react"; import Link from "next/link"; import { useParams } from "next/navigation"; import { toast } from "sonner"; -import { Abi, AbiFunction, Address, Hex, decodeEventLog, stringify } from "viem"; +import { Abi, AbiFunction, AbiParameter, Address, Hex, decodeEventLog, stringify } from "viem"; import { useAccount, useConfig } from "wagmi"; import { readContract, waitForTransactionReceipt, writeContract } from "wagmi/actions"; import { z } from "zod"; @@ -56,6 +56,13 @@ export function FunctionField({ worldAbi, functionAbi }: Props) { const [txHash, setTxHash] = useState(); const txUrl = blockExplorerTransactionUrl({ hash: txHash, chainId }); + // Tuples are mapped to e.g. "[int16, int16, int16]" to inform the user what to input + const inputLabels = functionAbi.inputs.map((input) => + input.type === "tuple" + ? `[${(input as unknown as { components: AbiParameter[] }).components.map((c) => c.type).join(", ")}]` + : input.type, + ); + const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { @@ -87,7 +94,9 @@ export function FunctionField({ worldAbi, functionAbi }: Props) { abi: worldAbi, address: worldAddress as Address, functionName: functionAbi.name, - args: values.inputs, + args: values.inputs.map((value, index) => + functionAbi.inputs[index]?.type === "tuple" ? JSON.parse(value) : value, + ), ...(values.value && { value: BigInt(values.value) }), chainId, }); @@ -111,14 +120,13 @@ export function FunctionField({ worldAbi, functionAbi }: Props) { } } - const inputsLabel = functionAbi?.inputs.map((input) => input.type).join(", "); return (

- {functionAbi?.name} - {inputsLabel && ` (${inputsLabel})`} + {functionAbi.name} + {`(${inputLabels.join(", ")})`} {functionAbi.stateMutability === "payable" && } {(functionAbi.stateMutability === "view" || functionAbi.stateMutability === "pure") && ( @@ -128,7 +136,7 @@ export function FunctionField({ worldAbi, functionAbi }: Props) {

- {functionAbi?.inputs.map((input, index) => ( + {functionAbi.inputs.map((input, index) => ( {input.name} - +