Skip to content

Commit

Permalink
fix: handle duplicated wallet name (#10459)
Browse files Browse the repository at this point in the history
* fix: handle duplicated wallet name

* fix: enable

* chore: add test

* fix: handle duplicated wallet name

* fix: add test

* fix: add test

* fix: naming

* fix: add test

* fix: add test

* fix: add test

* fix: add test

* fix: add test

* chore: rename

* fix: no disconect when own proof change

* fix: naming

* fix: persona setting link

* chore: reply code review
  • Loading branch information
zhouhanseng committed Aug 18, 2023
1 parent 852632a commit 8ab78c9
Show file tree
Hide file tree
Showing 16 changed files with 96 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import { Box } from '@mui/system'
import { Typography } from '@mui/material'
import { makeStyles } from '@masknet/theme'
import { WalletServiceRef } from '@masknet/plugin-infra/dom'
import { DashboardRoutes, EMPTY_LIST, generateNewWalletName } from '@masknet/shared-base'
import { HD_PATH_WITHOUT_INDEX_ETHEREUM, currySameAddress } from '@masknet/web3-shared-base'
import { DashboardRoutes, EMPTY_LIST } from '@masknet/shared-base'
import { HD_PATH_WITHOUT_INDEX_ETHEREUM, currySameAddress, generateNewWalletName } from '@masknet/web3-shared-base'
import { useWallets } from '@masknet/web3-hooks-base'
import { DeriveWalletTable } from '@masknet/shared'
import { SetupFrameController } from '../../../components/SetupFrame/index.js'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import { Alert, alpha, Box, Button, Stack, Typography, useTheme } from '@mui/mat
import { makeStyles } from '@masknet/theme'
import { Icons } from '@masknet/icons'
import { CopyButton } from '@masknet/shared'
import { DashboardRoutes, generateNewWalletName } from '@masknet/shared-base'
import { DashboardRoutes } from '@masknet/shared-base'
import { generateNewWalletName } from '@masknet/web3-shared-base'
import { WalletServiceRef } from '@masknet/plugin-infra/dom'
import { MnemonicReveal } from '../../../components/Mnemonic/index.js'
import { PrimaryButton } from '../../../components/PrimaryButton/index.js'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { memo, useCallback, useMemo, useState } from 'react'
import type { UseFormSetError } from 'react-hook-form'
import { useLocation, useNavigate } from 'react-router-dom'
import { DashboardRoutes, generateNewWalletName } from '@masknet/shared-base'
import { DashboardRoutes } from '@masknet/shared-base'
import { generateNewWalletName } from '@masknet/web3-shared-base'
import { MaskTabList, makeStyles, useTabs } from '@masknet/theme'
import { TabContext, TabPanel } from '@mui/lab'
import { Tab, Typography } from '@mui/material'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
import { ec as EC } from 'elliptic'
import { concatArrayBuffer } from '@masknet/kit'
import type { NormalizedBackup } from '@masknet/backup-format'
import { currySameAddress, HD_PATH_WITHOUT_INDEX_ETHEREUM } from '@masknet/web3-shared-base'
import {
fromBase64URL,
type EC_JsonWebKey,
isK256Point,
isK256PrivateKey,
currySameAddress,
HD_PATH_WITHOUT_INDEX_ETHEREUM,
generateNewWalletName,
handleDuplicatedWalletName,
} from '@masknet/shared-base'
generateUniqueWalletName,
} from '@masknet/web3-shared-base'
import { fromBase64URL, type EC_JsonWebKey, isK256Point, isK256PrivateKey } from '@masknet/shared-base'
import {
getDerivableAccounts,
getWallets,
Expand All @@ -21,7 +19,16 @@ export async function internal_wallet_restore(backup: NormalizedBackup.WalletBac
for (const wallet of backup) {
try {
const wallets = await getWallets()
const name = wallet.name ? handleDuplicatedWalletName(wallets, wallet.name) : generateNewWalletName(wallets)
const matchedDefaultNameFormat = wallet.name.match(/Wallet (\d+)/)
const index = matchedDefaultNameFormat?.[1]
const name =
wallet.name && !index
? generateUniqueWalletName(wallets, wallet.name)
: generateNewWalletName(
wallets,
undefined,
index && !Number.isNaN(index) ? Number(index) : undefined,
)
if (wallet.privateKey.some)
await recoverWalletFromPrivateKey(name, await JWKToKey(wallet.privateKey.val, 'private'))
else if (wallet.mnemonic.some) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { useMessages, useWallet } from '@masknet/web3-hooks-base'
import { useHasPassword } from '../../hook/useHasPassword.js'
import { useWalletLockStatus } from '../../pages/Wallet/hooks/useWalletLockStatus.js'
import Services from '../../../service.js'
import { useCurrentPersona } from '../../../../components/DataSource/useCurrentPersona.js'

const useStyle = makeStyles()((theme) => ({
navigation: {
Expand Down Expand Up @@ -57,6 +58,8 @@ export const Navigator = memo(function Navigator({ className, ...rest }: BoxProp

const { hasPassword, loading: hasPasswordLoading } = useHasPassword()

const currentPersona = useCurrentPersona()

const walletPageLoading = lockStatusLoading || hasPasswordLoading

const walletLink = useMemo(() => {
Expand All @@ -72,13 +75,15 @@ export const Navigator = memo(function Navigator({ className, ...rest }: BoxProp
const onOpenDashboardSettings = useCallback(async () => {
await browser.tabs.create({
active: true,
url: browser.runtime.getURL(`/dashboard.html#${DashboardRoutes.Settings}`),
url: browser.runtime.getURL(
`/dashboard.html#${currentPersona ? DashboardRoutes.Settings : DashboardRoutes.SignUpPersona}`,
),
})
if (navigator.userAgent.includes('Firefox')) {
window.close()
}
await Services.Helper.removePopupWindow()
}, [])
}, [currentPersona])

return (
<Box className={cx(classes.container, className)} {...rest}>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ const ConnectWalletPage = memo(function ConnectWalletPage() {
}, [modalNavigate])

const handleDone = useCallback(async () => {
await Web3.disconnect({ providerType })
if (providerType !== ProviderType.MaskWallet) await Web3.disconnect({ providerType })
if (providerType === ProviderType.MaskWallet || providerType === ProviderType.WalletConnect) {
navigate(-1)
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,8 @@ export const TransactionDetail = memo(function TransactionDetail() {
})

const { data: txInput, isLoading: loadingTxInput } = useQuery({
enabled: !!transaction && !loadingTx && !tx?.input && transactionState?.type === 'transfer',
enabled:
!!transaction && !loadingTx && !tx?.input && transactionState?.type === 'transfer' && !candidateState.data,
queryKey: [transaction?.chainId, transactionId],
queryFn: async () => {
if (!chainId || !transactionId) return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useMemo } from 'react'
import { useForm } from 'react-hook-form'
import { zodResolver } from '@hookform/resolvers/zod'
import { useContacts, useWallets } from '@masknet/web3-hooks-base'
import { generateNewWalletName } from '@masknet/shared-base'
import { generateNewWalletName } from '@masknet/web3-shared-base'
import { useI18N } from '../../../../../utils/i18n-next-ui.js'

export function useSetWalletNameForm(defaultName?: string) {
Expand Down
15 changes: 0 additions & 15 deletions packages/shared-base/src/helpers/generateNewWalletName.ts

This file was deleted.

17 changes: 0 additions & 17 deletions packages/shared-base/src/helpers/handleDuplicatedWalletName.ts

This file was deleted.

2 changes: 0 additions & 2 deletions packages/shared-base/src/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ export * from './getLocalImplementation.js'
export * from './getDefaultWalletPassword.js'
export * from './markdown.js'
export * from './mixin.js'
export * from './handleDuplicatedWalletName.js'
export * from './personas.js'
export * from './resolve.js'
export * from './subscription.js'
export * from './generateNewWalletName.js'
export * from './getDomainSystem.js'
export * from './parseURL.js'
export * from './purify.js'
Expand Down
10 changes: 10 additions & 0 deletions packages/web3-shared/base/src/helpers/generateNewWalletName.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { max } from 'lodash-es'
import type { Wallet } from '@masknet/shared-base'

export function generateNewWalletName(wallets: Wallet[], index = 0, preIndex?: number) {
const indexList = wallets.filter((x) => !x.owner).map((x) => x.name.split('Wallet ')[1])
const maxIndex = max(indexList.filter((x) => x && !Number.isNaN(x)).map(Number)) ?? 0
const preIndexNotExists = !indexList.some((x) => Number(x) === preIndex)
const finalIndex = preIndex && (preIndex > maxIndex || preIndexNotExists) ? preIndex : maxIndex + index + 1
return `Wallet ${finalIndex}`
}
21 changes: 21 additions & 0 deletions packages/web3-shared/base/src/helpers/generateUniqueWalletName.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { isUndefined, max } from 'lodash-es'
import type { Wallet } from '@masknet/shared-base'

export function generateUniqueWalletName(wallets: Wallet[], name: string) {
const num = name.match(/\((\d+)\)/)?.[1]
const _name = num ? name.split(` (${num})`)?.[0] : name

const maxIndex =
max([
...wallets
.filter((x) => !x.owner)
.map((x) => x.name.split(`${_name} `)[1]?.match(/\((\d+)\)/)?.[1])
.filter((x) => x && !Number.isNaN(x))
.map(Number),
...(num && !Number.isNaN(num) ? [Number(num) - 1] : []),
]) ?? (wallets.some((wallet) => wallet.name === _name) ? 0 : undefined)

if (isUndefined(maxIndex)) return name

return `${_name} (${maxIndex + 1})`
}
2 changes: 2 additions & 0 deletions packages/web3-shared/base/src/helpers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ export * from './formatSupply.js'
export * from './formatURL.js'
export * from './getLocale.js'
export * from './getTokenUSDValue.js'
export * from './generateNewWalletName.js'
export * from './generateUniqueWalletName.js'
export * from './isSameAddress.js'
export * from './isValidTimestamp.js'
export * from './isSameURL.js'
Expand Down
15 changes: 15 additions & 0 deletions packages/web3-shared/base/tests/helpers/generateNewWalletName.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { describe, test, expect } from 'vitest'
import type { Wallet } from '@masknet/shared-base'
import { generateNewWalletName } from '../../src/helpers/generateNewWalletName.js'

describe('generateNewWalletName util test', () => {
test.each([
{ wallets: [{ name: 'Wallet 1' }] as Wallet[], index: 0, expected: 'Wallet 2' },
{ wallets: [{ name: 'Wallet 3' }] as Wallet[], index: 0, expected: 'Wallet 4' },
{ wallets: [{ name: 'Wallet 2' }, { name: 'Wallet 3' }] as Wallet[], index: 1, expected: 'Wallet 5' },
{ wallets: [{ name: 'Wallet 3' }] as Wallet[], index: 0, preIndex: 1, expected: 'Wallet 1' },
{ wallets: [{ name: 'Wallet 5' }] as Wallet[], index: 1, preIndex: 10, expected: 'Wallet 10' },
])('.format($wallets $index $preIndex)', ({ wallets, index, preIndex, expected }) => {
expect(generateNewWalletName(wallets, index, preIndex)).toBe(expected)
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { describe, test, expect } from 'vitest'
import type { Wallet } from '@masknet/shared-base'
import { generateUniqueWalletName } from '../../src/helpers/generateUniqueWalletName.js'

describe('generateUniqueWalletName util test', () => {
test.each([
{ wallets: [{ name: 'a' }] as Wallet[], name: 'a', expected: 'a (1)' },
{ wallets: [{ name: 'b' }] as Wallet[], name: 'a', expected: 'a' },
{ wallets: [{ name: 'b' }] as Wallet[], name: 'a', expected: 'a' },
{ wallets: [{ name: 'a (1)' }, { name: 'a (5)' }] as Wallet[], name: 'a', expected: 'a (6)' },
{ wallets: [{ name: 'a (3)' }] as Wallet[], name: 'a (1)', expected: 'a (4)' },
{ wallets: [{ name: 'a (3)' }] as Wallet[], name: 'a (11)', expected: 'a (11)' },
])('.format($wallets $name)', ({ wallets, name, expected }) => {
expect(generateUniqueWalletName(wallets, name)).toBe(expected)
})
})

0 comments on commit 8ab78c9

Please sign in to comment.