import { useState } from 'react' import { useNavigate } from 'react-router-dom' import { Card, Form, Input, Button, message, Typography, Radio, Space, Alert } from 'antd' import { ArrowLeftOutlined } from '@ant-design/icons' import { useAccountStore } from '../store/accountStore' import { getAddressFromPrivateKey, getAddressFromMnemonic, getPrivateKeyFromMnemonic, isValidWalletAddress, isValidPrivateKey, isValidMnemonic } from '../utils' import { useMediaQuery } from 'react-responsive' const { Title } = Typography type ImportType = 'privateKey' | 'mnemonic' const AccountImport: React.FC = () => { const navigate = useNavigate() const isMobile = useMediaQuery({ maxWidth: 768 }) const { importAccount, loading } = useAccountStore() const [form] = Form.useForm() const [importType, setImportType] = useState('privateKey') const [derivedAddress, setDerivedAddress] = useState('') const [addressError, setAddressError] = useState('') // 当私钥输入时,自动推导地址 const handlePrivateKeyChange = (e: React.ChangeEvent) => { const privateKey = e.target.value.trim() if (!privateKey) { setDerivedAddress('') setAddressError('') return } // 验证私钥格式 if (!isValidPrivateKey(privateKey)) { setAddressError('私钥格式不正确(应为64位十六进制字符串)') setDerivedAddress('') return } try { const address = getAddressFromPrivateKey(privateKey) setDerivedAddress(address) setAddressError('') // 自动填充钱包地址字段 form.setFieldsValue({ walletAddress: address }) } catch (error: any) { setAddressError(error.message || '无法从私钥推导地址') setDerivedAddress('') } } // 当助记词输入时,自动推导地址 const handleMnemonicChange = (e: React.ChangeEvent) => { const mnemonic = e.target.value.trim() if (!mnemonic) { setDerivedAddress('') setAddressError('') return } // 验证助记词格式 if (!isValidMnemonic(mnemonic)) { setAddressError('助记词格式不正确(应为12或24个单词,用空格分隔)') setDerivedAddress('') return } try { const address = getAddressFromMnemonic(mnemonic, 0) setDerivedAddress(address) setAddressError('') // 自动填充钱包地址字段 form.setFieldsValue({ walletAddress: address }) } catch (error: any) { setAddressError(error.message || '无法从助记词推导地址') setDerivedAddress('') } } const handleSubmit = async (values: any) => { try { let privateKey: string let walletAddress: string if (importType === 'privateKey') { // 私钥模式 privateKey = values.privateKey walletAddress = values.walletAddress // 验证推导的地址和输入的地址是否一致 if (derivedAddress && walletAddress !== derivedAddress) { message.error('钱包地址与私钥不匹配') return } } else { // 助记词模式 if (!values.mnemonic) { message.error('请输入助记词') return } // 从助记词导出私钥和地址 privateKey = getPrivateKeyFromMnemonic(values.mnemonic, 0) const derivedAddressFromMnemonic = getAddressFromMnemonic(values.mnemonic, 0) // 如果用户手动输入了地址,验证是否与推导的地址一致 if (values.walletAddress) { if (values.walletAddress !== derivedAddressFromMnemonic) { // 地址不匹配,使用推导的地址(因为私钥是从助记词导出的,必须使用对应的地址) message.warning(`输入的地址与助记词推导的地址不一致。推导的地址: ${derivedAddressFromMnemonic},将使用推导的地址`) walletAddress = derivedAddressFromMnemonic } else { // 地址匹配,使用用户输入的地址 walletAddress = values.walletAddress } } else { // 如果用户没有输入地址,使用推导的地址 walletAddress = derivedAddressFromMnemonic } } // 验证钱包地址格式 if (!isValidWalletAddress(walletAddress)) { message.error('钱包地址格式不正确') return } await importAccount({ privateKey: privateKey, walletAddress: walletAddress, accountName: values.accountName }) message.success('导入账户成功') navigate('/accounts') } catch (error: any) { message.error(error.message || '导入账户失败') } } return (
导入账户
{ setImportType(e.target.value) setDerivedAddress('') setAddressError('') form.setFieldsValue({ walletAddress: '' }) }} > 私钥 助记词 {importType === 'privateKey' ? ( <> { if (!value) return Promise.resolve() if (!isValidPrivateKey(value)) { return Promise.reject(new Error('私钥格式不正确(应为64位十六进制字符串)')) } return Promise.resolve() } } ]} help={addressError || (derivedAddress ? `推导地址: ${derivedAddress}` : '')} validateStatus={addressError ? 'error' : derivedAddress ? 'success' : ''} > { if (!value) return Promise.resolve() if (!isValidWalletAddress(value)) { return Promise.reject(new Error('钱包地址格式不正确')) } if (derivedAddress && value !== derivedAddress) { return Promise.reject(new Error('钱包地址与私钥不匹配')) } return Promise.resolve() } } ]} > ) : ( <> { if (!value) return Promise.resolve() if (!isValidMnemonic(value)) { return Promise.reject(new Error('助记词格式不正确(应为12或24个单词,用空格分隔)')) } return Promise.resolve() } } ]} help={addressError || (derivedAddress ? `推导地址: ${derivedAddress}` : '')} validateStatus={addressError ? 'error' : derivedAddress ? 'success' : ''} > { if (!value) return Promise.resolve() if (!isValidWalletAddress(value)) { return Promise.reject(new Error('钱包地址格式不正确')) } if (derivedAddress && value !== derivedAddress) { return Promise.reject(new Error('钱包地址与助记词不匹配')) } return Promise.resolve() } } ]} > )}
) } export default AccountImport