Skip to content

Commit

Permalink
simulate writeContract interaction on write hook + debug page
Browse files Browse the repository at this point in the history
  • Loading branch information
technophile-04 committed Feb 10, 2025
1 parent 0654b7d commit 7b4423f
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import { useEffect, useState } from "react";
import { InheritanceTooltip } from "./InheritanceTooltip";
import { Abi, AbiFunction } from "abitype";
import { Address, TransactionReceipt } from "viem";
import { useAccount, useWaitForTransactionReceipt, useWriteContract } from "wagmi";
import { Config, useAccount, useConfig, useWaitForTransactionReceipt, useWriteContract } from "wagmi";
import { simulateContract } from "wagmi/actions";
import { WriteContractVariables } from "wagmi/query";
import {
ContractInput,
TxReceipt,
Expand All @@ -16,6 +18,7 @@ import {
import { IntegerInput } from "~~/components/scaffold-eth";
import { useTransactor } from "~~/hooks/scaffold-eth";
import { useTargetNetwork } from "~~/hooks/scaffold-eth/useTargetNetwork";
import { getParsedError, notification } from "~~/utils/scaffold-eth";

type WriteOnlyFunctionFormProps = {
abi: Abi;
Expand All @@ -41,17 +44,31 @@ export const WriteOnlyFunctionForm = ({

const { data: result, isPending, writeContractAsync } = useWriteContract();

const wagmiConfig = useConfig();

const simulateAndNotifyError = async (params: WriteContractVariables<Abi, string, any[], Config, number>) => {
try {
await simulateContract(wagmiConfig, params);
} catch (error) {
const parsedError = getParsedError(error);
notification.error(parsedError);
throw error;
}
};

const handleWrite = async () => {
if (writeContractAsync) {
try {
const makeWriteWithParams = () =>
writeContractAsync({
address: contractAddress,
functionName: abiFunction.name,
abi: abi,
args: getParsedContractFunctionArgs(form),
value: BigInt(txValue),
});
const writeContractObj = {
address: contractAddress,
functionName: abiFunction.name,
abi: abi,
args: getParsedContractFunctionArgs(form),
value: BigInt(txValue),
};
await simulateAndNotifyError(writeContractObj);

const makeWriteWithParams = () => writeContractAsync(writeContractObj);
await writeTxn(makeWriteWithParams);
onChange();
} catch (e: any) {
Expand Down
33 changes: 25 additions & 8 deletions packages/nextjs/hooks/scaffold-eth/useScaffoldWriteContract.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { useEffect, useState } from "react";
import { MutateOptions } from "@tanstack/react-query";
import { Abi, ExtractAbiFunctionNames } from "abitype";
import { Config, UseWriteContractParameters, useAccount, useWriteContract } from "wagmi";
import { WriteContractErrorType, WriteContractReturnType } from "wagmi/actions";
import { Config, UseWriteContractParameters, useAccount, useConfig, useWriteContract } from "wagmi";
import { WriteContractErrorType, WriteContractReturnType, simulateContract } from "wagmi/actions";
import { WriteContractVariables } from "wagmi/query";
import { useSelectedNetwork } from "~~/hooks/scaffold-eth";
import { useDeployedContractInfo, useTransactor } from "~~/hooks/scaffold-eth";
import { AllowedChainIds, notification } from "~~/utils/scaffold-eth";
import { AllowedChainIds, getParsedError, notification } from "~~/utils/scaffold-eth";
import {
ContractAbi,
ContractName,
Expand Down Expand Up @@ -60,6 +60,8 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
: (configOrName as UseScaffoldWriteConfig<TContractName>);
const { contractName, chainId, writeContractParams: finalWriteContractParams } = finalConfig;

const wagmiConfig = useConfig();

useEffect(() => {
if (typeof configOrName === "string") {
console.warn(
Expand All @@ -81,6 +83,16 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
chainId: selectedNetwork.id as AllowedChainIds,
});

const simulateAndNotifyError = async (params: WriteContractVariables<Abi, string, any[], Config, number>) => {
try {
await simulateContract(wagmiConfig, params);
} catch (error) {
const parsedError = getParsedError(error);
notification.error(parsedError);
throw error;
}
};

const sendContractWriteAsyncTx = async <
TFunctionName extends ExtractAbiFunctionNames<ContractAbi<TContractName>, "nonpayable" | "payable">,
>(
Expand All @@ -105,13 +117,18 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
try {
setIsMining(true);
const { blockConfirmations, onBlockConfirmation, ...mutateOptions } = options || {};

const writeContractObject = {
abi: deployedContractData.abi as Abi,
address: deployedContractData.address,
...variables,
} as WriteContractVariables<Abi, string, any[], Config, number>;

await simulateAndNotifyError(writeContractObject);

const makeWriteWithParams = () =>
wagmiContractWrite.writeContractAsync(
{
abi: deployedContractData.abi as Abi,
address: deployedContractData.address,
...variables,
} as WriteContractVariables<Abi, string, any[], Config, number>,
writeContractObject,
mutateOptions as
| MutateOptions<
WriteContractReturnType,
Expand Down

0 comments on commit 7b4423f

Please sign in to comment.