diff --git a/package.json b/package.json index f540f8445..8fdd71df8 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "@heroicons/react": "^1.0.6", "@reduxjs/toolkit": "^2.8.2", "@sidhujag/sysweb3-core": "^1.0.27", - "@sidhujag/sysweb3-keyring": "^1.0.531", + "@sidhujag/sysweb3-keyring": "^1.0.533", "@sidhujag/sysweb3-network": "^1.0.105", "@sidhujag/sysweb3-utils": "^1.1.256", "@tippyjs/react": "^4.2.6", diff --git a/source/assets/locales/de.json b/source/assets/locales/de.json index ae7c874cf..d3f04d982 100644 --- a/source/assets/locales/de.json +++ b/source/assets/locales/de.json @@ -213,7 +213,9 @@ "walletLoggedOut": "Wallet ist abgemeldet", "closeAndReopenPali": "Schließen Sie dieses Fenster und öffnen Sie Pali erneut, um sich zu authentifizieren und Ihre Hardware-Wallet zu verbinden", "activeAccountNotFound": "Fehler: Aktives Konto nicht gefunden", - "paliWalletBrowserExtension": "Pali Wallet Browser-Erweiterung" + "paliWalletBrowserExtension": "Pali Wallet Browser-Erweiterung", + "addressType": "Adresstyp", + "taprootDisabled": "Taproot-Signierung bald verfügbar" }, "components": { "newPassword": "Neues Passwort (min. 8 Zeichen)", diff --git a/source/assets/locales/en.json b/source/assets/locales/en.json index 48cbd391c..372fd80e5 100644 --- a/source/assets/locales/en.json +++ b/source/assets/locales/en.json @@ -531,7 +531,9 @@ "walletLoggedOut": "Wallet is logged out", "closeAndReopenPali": "Close this window and reopen Pali to authenticate and connect your hardware wallet", "activeAccountNotFound": "Error: Active account not found", - "paliWalletBrowserExtension": "Pali Wallet Browser Extension" + "paliWalletBrowserExtension": "Pali Wallet Browser Extension", + "addressType": "Address type", + "taprootDisabled": "Taproot signing coming soon" }, "start": { "paliDoesnt": "Pali doesn't store your password. Regaining access requires a wallet reset with your Secret Recovery Phrase. This action erases the current wallet, created accounts, custom tokens, and imported accounts from your device, generating a new account tied to the reset phrase.", diff --git a/source/assets/locales/es.json b/source/assets/locales/es.json index 94d322822..2cdce442c 100644 --- a/source/assets/locales/es.json +++ b/source/assets/locales/es.json @@ -531,7 +531,9 @@ "walletLoggedOut": "La billetera está desconectada", "closeAndReopenPali": "Cierre esta ventana y reabra Pali para autenticarse y conectar su billetera de hardware", "activeAccountNotFound": "Error: Cuenta activa no encontrada", - "paliWalletBrowserExtension": "Extensión del Navegador Pali Wallet" + "paliWalletBrowserExtension": "Extensión del Navegador Pali Wallet", + "addressType": "Tipo de dirección", + "taprootDisabled": "La firma Taproot estará disponible pronto" }, "start": { "paliDoesnt": "Pali no guarda tu contraseña. Recuperar el acceso requiere un reinicio de la billetera con tu Frase Secreta de Recuperación. Esta acción borra la billetera actual, las cuentas creadas, tokens personalizados y cuentas importadas de tu dispositivo, generando una nueva cuenta vinculada a la frase de reinicio.", diff --git a/source/assets/locales/fr.json b/source/assets/locales/fr.json index d0902fe18..80aecd97d 100644 --- a/source/assets/locales/fr.json +++ b/source/assets/locales/fr.json @@ -213,7 +213,9 @@ "walletLoggedOut": "Le portefeuille est déconnecté", "closeAndReopenPali": "Fermez cette fenêtre et rouvrez Pali pour vous authentifier et connecter votre portefeuille matériel", "activeAccountNotFound": "Erreur: Compte actif non trouvé", - "paliWalletBrowserExtension": "Extension de Navigateur Pali Wallet" + "paliWalletBrowserExtension": "Extension de Navigateur Pali Wallet", + "addressType": "Type d'adresse", + "taprootDisabled": "Signature Taproot bientôt disponible" }, "components": { "newPassword": "Nouveau mot de passe (8 caractères min.)", diff --git a/source/assets/locales/ja.json b/source/assets/locales/ja.json index fd92245bd..98c7863a1 100644 --- a/source/assets/locales/ja.json +++ b/source/assets/locales/ja.json @@ -213,7 +213,9 @@ "walletLoggedOut": "ウォレットがログアウトしています", "closeAndReopenPali": "このウィンドウを閉じてPaliを再度開き、認証してハードウェアウォレットを接続してください", "activeAccountNotFound": "エラー:アクティブなアカウントが見つかりません", - "paliWalletBrowserExtension": "Pali Walletブラウザ拡張機能" + "paliWalletBrowserExtension": "Pali Walletブラウザ拡張機能", + "addressType": "アドレスタイプ", + "taprootDisabled": "Taproot 署名は近日対応" }, "components": { "newPassword": "新しいパスワード(最低8文字)", diff --git a/source/assets/locales/ko.json b/source/assets/locales/ko.json index 5accbdf35..af2f6ac8d 100644 --- a/source/assets/locales/ko.json +++ b/source/assets/locales/ko.json @@ -213,7 +213,9 @@ "walletLoggedOut": "지갑이 로그아웃되었습니다", "closeAndReopenPali": "이 창을 닫고 Pali를 다시 열어서 인증하고 하드웨어 지갑을 연결하세요", "activeAccountNotFound": "오류: 활성 계정을 찾을 수 없습니다", - "paliWalletBrowserExtension": "Pali Wallet 브라우저 확장" + "paliWalletBrowserExtension": "Pali Wallet 브라우저 확장", + "addressType": "주소 유형", + "taprootDisabled": "Taproot 서명은 곧 지원됩니다" }, "components": { "newPassword": "새 비밀번호 (최소 8자)", diff --git a/source/assets/locales/pt.json b/source/assets/locales/pt.json index 80fe38391..5373837e8 100644 --- a/source/assets/locales/pt.json +++ b/source/assets/locales/pt.json @@ -526,7 +526,9 @@ "walletLoggedOut": "A carteira está desconectada", "closeAndReopenPali": "Feche esta janela e reabra o Pali para autenticar e conectar sua carteira de hardware", "activeAccountNotFound": "Erro: Conta ativa não encontrada", - "paliWalletBrowserExtension": "Extensão do Navegador Pali Wallet" + "paliWalletBrowserExtension": "Extensão do Navegador Pali Wallet", + "addressType": "Tipo de endereço", + "taprootDisabled": "Assinatura Taproot em breve" }, "start": { "paliDoesnt": "O Pali não armazena sua senha. Para recuperar o acesso, é necessário redefinir a carteira com sua Frase de Recuperação Secreta. Esta ação apaga a carteira atual, contas criadas, tokens personalizados e contas importadas do seu dispositivo, gerando uma nova conta vinculada à frase de redefinição.", diff --git a/source/assets/locales/ru.json b/source/assets/locales/ru.json index 30b84b476..299bdb8d4 100644 --- a/source/assets/locales/ru.json +++ b/source/assets/locales/ru.json @@ -213,7 +213,9 @@ "walletLoggedOut": "Кошелёк вышел из системы", "closeAndReopenPali": "Закройте это окно и снова откройте Pali для аутентификации и подключения аппаратного кошелька", "activeAccountNotFound": "Ошибка: Активный аккаунт не найден", - "paliWalletBrowserExtension": "Расширение для браузера Pali Wallet" + "paliWalletBrowserExtension": "Расширение для браузера Pali Wallet", + "addressType": "Тип адреса", + "taprootDisabled": "Подпись Taproot скоро будет доступна" }, "components": { "newPassword": "Новый пароль (мин. 8 символов)", diff --git a/source/assets/locales/zh.json b/source/assets/locales/zh.json index b74be2d48..19ed32017 100644 --- a/source/assets/locales/zh.json +++ b/source/assets/locales/zh.json @@ -213,7 +213,9 @@ "walletLoggedOut": "钱包已注销", "closeAndReopenPali": "关闭此窗口并重新打开 Pali 以进行身份验证并连接您的硬件钱包", "activeAccountNotFound": "错误:未找到活跃账户", - "paliWalletBrowserExtension": "Pali钱包浏览器扩展" + "paliWalletBrowserExtension": "Pali钱包浏览器扩展", + "addressType": "地址类型", + "taprootDisabled": "Taproot 签名即将推出" }, "components": { "newPassword": "新密码(至少8个字符)", diff --git a/source/pages/Home/Panel/components/Transactions/UTXO/UtxoList.tsx b/source/pages/Home/Panel/components/Transactions/UTXO/UtxoList.tsx index e05e1e187..c1ab2e24e 100644 --- a/source/pages/Home/Panel/components/Transactions/UTXO/UtxoList.tsx +++ b/source/pages/Home/Panel/components/Transactions/UTXO/UtxoList.tsx @@ -74,9 +74,13 @@ const UtxoTransactionsListComponentBase = ({ const isSentByUs = anyVinOwn; const signChar = isSentByUs ? '-' : '+'; const signClass = isSentByUs ? 'text-warning-error' : 'text-brand-green'; - // Native SYS amount from first vout + // Native SYS amount: prefer output to our address for watch-only single-address accounts + // Fallback to first vout when no match (legacy behavior) if (!intent && Array.isArray(tx?.vout) && tx.vout.length > 0) { - const value = Number(tx.vout[0]?.value || 0); // satoshis + const candidateVout = + tx.vout.find((v: any) => v?.isOwn === true) || tx.vout[0]; + + const value = Number(candidateVout?.value || 0); // satoshis if (!isNaN(value) && value > 0) { const baseSymbol = activeNetwork?.currency ? String(activeNetwork.currency).toUpperCase() diff --git a/source/pages/Settings/ImportAccount.tsx b/source/pages/Settings/ImportAccount.tsx index 0da1b2d15..85c147620 100644 --- a/source/pages/Settings/ImportAccount.tsx +++ b/source/pages/Settings/ImportAccount.tsx @@ -1,6 +1,6 @@ import { Input, Form } from 'antd'; import { useForm } from 'antd/es/form/Form'; -import React, { useState } from 'react'; +import React, { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useSelector } from 'react-redux'; import { useLocation } from 'react-router-dom'; @@ -27,6 +27,9 @@ const ImportAccountView = () => { const [isImporting, setIsImporting] = useState(false); const [watchOnly, setWatchOnly] = useState(false); const [validIdentifier, setValidIdentifier] = useState(false); + const [selectedUtxoAddressType, setSelectedUtxoAddressType] = useState< + 'p2wpkh' | 'p2pkh' + >('p2wpkh'); const { accounts, @@ -47,7 +50,15 @@ const ImportAccountView = () => { watchOnly ? ['wallet', 'importWatchOnlyFromController'] : ['wallet', 'importAccountFromPrivateKey'], - [form.getFieldValue('privKey'), form.getFieldValue('label')] + watchOnly + ? [form.getFieldValue('privKey'), form.getFieldValue('label')] + : [ + form.getFieldValue('privKey'), + form.getFieldValue('label'), + isBitcoinBased + ? { utxoAddressType: selectedUtxoAddressType } + : undefined, + ] ); if (account) setIsAccountImported(true); @@ -66,6 +77,20 @@ const ImportAccountView = () => { } }; + // Simple WIF heuristic for showing the address-type selector: only on UTXO networks, not watch-only, not extended keys + const showAddressTypeSelector = useMemo(() => { + if (watchOnly || !isBitcoinBased) return false; + const value: string = form.getFieldValue('privKey') || ''; + if (!value) return false; + const prefix = value.substring(0, 4); + const looksLikeExtended = ['zprv', 'vprv', 'xprv', 'tprv'].includes(prefix); + const looksLikeHex = + value.startsWith('0x') || /^[0-9a-fA-F]{64}$/.test(value); + if (looksLikeExtended || looksLikeHex) return false; + // If basic validation passed, treat as WIF and show selector + return validPrivateKey; + }, [watchOnly, isBitcoinBased, form, validPrivateKey]); + return ( <> { id="account-name-input" /> + {showAddressTypeSelector && ( +
+ +
+ + + +
+
+ )}
({ label: 'Syscoin Mainnet', currency: 'sys', url: 'https://blockbook.syscoin.org/', - explorer: 'https://blockbook.syscoin.org/', + explorer: 'https://explorer-blockbook.syscoin.org/', default: true, kind: INetworkType.Syscoin, }); @@ -19,7 +19,7 @@ export const getSyscoinUTXOTestnetNetwork = (): INetwork => ({ label: 'Syscoin Testnet', currency: 'tsys', url: 'https://blockbook-dev.syscoin.org/', - explorer: 'https://blockbook-dev.syscoin.org/', + explorer: 'https://explorer-blockbook-dev.syscoin.org/', default: false, kind: INetworkType.Syscoin, }); diff --git a/yarn.lock b/yarn.lock index 597e7a2d3..33418dd0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3003,10 +3003,10 @@ resolved "https://registry.yarnpkg.com/@sidhujag/sysweb3-core/-/sysweb3-core-1.0.27.tgz#b7dd7d065c1845519e91ac470540ab94721eb33b" integrity sha512-aeUJpk+DiziPJbD6HFnfixKZj0T4HYStshjk6+adziftLwamNc3MIp+MtIVZwtzvNpbzIXwAnuJM/QXQsc01NQ== -"@sidhujag/sysweb3-keyring@^1.0.531": - version "1.0.531" - resolved "https://registry.yarnpkg.com/@sidhujag/sysweb3-keyring/-/sysweb3-keyring-1.0.531.tgz#464678ed52114250f67ef25abbb22cd4c408fe64" - integrity sha512-iqMmAmJQlYiN++XnxaJ6FaudM37DNDWT19V9D9bCpr3Rf7WuxQ3PRoryC33aRbamD+mkrj9Sd0aJc50R4YDGpg== +"@sidhujag/sysweb3-keyring@^1.0.533": + version "1.0.533" + resolved "https://registry.yarnpkg.com/@sidhujag/sysweb3-keyring/-/sysweb3-keyring-1.0.533.tgz#392283e3f1b2eabb8a3ae513568296f23c82776e" + integrity sha512-podcWzQIpdGg5kuBFERHIQ5f+paonRVwu8xyiltg8AqP9aezzsLTWlcvuFIdUMdhl8jw/EsJmQAAO021ludjzg== dependencies: "@bitcoinerlab/descriptors" "^2.0.1" "@bitcoinerlab/secp256k1" "^1.0.5"