@@ -37,6 +37,7 @@ export function App() {
3737 const [ providers , setProviders ] = useState < { info : EIP6963ProviderInfo ; provider : EIP1193 } [ ] > (
3838 [ ] ,
3939 ) ;
40+ const [ confirmed , setConfirmed ] = useState < boolean > ( false ) ;
4041 const [ pending , setPending ] = useState < PendingAny | null > ( null ) ;
4142 const [ selectedUuid , setSelectedUuid ] = useState < string | null > ( null ) ;
4243 const selected = providers . find ( ( p ) => p . info . uuid === selectedUuid ) ?? null ;
@@ -60,6 +61,8 @@ export function App() {
6061 } , [ selected , chain ] ) ;
6162
6263 const ensureServerConnected = useCallback ( async ( ) => {
64+ if ( confirmed ) return ;
65+
6366 try {
6467 const resp = await api <
6568 ApiOk < { connected : boolean ; account ?: string ; chainId ?: number } > | ApiErr
@@ -85,7 +88,7 @@ export function App() {
8588 }
8689 }
8790 } catch { }
88- } , [ account , chainId ] ) ;
91+ } , [ account , chainId , confirmed ] ) ;
8992
9093 const pollTick = useCallback ( async ( ) => {
9194 await ensureServerConnected ( ) ;
@@ -115,6 +118,7 @@ export function App() {
115118
116119 const connect = async ( ) => {
117120 if ( ! walletClient || ! selected ) return ;
121+ if ( confirmed ) return ;
118122
119123 const addrs = ( await requestAddresses ( walletClient ) ) as readonly Address [ ] ;
120124 setAccount ( addrs [ 0 ] as Address | undefined ) ;
@@ -125,10 +129,14 @@ export function App() {
125129 } catch {
126130 setChainId ( undefined ) ;
127131 setChain ( undefined ) ;
128- }
132+ }
133+ } ;
129134
135+ const confirm = async ( ) => {
130136 await ensureServerConnected ( ) ;
131- } ;
137+
138+ setConfirmed ( true ) ;
139+ }
132140
133141 const signAndSendCurrent = async ( ) => {
134142 if ( ! walletClient || ! selected || ! pending ?. request ) return ;
@@ -177,6 +185,7 @@ export function App() {
177185 setAccount ( undefined ) ;
178186 setChainId ( undefined ) ;
179187 setChain ( undefined ) ;
188+ setConfirmed ( false ) ;
180189
181190 try {
182191 await api ( "/api/connection" , "POST" , null ) ;
@@ -223,41 +232,26 @@ export function App() {
223232 useEffect ( ( ) => {
224233 if ( ! selected ) return ;
225234
226- const onAccountsChanged = ( accounts : readonly string [ ] ) =>
227- setAccount ( ( accounts [ 0 ] as Address ) ?? undefined ) ;
228- const onChainChanged = ( raw : unknown ) => applyChainId ( raw , setChainId , setChain ) ;
235+ const onAccountsChanged = ( accounts : readonly string [ ] ) => {
236+ if ( confirmed ) return ;
237+
238+ setAccount ( ( accounts [ 0 ] as Address ) ?? undefined ) ;
239+ } ;
240+
241+ const onChainChanged = ( raw : unknown ) => {
242+ if ( confirmed ) return ;
243+
244+ applyChainId ( raw , setChainId , setChain ) ;
245+ } ;
229246
230247 selected . provider . on ?.( "accountsChanged" , onAccountsChanged ) ;
231248 selected . provider . on ?.( "chainChanged" , onChainChanged ) ;
249+
232250 return ( ) => {
233251 selected . provider . removeListener ?.( "accountsChanged" , onAccountsChanged ) ;
234252 selected . provider . removeListener ?.( "chainChanged" , onChainChanged ) ;
235253 } ;
236- } , [ selected ] ) ;
237-
238- // Upon account or chainId change, update state.
239- useEffect ( ( ) => {
240- ( async ( ) => {
241- if ( ! selected ) return ;
242-
243- try {
244- const raw = await selected . provider . request < string > ( { method : "eth_chainId" } ) ;
245- applyChainId ( raw , setChainId , setChain ) ;
246- } catch {
247- setChainId ( undefined ) ;
248- setChain ( undefined ) ;
249- }
250-
251- if ( walletClient ) {
252- try {
253- const addrs = await getAddresses ( walletClient ) ;
254- setAccount ( ( addrs ?. [ 0 ] as Address ) || undefined ) ;
255- } catch {
256- setAccount ( undefined ) ;
257- }
258- }
259- } ) ( ) ;
260- } , [ selected , walletClient ] ) ;
254+ } , [ selected , confirmed ] ) ;
261255
262256 useEffect ( ( ) => {
263257 pollFnRef . current = ( ) => {
@@ -267,6 +261,8 @@ export function App() {
267261
268262 // Polling loop to check for new pending transactions.
269263 useEffect ( ( ) => {
264+ if ( ! confirmed ) return ;
265+
270266 pollFnRef . current ( ) ;
271267
272268 const id = window . setInterval ( ( ) => {
@@ -276,7 +272,7 @@ export function App() {
276272 return ( ) => {
277273 window . clearInterval ( id ) ;
278274 } ;
279- } , [ ] ) ;
275+ } , [ confirmed ] ) ;
280276
281277 return (
282278 < div className = "wrapper" >
@@ -289,6 +285,7 @@ export function App() {
289285 < select
290286 value = { selectedUuid ?? "" }
291287 onChange = { ( e ) => setSelectedUuid ( e . target . value || null ) }
288+ disabled = { confirmed }
292289 >
293290 < option value = "" disabled >
294291 Select wallet…
@@ -305,6 +302,18 @@ export function App() {
305302
306303 { providers . length === 0 && < p > No wallets found.</ p > }
307304
305+ { selected && ! account && (
306+ < button type = "button" className = "wallet-connect" onClick = { connect } >
307+ Connect Wallet
308+ </ button >
309+ ) }
310+
311+ { selected && account && ! confirmed && (
312+ < button type = "button" className = "wallet-confirm" onClick = { confirm } >
313+ Confirm Connection
314+ </ button >
315+ ) }
316+
308317 { selected && account && (
309318 < >
310319 < div className = "section-title" > Connected</ div >
@@ -317,13 +326,7 @@ rpc: ${chain?.rpcUrls?.default?.http?.[0] ?? chain?.rpcUrls?.public?.http?.[
317326 </ >
318327 ) }
319328
320- { selected && ! account && (
321- < button type = "button" className = "wallet-connect" onClick = { connect } >
322- Connect Wallet
323- </ button >
324- ) }
325-
326- { selected && account && (
329+ { selected && account && confirmed && (
327330 < >
328331 < div className = "section-title" > To Sign</ div >
329332 < div className = "box" >
0 commit comments