Skip to content

Commit b31b8a0

Browse files
authored
Merge pull request #3 from linnall/main
feat: converts useScaffoldWriteContract to use AccountKit v4
2 parents a0655a4 + eccf166 commit b31b8a0

File tree

2 files changed

+65
-41
lines changed

2 files changed

+65
-41
lines changed

packages/nextjs/app/page.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
"use client";
22

33
import Link from "next/link";
4+
import { useAccount } from "@account-kit/react";
45
import type { NextPage } from "next";
6+
import { parseEther } from "viem";
57
import { BugAntIcon, MagnifyingGlassIcon } from "@heroicons/react/24/outline";
68
import { Address } from "~~/components/scaffold-eth";
7-
import { useClient } from "~~/hooks/scaffold-eth/useClient";
9+
import { useScaffoldWriteContract } from "~~/hooks/scaffold-eth";
810

911
const Home: NextPage = () => {
10-
const { address } = useClient();
12+
const { address } = useAccount({
13+
type: "LightAccount",
14+
});
15+
const { writeContractAsync: writeYourContractAsync } = useScaffoldWriteContract({ contractName: "YourContract" });
1116

1217
return (
1318
<>
@@ -37,6 +42,22 @@ const Home: NextPage = () => {
3742
packages/hardhat/contracts
3843
</code>
3944
</p>
45+
<button
46+
className="btn btn-primary"
47+
onClick={async () => {
48+
try {
49+
await writeYourContractAsync({
50+
functionName: "setGreeting",
51+
args: ["The value to set again"],
52+
value: parseEther("0.1"),
53+
});
54+
} catch (e) {
55+
console.error("Error setting greeting:", e);
56+
}
57+
}}
58+
>
59+
Set Greeting
60+
</button>
4061
</div>
4162

4263
<div className="flex-grow bg-base-300 w-full mt-16 px-8 py-12">

packages/nextjs/hooks/scaffold-eth/useScaffoldWriteContract.ts

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { useEffect, useState } from "react";
2-
import { MutateOptions } from "@tanstack/react-query";
3-
import { Abi, ExtractAbiFunctionNames } from "abitype";
4-
import { Config, UseWriteContractParameters, useAccount, useWriteContract } from "wagmi";
5-
import { WriteContractErrorType, WriteContractReturnType } from "wagmi/actions";
6-
import { WriteContractVariables } from "wagmi/query";
2+
import { useChain, useSendUserOperation, useSmartAccountClient } from "@account-kit/react";
3+
import { ExtractAbiFunctionNames } from "abitype";
4+
import { Abi, EncodeFunctionDataParameters, WriteContractReturnType, encodeFunctionData } from "viem";
5+
import { UseWriteContractParameters, useWriteContract } from "wagmi";
76
import { useSelectedNetwork } from "~~/hooks/scaffold-eth";
87
import { useDeployedContractInfo, useTransactor } from "~~/hooks/scaffold-eth";
98
import { AllowedChainIds, notification } from "~~/utils/scaffold-eth";
@@ -68,7 +67,7 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
6867
}
6968
}, [configOrName]);
7069

71-
const { chain: accountChain } = useAccount();
70+
const { chain: accountChain } = useChain();
7271
const writeTx = useTransactor();
7372
const [isMining, setIsMining] = useState(false);
7473

@@ -81,6 +80,18 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
8180
chainId: selectedNetwork.id as AllowedChainIds,
8281
});
8382

83+
const { client } = useSmartAccountClient({
84+
type: "LightAccount",
85+
});
86+
87+
const { sendUserOperationAsync, sendUserOperation } = useSendUserOperation({
88+
client,
89+
waitForTxn: true,
90+
});
91+
92+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
93+
const [txValue, setTxValue] = useState<string>("");
94+
8495
const sendContractWriteAsyncTx = async <
8596
TFunctionName extends ExtractAbiFunctionNames<ContractAbi<TContractName>, "nonpayable" | "payable">,
8697
>(
@@ -104,23 +115,20 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
104115

105116
try {
106117
setIsMining(true);
107-
const { blockConfirmations, onBlockConfirmation, ...mutateOptions } = options || {};
108-
const makeWriteWithParams = () =>
109-
wagmiContractWrite.writeContractAsync(
110-
{
111-
abi: deployedContractData.abi as Abi,
112-
address: deployedContractData.address,
113-
...variables,
114-
} as WriteContractVariables<Abi, string, any[], Config, number>,
115-
mutateOptions as
116-
| MutateOptions<
117-
WriteContractReturnType,
118-
WriteContractErrorType,
119-
WriteContractVariables<Abi, string, any[], Config, number>,
120-
unknown
121-
>
122-
| undefined,
123-
);
118+
const { blockConfirmations, onBlockConfirmation } = options || {};
119+
const makeWriteWithParams = async () => {
120+
const { hash } = await sendUserOperationAsync({
121+
uo: {
122+
target: deployedContractData.address,
123+
data: encodeFunctionData({
124+
abi: deployedContractData.abi as Abi,
125+
...variables,
126+
} as EncodeFunctionDataParameters<Abi, string, true, readonly unknown[], string>),
127+
value: BigInt(txValue),
128+
},
129+
});
130+
return hash;
131+
};
124132
const writeTxResult = await writeTx(makeWriteWithParams, { blockConfirmations, onBlockConfirmation });
125133

126134
return writeTxResult;
@@ -136,6 +144,7 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
136144
TFunctionName extends ExtractAbiFunctionNames<ContractAbi<TContractName>, "nonpayable" | "payable">,
137145
>(
138146
variables: ScaffoldWriteContractVariables<TContractName, TFunctionName>,
147+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
139148
options?: Omit<ScaffoldWriteContractOptions, "onBlockConfirmation" | "blockConfirmations">,
140149
) => {
141150
if (!deployedContractData) {
@@ -151,22 +160,16 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
151160
notification.error(`Wallet is connected to the wrong network. Please switch to ${selectedNetwork.name}`);
152161
return;
153162
}
154-
155-
wagmiContractWrite.writeContract(
156-
{
157-
abi: deployedContractData.abi as Abi,
158-
address: deployedContractData.address,
159-
...variables,
160-
} as WriteContractVariables<Abi, string, any[], Config, number>,
161-
options as
162-
| MutateOptions<
163-
WriteContractReturnType,
164-
WriteContractErrorType,
165-
WriteContractVariables<Abi, string, any[], Config, number>,
166-
unknown
167-
>
168-
| undefined,
169-
);
163+
sendUserOperation({
164+
uo: {
165+
target: deployedContractData.address,
166+
data: encodeFunctionData({
167+
abi: deployedContractData.abi as Abi,
168+
...variables,
169+
} as EncodeFunctionDataParameters<Abi, string, true, readonly unknown[], string>),
170+
value: BigInt(txValue),
171+
},
172+
});
170173
};
171174

172175
return {

0 commit comments

Comments
 (0)