Skip to content

Commit b3a1c4b

Browse files
committed
add confirmation step to lock in signer and chain id, alloy requires this for tx request construction
1 parent e8631a1 commit b3a1c4b

File tree

2 files changed

+46
-39
lines changed

2 files changed

+46
-39
lines changed

src/App.tsx

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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">

src/styles/App.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
align-self: center;
3737
}
3838

39+
.wallet-confirm {
40+
align-self: center;
41+
}
42+
3943
.title {
4044
font-size: 36px;
4145
color: #f8f8f8;

0 commit comments

Comments
 (0)