From cfad972ea118ff51bb024b228579ee116654f708 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gor=20Sternat?= Date: Mon, 30 Sep 2024 01:27:10 +0200 Subject: [PATCH 1/2] fix: generate wallet with the same mnemonic --- src/components/wallet/verticalNavbar.vue | 6 ++++-- src/utils/wallet.ts | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/components/wallet/verticalNavbar.vue b/src/components/wallet/verticalNavbar.vue index 9f5eab9..dd8362f 100644 --- a/src/components/wallet/verticalNavbar.vue +++ b/src/components/wallet/verticalNavbar.vue @@ -45,7 +45,7 @@ export default defineComponent({ methods: { ...mapActions(['addAccount', 'selectAccount', 'initializeAccountsFromLocalStorage']), addAccountToStore() { - const { newWallet, mnemonic, privateKey } = generateWallet(this.walletCounter) + const { newWallet, mnemonic, privateKey } = generateWallet(this.walletCounter, this.password) const newAccount: Account = { name: `Account ${this.walletCounter + 1}`, address: newWallet.account.address, @@ -61,7 +61,9 @@ export default defineComponent({ } this.mnemonic = mnemonic this.addAccount(newAccount) - this.isMnemonicVisible = true + if (this.walletCounter === 1) { + this.isMnemonicVisible = true + } localStorage.setItem( `privateKeyAccount${this.walletCounter}`, encryption(privateKey, this.password) diff --git a/src/utils/wallet.ts b/src/utils/wallet.ts index 08ce17a..8c0072a 100644 --- a/src/utils/wallet.ts +++ b/src/utils/wallet.ts @@ -3,6 +3,7 @@ import { mnemonicToSeedSync } from '@scure/bip39' import { createWalletClient, http, type WalletClient } from 'viem' import { privateKeyToAccount, generateMnemonic, english } from 'viem/accounts' import { mainnet } from 'viem/chains' +import { decryption, encryption } from '@/utils/crypto' function uint8ToHexString(uint8Array: Uint8Array | null): `0x${string}` { if (uint8Array === null) return `0x` as `0x${string}` @@ -12,12 +13,20 @@ function uint8ToHexString(uint8Array: Uint8Array | null): `0x${string}` { return `0x${hexString}` as `0x${string}` } -export function generateWallet(walletNumber: number): { +export function generateWallet(walletNumber: number, password: string): { newWallet: WalletClient mnemonic: string privateKey: string } { - const mnemonic = generateMnemonic(english) + const storedMnemonic = localStorage.getItem('storedMnemonic') + let mnemonic: string + if (!storedMnemonic) { + const mnemonic = generateMnemonic(english) + const encryptedMnemonic = encryption(mnemonic, password) + localStorage.setItem('storedMnemonic', encryptedMnemonic) + } else { + mnemonic = decryption(storedMnemonic, password) + } const seed = mnemonicToSeedSync(mnemonic) const masterKey = HDKey.fromMasterSeed(seed) const privateKeyUint8 = masterKey.derive(`m/44'/60'/0'/0/${walletNumber}`).privateKey @@ -46,6 +55,10 @@ export function generateWalletFromMnemonic(mnemonic: string[]): { privateKey: string | null } { try { + const checkStoredMnemonic = localStorage.getItem('storedMnemonic') + if (!checkStoredMnemonic) { + localStorage.setItem('storedMnemonic', mnemonic.join(' ')) + } const seed = mnemonicToSeedSync(mnemonic.join(' ')) const masterKey = HDKey.fromMasterSeed(seed) const privateKeyUint8 = masterKey.derive(`m/44'/60'/0'/0/0`).privateKey From 10305050be0e349f8abbc2c3ba9eb71269d60334 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gor=20Sternat?= Date: Mon, 30 Sep 2024 21:47:48 +0200 Subject: [PATCH 2/2] fix: encrypt the mnemonic --- src/components/wallet/verticalNavbar.vue | 2 +- src/utils/wallet.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/wallet/verticalNavbar.vue b/src/components/wallet/verticalNavbar.vue index dd8362f..45793a6 100644 --- a/src/components/wallet/verticalNavbar.vue +++ b/src/components/wallet/verticalNavbar.vue @@ -82,7 +82,7 @@ export default defineComponent({ closeImportPopUp(mnemonicWords: string[]) { if (mnemonicWords && mnemonicWords.every((word) => word !== '')) { console.log('Importing wallet...') - const { newWallet, privateKey } = generateWalletFromMnemonic(mnemonicWords) + const { newWallet, privateKey } = generateWalletFromMnemonic(mnemonicWords, this.password) if (newWallet === null) { this.isImportVisible = false return diff --git a/src/utils/wallet.ts b/src/utils/wallet.ts index 8c0072a..e950c18 100644 --- a/src/utils/wallet.ts +++ b/src/utils/wallet.ts @@ -50,14 +50,14 @@ export function generateWalletFromPrivateKey(privateKey: `0x${string}`): WalletC }) } -export function generateWalletFromMnemonic(mnemonic: string[]): { +export function generateWalletFromMnemonic(mnemonic: string[], password: string): { newWallet: WalletClient | null privateKey: string | null } { try { const checkStoredMnemonic = localStorage.getItem('storedMnemonic') if (!checkStoredMnemonic) { - localStorage.setItem('storedMnemonic', mnemonic.join(' ')) + localStorage.setItem('storedMnemonic', encryption(mnemonic.join(' '), password)) } const seed = mnemonicToSeedSync(mnemonic.join(' ')) const masterKey = HDKey.fromMasterSeed(seed)