1
1
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" ;
7
6
import { useSelectedNetwork } from "~~/hooks/scaffold-eth" ;
8
7
import { useDeployedContractInfo , useTransactor } from "~~/hooks/scaffold-eth" ;
9
8
import { AllowedChainIds , notification } from "~~/utils/scaffold-eth" ;
@@ -68,7 +67,7 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
68
67
}
69
68
} , [ configOrName ] ) ;
70
69
71
- const { chain : accountChain } = useAccount ( ) ;
70
+ const { chain : accountChain } = useChain ( ) ;
72
71
const writeTx = useTransactor ( ) ;
73
72
const [ isMining , setIsMining ] = useState ( false ) ;
74
73
@@ -81,6 +80,18 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
81
80
chainId : selectedNetwork . id as AllowedChainIds ,
82
81
} ) ;
83
82
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
+
84
95
const sendContractWriteAsyncTx = async <
85
96
TFunctionName extends ExtractAbiFunctionNames < ContractAbi < TContractName > , "nonpayable" | "payable" > ,
86
97
> (
@@ -104,23 +115,20 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
104
115
105
116
try {
106
117
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
+ } ;
124
132
const writeTxResult = await writeTx ( makeWriteWithParams , { blockConfirmations, onBlockConfirmation } ) ;
125
133
126
134
return writeTxResult ;
@@ -136,6 +144,7 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
136
144
TFunctionName extends ExtractAbiFunctionNames < ContractAbi < TContractName > , "nonpayable" | "payable" > ,
137
145
> (
138
146
variables : ScaffoldWriteContractVariables < TContractName , TFunctionName > ,
147
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
139
148
options ?: Omit < ScaffoldWriteContractOptions , "onBlockConfirmation" | "blockConfirmations" > ,
140
149
) => {
141
150
if ( ! deployedContractData ) {
@@ -151,22 +160,16 @@ export function useScaffoldWriteContract<TContractName extends ContractName>(
151
160
notification . error ( `Wallet is connected to the wrong network. Please switch to ${ selectedNetwork . name } ` ) ;
152
161
return ;
153
162
}
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
+ } ) ;
170
173
} ;
171
174
172
175
return {
0 commit comments