From cbbaa77ed1ff733e03624f1e7dac3aa183a2f039 Mon Sep 17 00:00:00 2001 From: jagdeep sidhu Date: Tue, 26 Aug 2025 16:21:29 -0700 Subject: [PATCH 1/4] update explorer urls --- source/utils/defaultNetworks.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/utils/defaultNetworks.ts b/source/utils/defaultNetworks.ts index 6a04eb826..280e9f3f6 100644 --- a/source/utils/defaultNetworks.ts +++ b/source/utils/defaultNetworks.ts @@ -8,7 +8,7 @@ export const getSyscoinUTXOMainnetNetwork = (): INetwork => ({ 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, }); From a886997b36dd2aa799f708de65ecb090d29214ae Mon Sep 17 00:00:00 2001 From: jagdeep sidhu Date: Tue, 26 Aug 2025 17:45:26 -0700 Subject: [PATCH 2/4] display amounts for watch only (when isown isnt set by backend) --- .../Home/Panel/components/Transactions/UTXO/UtxoList.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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() From 7059d5c1f3867018ff88ce420ddff933565ac824 Mon Sep 17 00:00:00 2001 From: jagdeep sidhu Date: Tue, 26 Aug 2025 19:09:12 -0700 Subject: [PATCH 3/4] feat(utxo): support legacy P2PKH import and sending; add WIF address-type selector - Keyring: extend importAccount(privKey, label?, { utxoAddressType }) to accept 'p2wpkh' (default) or 'p2pkh' - MainController: forward { utxoAddressType } to keyring import - Import Account UI: add address type selector for WIF (SegWit bech32 P2WPKH default, Legacy P2PKH; Taproot shown disabled) - i18n: add settings.addressType and settings.taprootDisabled across all locales - Send: expand SYS address validation to accept legacy base58 (P2PKH/P2SH) in addition to bech32 via bitcoinjs fallback - No signing logic changes; PSBT flow already handles legacy (nonWitnessUtxo) --- package.json | 2 +- source/assets/locales/de.json | 4 +- source/assets/locales/en.json | 4 +- source/assets/locales/es.json | 4 +- source/assets/locales/fr.json | 4 +- source/assets/locales/ja.json | 4 +- source/assets/locales/ko.json | 4 +- source/assets/locales/pt.json | 4 +- source/assets/locales/ru.json | 4 +- source/assets/locales/zh.json | 4 +- source/pages/Settings/ImportAccount.tsx | 63 ++++++++++++++++++- .../Background/controllers/MainController.ts | 33 ++++++++-- yarn.lock | 8 +-- 13 files changed, 120 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index f540f8445..a0a11207e 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.532", "@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/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 && ( +
+ +
+ + + +
+
+ )}
Date: Tue, 26 Aug 2025 19:22:13 -0700 Subject: [PATCH 4/4] updated keyring for legacy address import --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index a0a11207e..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.532", + "@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/yarn.lock b/yarn.lock index c8dd6b737..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.532": - version "1.0.532" - resolved "https://registry.yarnpkg.com/@sidhujag/sysweb3-keyring/-/sysweb3-keyring-1.0.532.tgz#97a8394a234adacdf43091be56e1144efe987941" - integrity sha512-zG8oU6rXHhjVsiun074Ix91CshkumBAyf0k9Y8/eFiIjgwdraLN3b2nOi4x4WZ/PjEJYD0iZgdAoPsmWGub7hA== +"@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"