"use client"; import { useEffect, useMemo, useState } from "react"; import { InheritanceTooltip } from "./InheritanceTooltip"; import { Abi, AbiFunction } from "abitype"; import { Address, TransactionReceipt } from "viem"; import { useAccount, useConfig, useWaitForTransactionReceipt, useWriteContract } from "wagmi"; import { ContractInput, TxReceipt, getFunctionInputKey, getInitialFormState, getParsedContractFunctionArgs, transformAbiFunction, } from "~~/app/debug/_components/contract"; import { IntegerInput } from "~~/components/scaffold-eth"; import { useTransactor } from "~~/hooks/scaffold-eth"; import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork"; import { AllowedChainIds } from "~~/utils/scaffold-eth"; import { simulateContractWriteAndNotifyError } from "~~/utils/scaffold-eth/contract"; type WriteOnlyFunctionFormProps = { abi: Abi; abiFunction: AbiFunction; onChange: () => void; contractAddress: Address; inheritedFrom?: string; }; export const WriteOnlyFunctionForm = ({ abi, abiFunction, onChange, contractAddress, inheritedFrom, }: WriteOnlyFunctionFormProps) => { const [form, setForm] = useState>(() => getInitialFormState(abiFunction)); const [txValue, setTxValue] = useState(""); const { chain } = useAccount(); const writeTxn = useTransactor(); const { targetNetwork } = useTargetNetwork(); const writeDisabled = !chain || chain?.id !== targetNetwork.id; const { data: result, isPending, writeContractAsync } = useWriteContract(); const wagmiConfig = useConfig(); const handleWrite = async () => { if (writeContractAsync) { try { const writeContractObj = { address: contractAddress, functionName: abiFunction.name, abi: abi, args: getParsedContractFunctionArgs(form), value: BigInt(txValue), }; await simulateContractWriteAndNotifyError({ wagmiConfig, writeContractParams: writeContractObj, chainId: targetNetwork.id as AllowedChainIds, }); const makeWriteWithParams = () => writeContractAsync(writeContractObj); await writeTxn(makeWriteWithParams); onChange(); } catch (e: any) { console.error("⚡️ ~ file: WriteOnlyFunctionForm.tsx:handleWrite ~ error", e); } } }; const [displayedTxResult, setDisplayedTxResult] = useState(); const { data: txResult } = useWaitForTransactionReceipt({ hash: result, }); useEffect(() => { setDisplayedTxResult(txResult); }, [txResult]); const transformedFunction = useMemo(() => transformAbiFunction(abiFunction), [abiFunction]); const inputs = transformedFunction.inputs.map((input, inputIndex) => { const key = getFunctionInputKey(abiFunction.name, input, inputIndex); return ( { setDisplayedTxResult(undefined); setForm(updatedFormValue); }} form={form} stateObjectKey={key} paramType={input} /> ); }); const zeroInputs = inputs.length === 0 && abiFunction.stateMutability !== "payable"; return (

{abiFunction.name}

{inputs} {abiFunction.stateMutability === "payable" ? (
payable value wei
{ setDisplayedTxResult(undefined); setTxValue(updatedTxValue); }} placeholder="value (wei)" />
) : null}
{!zeroInputs && (
{displayedTxResult ? : null}
)}
{zeroInputs && txResult ? (
) : null}
); };