liming 3 minggu lalu
induk
melakukan
7c83218f8f
2 mengubah file dengan 26 tambahan dan 8 penghapusan
  1. 20 6
      src/stores/modules/walletStore.js
  2. 6 2
      src/views/login/importWallet/index.vue

+ 20 - 6
src/stores/modules/walletStore.js

@@ -8,14 +8,17 @@ export const useWalletStore = defineStore("useWalletStore", {
   state: () => ({
     id: "", // name + @ + account
     isAuthenticated: false, // 登录状态
-    account: null, // 钱包地址
+    account: null, // 钱包地址 
+    
     privateKey: null, // 私钥
     encryptedKey: localStorage.getItem("encryptedKey") || null, // 加密后的密钥
     loading: false, // 加载状态
     error: null, // 错误信息
     chainId: null, // 链ID
+
     balance: "0", // 账户余额(ETH)
-    rpcUrl: "", // 您的私有链RPC
+
+    rpcUrl: "", // ACC私有链RPC
 
     username: "", // 用户名
     accountName: "", //网络昵称
@@ -57,21 +60,32 @@ export const useWalletStore = defineStore("useWalletStore", {
         return "0";
       }
     },
-    async loginWithPrivateKey(password = "") {
+    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`;

+ 6 - 2
src/views/login/importWallet/index.vue

@@ -89,11 +89,15 @@ const onSubmit = async () => {
     $msg($t("form.InconsistentPasswords"));
     return;
   }
+  if(type == 0){
+    walletStore.privateKey = form.value.userKey;
+  }else{
+    walletStore.words = form.value.userKey.trim().split(',');
+  }
   walletStore.username = form.value.username;
-  walletStore.privateKey = form.value.userKey;
   walletStore.accountPassword = form.value.password;
   walletStore.accountHint = form.value.promptMessage;
-  await walletStore.loginWithPrivateKey();
+  await walletStore.loginWithPrivateKey(type != 0);
   router.push({
     path: "/wallet",
   });