diff --git a/src/wallet/WalletLoginModal.tsx b/src/wallet/WalletLoginModal.tsx
index 38723dc..ce17c75 100644
--- a/src/wallet/WalletLoginModal.tsx
+++ b/src/wallet/WalletLoginModal.tsx
@@ -181,6 +181,16 @@ export function WalletLoginModal() {
) : null}
+ {selected ? (
+
+
Wallet debug
+
state: {wc.state}
+
connected: {wc.isConnected ? "yes" : "no"}
+
address: {wc.address || "-"}
+
qr: {wc.qrUri ? "received" : "-"}
+
+ ) : null}
+
{selected ? (
{t("walletNetworkWarning")}
diff --git a/src/wallet/useWalletConnectLogin.ts b/src/wallet/useWalletConnectLogin.ts
index f61d5ea..31be95e 100644
--- a/src/wallet/useWalletConnectLogin.ts
+++ b/src/wallet/useWalletConnectLogin.ts
@@ -1,5 +1,5 @@
-import { useCallback, useEffect, useRef, useState } from "react";
-import { useAccount, useConnect, useDisconnect } from "wagmi";
+import { useCallback, useRef, useState } from "react";
+import { useConnect, useDisconnect } from "wagmi";
import { bsc } from "wagmi/chains";
import { hasWalletConnectProjectId } from "./RainbowWalletProvider";
import type { WalletKind } from "./injected";
@@ -45,12 +45,12 @@ function walletConnectDeeplink(
export function useWalletConnectLogin() {
const available = hasWalletConnectProjectId();
const { completeLogin } = useWallet();
- const { address, isConnected } = useAccount();
const { connectAsync, connectors } = useConnect();
- const { disconnect } = useDisconnect();
+ const { disconnect, disconnectAsync } = useDisconnect();
const [state, setState] = useState("idle");
const [error, setError] = useState("");
const [qrUri, setQrUri] = useState("");
+ const [connectedAddress, setConnectedAddress] = useState("");
const pendingRef = useRef(false);
const cleanupMessageRef = useRef<(() => void) | null>(null);
@@ -61,6 +61,7 @@ export function useWalletConnectLogin() {
setState("idle");
setError("");
setQrUri("");
+ setConnectedAddress("");
}, []);
const start = useCallback(
@@ -71,6 +72,7 @@ export function useWalletConnectLogin() {
if (!available) return;
setError("");
setQrUri("");
+ setConnectedAddress("");
pendingRef.current = true;
setState("connecting");
@@ -122,8 +124,27 @@ export function useWalletConnectLogin() {
connector.emitter.off("message", onMessage);
try {
+ await disconnectAsync().catch(() => undefined);
await connector.disconnect().catch(() => undefined);
- await connectAsync({ chainId: bsc.id, connector });
+ const result = await connectAsync({ chainId: bsc.id, connector });
+ const connectedAddress = result.accounts[0];
+ if (!connectedAddress)
+ throw new Error("Wallet connected without an account");
+ pendingRef.current = false;
+ setConnectedAddress(connectedAddress);
+ console.info("[wallet-login] walletconnect connected", {
+ address: connectedAddress,
+ chain: "BNB Chain",
+ chainId: bsc.id,
+ });
+ window.alert(`扫码成功,已拿到钱包地址:\n${connectedAddress}`);
+ completeLogin(localWalletToken(connectedAddress), connectedAddress);
+ console.info("[wallet-login] local wallet session completed", {
+ address: connectedAddress,
+ });
+ setQrUri("");
+ setState("idle");
+ disconnect();
} catch (err) {
pendingRef.current = false;
setState("idle");
@@ -134,17 +155,24 @@ export function useWalletConnectLogin() {
cleanupMessageRef.current = null;
}
},
- [available, connectAsync, connectors],
+ [
+ available,
+ completeLogin,
+ connectAsync,
+ connectors,
+ disconnect,
+ disconnectAsync,
+ ],
);
- useEffect(() => {
- if (!pendingRef.current || !isConnected || !address) return;
- pendingRef.current = false;
- completeLogin(localWalletToken(address), address);
- setQrUri("");
- setState("idle");
- disconnect();
- }, [address, completeLogin, disconnect, isConnected]);
-
- return { available, state, error, qrUri, start, reset };
+ return {
+ available,
+ state,
+ error,
+ qrUri,
+ address: connectedAddress,
+ isConnected: Boolean(connectedAddress),
+ start,
+ reset,
+ };
}