import { defineStore } from "pinia"; import Web3 from "web3"; import CryptoJS from "crypto-js"; import { cloneDeep } from "lodash"; import { sysLogin } from "@/common/login.js"; export const useWalletStore = defineStore("useWalletStore", { state: () => ({ id: "", // name + @ + account isAuthenticated: false, // 登录状态 account: null, // 钱包地址 privateKey: null, // 私钥 encryptedKey: localStorage.getItem("encryptedKey") || null, // 加密后的密钥 loading: false, // 加载状态 error: null, // 错误信息 chainId: null, // 链ID balance: "0", // 账户余额(ETH) rpcUrl: "", // ACC私有链RPC username: "", // 用户名 accountName: "", //网络昵称 accountIcon: "", // 网络头像 accountPassword: null, // 密码 accountHint: "", // 提示词 words: "", // 助记词 walletList: [], // 钱包列表 }), persist: true, getters: { getWalletList() { return this.walletList; }, }, actions: { async initWeb3() { try { window.$web3 = new Web3(this.rpcUrl); return window.$web3 } catch (err) { console.log(err); this.error = "初始化区块链连接失败"; return null; } }, async getBalance() { if (!this.account || !window.$web3) { await this.initWeb3() } try { const weiBalance = await window.$web3.eth.getBalance(this.account); this.balance = await window.$web3.utils.fromWei(weiBalance, "ether"); return this.balance; } catch (err) { this.error = "获取余额失败"; return "0"; } }, async loginWithPrivateKey(isMnemonic = false) { this.loading = true; this.error = null; try { const web3 = window.$web3 || (await this.initWeb3()); if (!web3) throw new Error("区块链连接失败"); // 助记词路径 if (isMnemonic) { // 验证助记词格式 (12或24个单词) if (![12, 24].includes(this.words.length)) { throw new Error("助记词应为12或24个单词"); } // 从助记词派生私钥 (使用HD钱包) const hdwallet = web3.eth.accounts.wallet.create(1, this.words); this.privateKey = hdwallet[0].privateKey; } if (!/^0x[0-9a-fA-F]{64}$/.test(this.privateKey)) { throw new Error("私钥格式不正确"); } // 创建账户对象 const account = await web3.eth.accounts.privateKeyToAccount(this.privateKey); // 验证是否为合约地址 const code = await web3.eth.getCode(account.address); if (code !== "0x") throw new Error("该地址是合约地址,不支持登录"); this.account = account.address; this.isAuthenticated = true; this.chainId = `${await web3.eth.getChainId()}n`; this.id = `${this.account}@${this.accountName}` this.addWallet() await sysLogin(this.account) return { address: account.address, chainId: this.chainId, balance: this.balance, }; } catch (err) { console.log("登录失败"); this.error = err.message || "登录失败"; throw err; }finally { this.$persist(); this.loading = false; } }, // 添加钱包 addWallet() { const data = cloneDeep(this.$state) Reflect.deleteProperty(data, "walletList"); if(this.walletList.length = 0) { this.walletList.push(data) return } const findIndex = this.walletList.findIndex(item => item.id === this.id); if(findIndex != -1){ this.walletList[walletList] = data }else{ this.walletList.push(data) } }, // 切换钱包 switchWallet(account) { }, }, });