diff --git a/src/components/wallet/verticalNavbar.vue b/src/components/wallet/verticalNavbar.vue index 9f5eab9..45793a6 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) @@ -80,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 08ce17a..e950c18 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 @@ -41,11 +50,15 @@ 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', encryption(mnemonic.join(' '), password)) + } const seed = mnemonicToSeedSync(mnemonic.join(' ')) const masterKey = HDKey.fromMasterSeed(seed) const privateKeyUint8 = masterKey.derive(`m/44'/60'/0'/0/0`).privateKey