Loading...
Loading...
Compare original and translation side by side
app/components/contracts/app/components/contracts/<p>Please connect your wallet</p><RainbowKitCustomConnectButton /><p>Please connect your wallet</p><RainbowKitCustomConnectButton />1. Not connected → Connect Wallet button
2. Wrong network → Switch to [Chain] button
3. Needs approval → Approve button
4. Ready → Action button (Stake/Deposit/Swap)disabledisPendinguseScaffoldWriteContractuseScaffoldWriteContractuseWriteContractgrep -rn "useWriteContract" packages/nextjs/1. 未连接 → 连接钱包按钮
2. 网络错误 → 切换至[对应链]按钮
3. 需要授权 → 授权按钮
4. 准备完成 → 操作按钮(质押/存入/兑换)disableduseScaffoldWriteContractisPendinguseScaffoldWriteContractuseWriteContractgrep -rn "useWriteContract" packages/nextjs/<Address/><Address/>images: ["/thumbnail.jpg"]images: ["https://yourdomain.com/thumbnail.jpg"]grep -n "og:image\|images:" packages/nextjs/app/layout.tsximages: ["/thumbnail.jpg"]images: ["https://yourdomain.com/thumbnail.jpg"]grep -n "og:image\|images:" packages/nextjs/app/layout.tsxpackages/nextjs/scaffold.config.tspollingInterval: 30000pollingInterval: 3000rpcOverridesprocess.env.NEXT_PUBLIC_*packages/nextjs/scaffold.config.tspollingInterval: 30000pollingInterval: 3000rpcOverridesprocess.env.NEXT_PUBLIC_*phantomWalletwagmiConnectors.tsxwagmiConnectors.tsxphantomWalletwindow.location.href = "rainbow://"writeContractAsync()writeContractAsync()window.location.href = "rainbow://"writeAndOpenconst writeAndOpen = useCallback(
<T,>(writeFn: () => Promise<T>): Promise<T> => {
const promise = writeFn(); // Fire TX — does gas estimation + WC relay
setTimeout(openWallet, 2000); // Switch to wallet AFTER request is relayed
return promise;
},
[openWallet],
);
// Usage — wraps every write call:
await writeAndOpen(() => gameWrite({ functionName: "click", args: [...] }));writeContractAsyncconnector.id"walletConnect""rainbow""metamask"const openWallet = useCallback(() => {
if (typeof window === "undefined") return;
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (!isMobile || window.ethereum) return; // Skip if desktop or in-app browser
// Check connector, wagmi storage, AND WalletConnect session data
const allIds = [connector?.id, connector?.name,
localStorage.getItem("wagmi.recentConnectorId")]
.filter(Boolean).join(" ").toLowerCase();
let wcWallet = "";
try {
const wcKey = Object.keys(localStorage).find(k => k.startsWith("wc@2:client"));
if (wcKey) wcWallet = (localStorage.getItem(wcKey) || "").toLowerCase();
} catch {}
const search = `${allIds} ${wcWallet}`;
const schemes: [string[], string][] = [
[["rainbow"], "rainbow://"],
[["metamask"], "metamask://"],
[["coinbase", "cbwallet"], "cbwallet://"],
[["trust"], "trust://"],
[["phantom"], "phantom://"],
];
for (const [keywords, scheme] of schemes) {
if (keywords.some(k => search.includes(k))) {
window.location.href = scheme;
return;
}
}
}, [connector]);window.location.hrefwindow.ethereumconnector.idrainbow://rainbow://dapp/...writeAndOpenconst writeAndOpen = useCallback(
<T,>(writeFn: () => Promise<T>): Promise<T> => {
const promise = writeFn(); // 发起交易——执行gas估算 + WC中继
setTimeout(openWallet, 2000); // 请求中继完成后切换至钱包
return promise;
},
[openWallet],
);
// 使用方式——包裹所有写交易调用:
await writeAndOpen(() => gameWrite({ functionName: "click", args: [...] }));writeContractAsyncconnector.id"walletConnect""rainbow""metamask"const openWallet = useCallback(() => {
if (typeof window === "undefined") return;
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (!isMobile || window.ethereum) return; // 桌面端或内置浏览器下跳过
// 检查连接器、wagmi存储及WalletConnect会话数据
const allIds = [connector?.id, connector?.name,
localStorage.getItem("wagmi.recentConnectorId")]
.filter(Boolean).join(" ").toLowerCase();
let wcWallet = "";
try {
const wcKey = Object.keys(localStorage).find(k => k.startsWith("wc@2:client"));
if (wcKey) wcWallet = (localStorage.getItem(wcKey) || "").toLowerCase();
} catch {}
const search = `${allIds} ${wcWallet}`;
const schemes: [string[], string][] = [
[["rainbow"], "rainbow://"],
[["metamask"], "metamask://"],
[["coinbase", "cbwallet"], "cbwallet://"],
[["trust"], "trust://"],
[["phantom"], "phantom://"],
];
for (const [keywords, scheme] of schemes) {
if (keywords.some(k => search.includes(k))) {
window.location.href = scheme;
return;
}
}
}, [connector]);window.location.hrefwindow.ethereumconnector.idrainbow://rainbow://dapp/...<Address/>setTimeout(openWallet, 2000)connector.idwindow.ethereum<Address/>setTimeout(openWallet, 2000)connector.idwindow.ethereum