From fbd6f220e831cb67927defb32eb28826677f586c Mon Sep 17 00:00:00 2001 From: web3max Date: Wed, 17 Jul 2024 11:43:33 +0800 Subject: [PATCH] feat: support eip-6963. fix: switch the Polygon Mumbai test network to the Polygon Amoy test network. --- README-CN.md | 8 +-- README.md | 8 +-- package.json | 2 +- src/lib/constant/chain.ts | 30 ++++---- src/lib/store/index.ts | 3 +- src/lib/ui/Login/WalletList.tsx | 104 +++++++++++++++++++-------- src/lib/ui/Wallet/wallet.stories.tsx | 16 +++-- src/lib/ui/index.ts | 4 +- src/lib/utils/index.ts | 2 +- src/lib/wallets/WalletContext.ts | 9 +++ src/locales/en.po | 10 +-- src/locales/zh-CN.po | 10 +-- src/locales/zh-HK.po | 10 +-- 13 files changed, 138 insertions(+), 78 deletions(-) diff --git a/README-CN.md b/README-CN.md index 6ab442a..37fa41f 100644 --- a/README-CN.md +++ b/README-CN.md @@ -62,7 +62,7 @@ const { Wallet } = await import('wallet-bridge') ```js import { Wallet } from 'wallet-bridge' import { createConfig, http } from '@wagmi/core' -import { bsc, bscTestnet, holesky, mainnet as ethereum, polygon, polygonMumbai } from '@wagmi/core/chains' +import { bsc, bscTestnet, holesky, mainnet as ethereum, polygon, polygonAmoy } from '@wagmi/core/chains' import { injected, walletConnect } from '@wagmi/connectors' const walletConnectOptions = { @@ -76,14 +76,14 @@ const walletConnectOptions = { } const wagmiConfig = createConfig({ - chains: [ethereum, holesky, bsc, bscTestnet, polygon, polygonMumbai], + chains: [ethereum, holesky, bsc, bscTestnet, polygon, polygonAmoy], transports: { [ethereum.id]: http(), [holesky.id]: http(), [bsc.id]: http(), [bscTestnet.id]: http(), [polygon.id]: http(), - [polygonMumbai.id]: http(), + [polygonAmoy.id]: http(), }, connectors: [injected(), walletConnect(walletConnectOptions)], }) @@ -244,7 +244,7 @@ await onClose() - `canAddDevice`: 是否可以添加备份设备,类型为`boolean`。 - `iCloudPasskeySupport`: 当前环境是否支持将 passkey 存储在 iCloud 中,类型为`boolean`。 - `customChains`: 自定义显示的链,类型为`CustomChain[]`。 - - `customWallets`: 自定义显示的钱包,类型为`CustomWallet[]`。 + - `customWallets`: 自定义显示的钱包,类型为`string[]`。 - `alias`: 当前登录的钱包地址设置的 .bit alias,类型为`string`。 - `locale`: 当前使用的语言,类型为`string`。 - `chainId`: 当使用 EVM 链钱包登录时表示对应的链 ID,类型为`number`。当使用 TRON 钱包登录时表示对应的链 ID,类型为`string`。 diff --git a/README.md b/README.md index 8aaebfe..cb62716 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ To create a new `Wallet` object, you can use its constructor and provide the fol ```js import { Wallet } from 'wallet-bridge' import { createConfig, http } from '@wagmi/core' -import { bsc, bscTestnet, holesky, mainnet as ethereum, polygon, polygonMumbai } from '@wagmi/core/chains' +import { bsc, bscTestnet, holesky, mainnet as ethereum, polygon, polygonAmoy } from '@wagmi/core/chains' import { injected, walletConnect } from '@wagmi/connectors' const walletConnectOptions = { @@ -76,14 +76,14 @@ const walletConnectOptions = { } const wagmiConfig = createConfig({ - chains: [ethereum, holesky, bsc, bscTestnet, polygon, polygonMumbai], + chains: [ethereum, holesky, bsc, bscTestnet, polygon, polygonAmoy], transports: { [ethereum.id]: http(), [holesky.id]: http(), [bsc.id]: http(), [bscTestnet.id]: http(), [polygon.id]: http(), - [polygonMumbai.id]: http(), + [polygonAmoy.id]: http(), }, connectors: [injected(), walletConnect(walletConnectOptions)], }) @@ -244,7 +244,7 @@ await onClose() - `canAddDevice`: Whether a backup device can be added or not, of type `boolean`. - `iCloudPasskeySupport`: Whether the current environment supports storing the passkey in iCloud, of type `boolean`. - `customChains`: Custom chains to be displayed, of type `CustomChain[]`. - - `customWallets`: Custom wallets to be displayed, of type `CustomWallet[]`. + - `customWallets`: Custom wallets to be displayed, of type `string[]`. - `alias`: The .bit alias set for the currently logged-in wallet address, of type `string`. - `locale`: The language currently in use, of type `string`. - `chainId`: When logging in with an EVM chain wallet, it represents the corresponding chain ID, of type `number`. When logging in with an TRON wallet, it represents the corresponding chain ID, of type `string`. diff --git a/package.json b/package.json index 5ba97f8..f592e84 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wallet-bridge", "private": false, - "version": "1.0.0-beta.11", + "version": "1.0.0-beta.12", "main": "./dist/wallet-bridge.umd.js", "module": "./dist/wallet-bridge.es.js", "types": "./dist/index.d.ts", diff --git a/src/lib/constant/chain.ts b/src/lib/constant/chain.ts index c5d2e0b..8ab7c44 100644 --- a/src/lib/constant/chain.ts +++ b/src/lib/constant/chain.ts @@ -5,7 +5,7 @@ export enum ChainId { bsc = 56, bscTestnet = 97, polygon = 137, - polygonMumbai = 80001, + polygonAmoy = 80002, tron = '0x2b6653dc', tronNile = '0xcd8690dc', btc = 'livenet', @@ -34,7 +34,7 @@ export const CoinTypeToChainIdMap: Record = { export const CoinTypeToTestNetChainIdMap: Record = { [CoinType.eth]: ChainId.ethHolesky, [CoinType.bsc]: ChainId.bscTestnet, - [CoinType.matic]: ChainId.polygonMumbai, + [CoinType.matic]: ChainId.polygonAmoy, [CoinType.trx]: ChainId.tronNile, [CoinType.btc]: ChainId.btcTestnet, } @@ -48,7 +48,7 @@ export const CoinTypeToTorusHostMap: Record = { export const CoinTypeToTorusHostTestNetMap: Record = { [CoinType.eth]: 'holesky', [CoinType.bsc]: 'bsc_testnet', - [CoinType.matic]: 'mumbai', + [CoinType.matic]: 'amoy', } export const ChainIdToCoinTypeMap: Record = { @@ -62,7 +62,7 @@ export const ChainIdToCoinTypeMap: Record = { export const ChainIdToCoinTypeTestNetMap: Record = { [ChainId.ethHolesky]: CoinType.eth, [ChainId.bscTestnet]: CoinType.bsc, - [ChainId.polygonMumbai]: CoinType.matic, + [ChainId.polygonAmoy]: CoinType.matic, [ChainId.tronNile]: CoinType.trx, [ChainId.btcTestnet]: CoinType.btc, } @@ -155,7 +155,7 @@ export const Polygon: IMainChain = { icon: 'polygon', tokenId: 'polygon_matic', explorerTrx: 'https://polygonscan.com/tx/', - testExplorerTrx: 'https://mumbai.polygonscan.com/tx/', + testExplorerTrx: 'https://amoy.polygonscan.com/tx/', } export const DOGE: IMainChain = { @@ -190,14 +190,14 @@ export const CoinTypeToChainMap: Record = { [CoinType.ckb]: CKB, } -export enum CustomWallet { - metaMask = 'MetaMask', - trustWallet = 'TrustWallet', - imToken = 'imToken', - tokenPocket = 'TokenPocket', - unisat = 'Unisat', - oneKey = 'OneKey', - iToken = 'iToken', - tronLink = 'TronLink', - walletConnect = 'WalletConnect', +export const CustomWallet: Record = { + metaMask: 'MetaMask', + trustWallet: 'TrustWallet', + imToken: 'imToken', + tokenPocket: 'TokenPocket', + unisat: 'Unisat', + oneKey: 'OneKey', + iToken: 'iToken', + tronLink: 'TronLink', + walletConnect: 'WalletConnect', } diff --git a/src/lib/store/index.ts b/src/lib/store/index.ts index df2edc0..5a047a8 100644 --- a/src/lib/store/index.ts +++ b/src/lib/store/index.ts @@ -5,7 +5,6 @@ import { CoinTypeToChainIdMap, CoinTypeToTestNetChainIdMap, CustomChain, - CustomWallet, DotbitIndexerApi, DotbitIndexerTestApi, WalletProtocol, @@ -39,7 +38,7 @@ export interface WalletState { isSwitchAddress?: boolean iCloudPasskeySupport?: boolean customChains?: CustomChain[] - customWallets?: CustomWallet[] + customWallets?: string[] alias?: string locale?: string } diff --git a/src/lib/ui/Login/WalletList.tsx b/src/lib/ui/Login/WalletList.tsx index fb158a7..3da9515 100644 --- a/src/lib/ui/Login/WalletList.tsx +++ b/src/lib/ui/Login/WalletList.tsx @@ -16,10 +16,11 @@ import OneKeyIcon from './icon/onekey-icon.svg' import TronLinkIcon from './icon/tronlink-icon.svg' import WalletConnectIcon from './icon/walletconnect-icon.svg' import { t } from '@lingui/macro' +import { getConnectors } from '@wagmi/core' interface IWallet { icon: ReactNode - name: CustomWallet + name: string supportList: CoinType[] } @@ -32,29 +33,19 @@ export const WalletList = ({ transitionRef, transitionStyle }: SwapChildProps) = const { walletSnap } = useWalletState() const wallets = useMemo(() => { - return [ + const connectors = getConnectors(walletSDK.context.wagmiConfig) + + let list = [ { // eslint-disable-next-line lingui/no-unlocalized-strings icon: WalletConnect, name: CustomWallet.walletConnect, supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], }, - { - // eslint-disable-next-line lingui/no-unlocalized-strings - icon: MetaMask, - name: CustomWallet.metaMask, - supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], - }, - { - // eslint-disable-next-line lingui/no-unlocalized-strings - icon: TrustWallet, - name: CustomWallet.trustWallet, - supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], - }, { icon: imToken, name: CustomWallet.imToken, - supportList: [CoinType.eth, CoinType.bsc, CoinType.matic, CoinType.trx], + supportList: [CoinType.trx], }, // { // icon: Unisat, @@ -65,19 +56,8 @@ export const WalletList = ({ transitionRef, transitionStyle }: SwapChildProps) = // eslint-disable-next-line lingui/no-unlocalized-strings icon: TokenPocket, name: CustomWallet.tokenPocket, - supportList: [CoinType.eth, CoinType.bsc, CoinType.matic, CoinType.trx, CoinType.doge], - }, - { - // eslint-disable-next-line lingui/no-unlocalized-strings - icon: OneKey, - name: CustomWallet.oneKey, - supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], + supportList: [CoinType.trx, CoinType.doge], }, - // { - // icon: iToken, - // name: CustomWallet.iToken, - // supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], - // }, { // eslint-disable-next-line lingui/no-unlocalized-strings icon: TronLink, @@ -85,7 +65,75 @@ export const WalletList = ({ transitionRef, transitionStyle }: SwapChildProps) = supportList: [CoinType.trx], }, ] - }, []) + + if (connectors.length > 2) { + connectors.forEach((connector) => { + if (connector.name !== 'WalletConnect' && connector.name !== 'Injected') { + list.unshift({ + icon: {connector.name}, + name: connector.name, + supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], + }) + } + }) + } else { + list = [ + { + // eslint-disable-next-line lingui/no-unlocalized-strings + icon: WalletConnect, + name: CustomWallet.walletConnect, + supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], + }, + { + // eslint-disable-next-line lingui/no-unlocalized-strings + icon: MetaMask, + name: CustomWallet.metaMask, + supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], + }, + { + // eslint-disable-next-line lingui/no-unlocalized-strings + icon: TrustWallet, + name: CustomWallet.trustWallet, + supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], + }, + { + icon: imToken, + name: CustomWallet.imToken, + supportList: [CoinType.eth, CoinType.bsc, CoinType.matic, CoinType.trx], + }, + // { + // icon: Unisat, + // name: CustomWallet.unisat, + // supportList: [CoinType.btc], + // }, + { + // eslint-disable-next-line lingui/no-unlocalized-strings + icon: TokenPocket, + name: CustomWallet.tokenPocket, + supportList: [CoinType.eth, CoinType.bsc, CoinType.matic, CoinType.trx, CoinType.doge], + }, + { + // eslint-disable-next-line lingui/no-unlocalized-strings + icon: OneKey, + name: CustomWallet.oneKey, + supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], + }, + // { + // icon: iToken, + // name: CustomWallet.iToken, + // supportList: [CoinType.eth, CoinType.bsc, CoinType.matic], + // }, + { + // eslint-disable-next-line lingui/no-unlocalized-strings + icon: TronLink, + name: CustomWallet.tronLink, + supportList: [CoinType.trx], + }, + ] + } + + return list + }, [walletSDK.context.wagmiConfig]) const showWallets = useMemo(() => { const { coinType } = loginCacheSnap diff --git a/src/lib/ui/Wallet/wallet.stories.tsx b/src/lib/ui/Wallet/wallet.stories.tsx index 2cf012b..892c768 100644 --- a/src/lib/ui/Wallet/wallet.stories.tsx +++ b/src/lib/ui/Wallet/wallet.stories.tsx @@ -3,7 +3,7 @@ import { Button } from '../../components' import { Wallet } from '../index' import { loadScript } from '../../utils' import { createConfig, http } from '@wagmi/core' -import { bsc, bscTestnet, holesky, mainnet as ethereum, polygon, polygonMumbai } from '@wagmi/core/chains' +import { bsc, bscTestnet, holesky, mainnet as ethereum, polygon, polygonAmoy } from '@wagmi/core/chains' import { injected, walletConnect } from '@wagmi/connectors' import handleError from '../../utils/handleError' @@ -22,14 +22,14 @@ const walletConnectOptions = { } const wagmiConfig = createConfig({ - chains: [ethereum, holesky, bsc, bscTestnet, polygon, polygonMumbai], + chains: [ethereum, holesky, bsc, bscTestnet, polygon, polygonAmoy], transports: { [ethereum.id]: http(), [holesky.id]: http(), [bsc.id]: http(), [bscTestnet.id]: http(), [polygon.id]: http(), - [polygonMumbai.id]: http(), + [polygonAmoy.id]: http(), }, connectors: [injected(), walletConnect(walletConnectOptions)], }) @@ -94,10 +94,14 @@ const TemplateConnectWallet = () => { try { const message = '0x123abc' const signature = await signData(message) - console.log(signature) + // const { signData: signData2, onClose: onClose2 } = await wallet.walletSDK?.initSignContext() + // const signature2 = await signData2('0x123abcd') + + console.log('signature: ', signature) + // console.log('signature2: ', signature2) // only Passkey-signed transactions can be verified. - const res = await wallet._verifyPasskeySignature({ message, signature: signature as string }) - console.log(res) + // const res = await wallet._verifyPasskeySignature({ message, signature: signature as string }) + // console.log(res) } catch (err: any) { handleError(err) onClose?.() diff --git a/src/lib/ui/index.ts b/src/lib/ui/index.ts index 2a7428d..8c21ecf 100644 --- a/src/lib/ui/index.ts +++ b/src/lib/ui/index.ts @@ -2,7 +2,7 @@ import WalletSDK from '../wallets' import { useWalletState, getWalletState, setWalletState } from '../store' import { InitSignContextRes } from '../types' import { ISendTrxParams } from '../wallets/WalletTransactionHandler' -import { CustomChain, CustomWallet } from '../constant' +import { CustomChain } from '../constant' import { SignDataParams } from '../wallets/WalletSignerHandler' import { detect, fromNavigator, fromStorage, fromUrl } from '@lingui/detect-locale' import { getShadowDomRoot } from '../utils' @@ -25,7 +25,7 @@ export class Wallet { isTestNet?: boolean loggedInSelectAddress?: boolean customChains?: CustomChain[] - customWallets?: CustomWallet[] + customWallets?: string[] wagmiConfig?: any gtag?: any event?: any diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 955b8e8..109e6c1 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -503,7 +503,7 @@ export function getConnector(wagmiConfig: Config, walletName: string): Connector }) } else { const connector = connectors.find((item: Connector) => { - return item.type === 'injected' && item.name !== 'Injected' + return item.type === 'injected' && item.name === walletName }) if (connector) { return connector diff --git a/src/lib/wallets/WalletContext.ts b/src/lib/wallets/WalletContext.ts index c54ffec..dbf7733 100644 --- a/src/lib/wallets/WalletContext.ts +++ b/src/lib/wallets/WalletContext.ts @@ -262,6 +262,15 @@ export class WalletContext { ticker: 'ETH', tickerName: 'Ethereum', } + : host === 'amoy' + ? { + host: 'https://rpc.ankr.com/polygon_amoy', + chainId: this.chainId as number, + networkName: 'Amoy Test Network', + blockExplorer: 'https://amoy.polygonscan.com', + ticker: 'Matic', + tickerName: 'Polygon', + } : { host, }, diff --git a/src/locales/en.po b/src/locales/en.po index f6809e3..9af4a86 100644 --- a/src/locales/en.po +++ b/src/locales/en.po @@ -202,13 +202,13 @@ msgid "Please download TokenPocket, connect your Dogecoin wallet within the app, msgstr "Please download TokenPocket, connect your Dogecoin wallet within the app, and retry." #: src/lib/wallets/WalletContext.ts:234 -#: src/lib/wallets/WalletContext.ts:289 +#: src/lib/wallets/WalletContext.ts:298 msgid "Please ensure that your browser has the {0} wallet plugin installed and try again." msgstr "Please ensure that your browser has the {0} wallet plugin installed and try again." #: src/lib/wallets/WalletContext.ts:205 #: src/lib/wallets/WalletContext.ts:229 -#: src/lib/wallets/WalletContext.ts:284 +#: src/lib/wallets/WalletContext.ts:293 msgid "Please open this page in your crypto wallet App and try again." msgstr "Please open this page in your crypto wallet App and try again." @@ -264,7 +264,7 @@ msgstr "Please switch your wallet to the TRON Nile test network before connectin msgid "Please try again after unlocking your TokenPocket wallet." msgstr "Please try again after unlocking your TokenPocket wallet." -#: src/lib/wallets/WalletContext.ts:280 +#: src/lib/wallets/WalletContext.ts:289 msgid "Please try again after unlocking your Tron wallet." msgstr "Please try again after unlocking your Tron wallet." @@ -322,7 +322,7 @@ msgstr "Scanning QR code requires access to the camera. Please enable camera per msgid "Secure your assets by adding extra trusted devices like mobile phones, computers or tablets immediately." msgstr "Secure your assets by adding extra trusted devices like mobile phones, computers or tablets immediately." -#: src/lib/ui/Login/WalletList.tsx:176 +#: src/lib/ui/Login/WalletList.tsx:224 msgid "Select Wallet" msgstr "Select Wallet" @@ -358,7 +358,7 @@ msgstr "This device or browser unsupported. Try connect by social or wallet." #: src/lib/ui/LoggedIn/DeviceList.tsx:159 #: src/lib/ui/Login/ChainList.tsx:149 #: src/lib/ui/Login/Connect.tsx:129 -#: src/lib/ui/Login/WalletList.tsx:143 +#: src/lib/ui/Login/WalletList.tsx:191 #: src/lib/utils/handleError.ts:49 #: src/lib/utils/handleError.ts:58 #: src/lib/utils/handleError.ts:67 diff --git a/src/locales/zh-CN.po b/src/locales/zh-CN.po index 39976a5..74aa816 100644 --- a/src/locales/zh-CN.po +++ b/src/locales/zh-CN.po @@ -202,13 +202,13 @@ msgid "Please download TokenPocket, connect your Dogecoin wallet within the app, msgstr "请下载 TokenPocket,连接您的 Dogecoin 钱包,并重试。" #: src/lib/wallets/WalletContext.ts:234 -#: src/lib/wallets/WalletContext.ts:289 +#: src/lib/wallets/WalletContext.ts:298 msgid "Please ensure that your browser has the {0} wallet plugin installed and try again." msgstr "请确保您的浏览器已安装 {0} 钱包插件,并再次尝试。" #: src/lib/wallets/WalletContext.ts:205 #: src/lib/wallets/WalletContext.ts:229 -#: src/lib/wallets/WalletContext.ts:284 +#: src/lib/wallets/WalletContext.ts:293 msgid "Please open this page in your crypto wallet App and try again." msgstr "请在您的加密货币钱包应用中打开此页面,并再次尝试。" @@ -264,7 +264,7 @@ msgstr "请在连接前将您的钱包切换到 TRON Nile 测试网" msgid "Please try again after unlocking your TokenPocket wallet." msgstr "请在解锁您的 TokenPocket 钱包后再试。" -#: src/lib/wallets/WalletContext.ts:280 +#: src/lib/wallets/WalletContext.ts:289 msgid "Please try again after unlocking your Tron wallet." msgstr "请在解锁您的 Tron 钱包后再试。" @@ -322,7 +322,7 @@ msgstr "扫描二维码需要获取摄像头权限,请授权。" msgid "Secure your assets by adding extra trusted devices like mobile phones, computers or tablets immediately." msgstr "通过添加授信设备来保障您资产的安全。" -#: src/lib/ui/Login/WalletList.tsx:176 +#: src/lib/ui/Login/WalletList.tsx:224 msgid "Select Wallet" msgstr "选择钱包" @@ -358,7 +358,7 @@ msgstr "此设备或浏览器不支持 Passkey,请使用其他方式连接。" #: src/lib/ui/LoggedIn/DeviceList.tsx:159 #: src/lib/ui/Login/ChainList.tsx:149 #: src/lib/ui/Login/Connect.tsx:129 -#: src/lib/ui/Login/WalletList.tsx:143 +#: src/lib/ui/Login/WalletList.tsx:191 #: src/lib/utils/handleError.ts:49 #: src/lib/utils/handleError.ts:58 #: src/lib/utils/handleError.ts:67 diff --git a/src/locales/zh-HK.po b/src/locales/zh-HK.po index c224c1c..da46958 100644 --- a/src/locales/zh-HK.po +++ b/src/locales/zh-HK.po @@ -202,13 +202,13 @@ msgid "Please download TokenPocket, connect your Dogecoin wallet within the app, msgstr "請下載 TokenPocket,並在應用內連接您的 Dogecoin 錢包,然後重試。" #: src/lib/wallets/WalletContext.ts:234 -#: src/lib/wallets/WalletContext.ts:289 +#: src/lib/wallets/WalletContext.ts:298 msgid "Please ensure that your browser has the {0} wallet plugin installed and try again." msgstr "請確保您的瀏覽器已安裝 {0} 錢包插件,然後再試。" #: src/lib/wallets/WalletContext.ts:205 #: src/lib/wallets/WalletContext.ts:229 -#: src/lib/wallets/WalletContext.ts:284 +#: src/lib/wallets/WalletContext.ts:293 msgid "Please open this page in your crypto wallet App and try again." msgstr "請在您的加密貨幣錢包應用中打開此頁面,然後再試。" @@ -264,7 +264,7 @@ msgstr "連接前請將您的錢包切換至 TRON Nile 測試網" msgid "Please try again after unlocking your TokenPocket wallet." msgstr "解鎖您的 TokenPocket 錢包後請再試。" -#: src/lib/wallets/WalletContext.ts:280 +#: src/lib/wallets/WalletContext.ts:289 msgid "Please try again after unlocking your Tron wallet." msgstr "解鎖您的 Tron 錢包後請再試。" @@ -322,7 +322,7 @@ msgstr "掃描二維碼需要獲取攝像頭權限,請授權。" msgid "Secure your assets by adding extra trusted devices like mobile phones, computers or tablets immediately." msgstr "通過添加授信設備來保障您資產的安全。" -#: src/lib/ui/Login/WalletList.tsx:176 +#: src/lib/ui/Login/WalletList.tsx:224 msgid "Select Wallet" msgstr "選擇錢包" @@ -358,7 +358,7 @@ msgstr "此設備或瀏覽器不支持 Passkey,請使用其他方式連接。" #: src/lib/ui/LoggedIn/DeviceList.tsx:159 #: src/lib/ui/Login/ChainList.tsx:149 #: src/lib/ui/Login/Connect.tsx:129 -#: src/lib/ui/Login/WalletList.tsx:143 +#: src/lib/ui/Login/WalletList.tsx:191 #: src/lib/utils/handleError.ts:49 #: src/lib/utils/handleError.ts:58 #: src/lib/utils/handleError.ts:67