From d12158b0a00606688c25f52a5b1d88292d8bff6c Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 12:59:16 -0600 Subject: [PATCH 01/13] Release v8.26.1: Enable V2 transport tests and Qt theme improvements This release includes critical test infrastructure updates and cross-platform UI improvements to prepare for the v8.26.1 stable release. ## Version Bump - Updated version from 8.26.0 to 8.26.1 - Updated CLAUDE.md with current development status ## V2 Transport Protocol Testing - Enabled BIP324 V2 P2P transport protocol tests in functional test suite - V2 transport is now fully tested (disabled by default, enable with -v2transport=1) - Removed obsolete RPC implementation planning document - Updated test_runner.py to include V2 transport test variants ## Qt Wallet Theme Fixes Fixed critical cross-platform rendering issues affecting Windows, macOS, and Linux: ### Dark Mode Fixes - Fixed invisible transaction text on Linux due to light backgrounds - Corrected alternating row colors in transaction tables - Removed invalid CSS syntax (\!important) that broke macOS rendering - Improved transaction list visibility with proper dark blue backgrounds ### Light Mode Fixes - Fixed File menu dropdown with dark background making text unreadable - Improved transaction hash label visibility with explicit text colors - Fixed transaction amount colors to properly display green (received) and red (sent) - Removed overly aggressive color overrides that prevented amount color coding ### Development Infrastructure - Added external CSS hot-loading feature for rapid theme development - Feature disabled by default (uncomment in digibyte.cpp to enable) - Allows live CSS reload from ~/.digibyte-dev/css/ with F5 key - QFileSystemWatcher integration for automatic reload on CSS changes All UI changes ensure consistent appearance and readability across Windows, macOS, and Linux platforms for both light and dark themes. --- CLAUDE.md | 4 +- DIGIBYTE_v8.26_RPC_FIX_IMPLEMENTATION_PLAN.md | 377 ------------------ configure.ac | 2 +- src/qt/digibyte.cpp | 17 +- src/qt/res/css/dark.css | 15 +- src/qt/res/css/light.css | 47 ++- test/functional/test_runner.py | 28 +- 7 files changed, 60 insertions(+), 430 deletions(-) delete mode 100644 DIGIBYTE_v8.26_RPC_FIX_IMPLEMENTATION_PLAN.md diff --git a/CLAUDE.md b/CLAUDE.md index 30cda513f48..6210515f339 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -108,10 +108,10 @@ For detailed patterns, see COMMON_FIXES.md ## Important Notes - **Three-way comparison**: Always compare v8.26 ↔ v8.22.2 ↔ Bitcoin v26.2 -- **Test all variants**: --descriptors, --legacy-wallet, --usecli +- **Test all variants**: --descriptors, --legacy-wallet, --usecli, --v2transport - **Document everything**: Update tracking files immediately - **Mock scrypt**: Currently using mock, causes PoW validation issues -- **v2transport tests**: p2p_leak_tx.py --v2transport is disabled (causes hang) as v2transport is not supported in DigiByte +- **V2 transport**: BIP324 V2 P2P transport is fully supported and tested (disabled by default, enable with `-v2transport=1`) --- diff --git a/DIGIBYTE_v8.26_RPC_FIX_IMPLEMENTATION_PLAN.md b/DIGIBYTE_v8.26_RPC_FIX_IMPLEMENTATION_PLAN.md deleted file mode 100644 index 8cf7a410138..00000000000 --- a/DIGIBYTE_v8.26_RPC_FIX_IMPLEMENTATION_PLAN.md +++ /dev/null @@ -1,377 +0,0 @@ -# DigiByte v8.26 RPC Fix Implementation Plan -## Minimal Changes to Restore v8.22 Multi-Algorithm Functionality - -**Date**: 2025-08-30 -**Objective**: Fix 4 critical RPC issues with minimal code changes, maintaining v8.26 architecture while restoring v8.22 functionality - ---- - -## Quick Task Summary for Sub-Agent Assignment - -### 🔴 CRITICAL RPC FIXES (Priority 1) - -| Task # | Fix | File | Lines | Issue | -|--------|-----|------|-------|-------| -| 1 | `getdifficulty` | `src/rpc/blockchain.cpp` | 428-446 | Returns single value instead of multi-algo object | -| 2 | `getmininginfo` | `src/rpc/mining.cpp` | After 505 | Missing "networkhashesps" field | -| 3 | `blockheaderToJSON` | `src/rpc/blockchain.cpp` | 170-172 | Wrong difficulty + missing algo fields | -| 4 | `generateblock` | `src/rpc/mining.cpp` | 400 | Hardcoded to SHA256D instead of miningAlgo | - -### 🟡 HIGH PRIORITY FIXES (Priority 2) - -| Task # | Fix | File | Lines | Issue | -|--------|-----|------|-------|-------| -| 5 | `generatetodescriptor` | `src/rpc/mining.cpp` | 236-273 | Missing algorithm parameter | -| 6 | Example addresses | `src/rpc/util.cpp` | 26 | Bitcoin addresses instead of DigiByte | - -### 🟢 TESTING & VALIDATION (Priority 3) - -| Task # | Action | Details | -|--------|--------|----------| -| 7 | Fix test constants | Change `MULTIALGO_HEIGHT = 290` to `100` in test file | -| 8 | Run test suite | Execute `feature_digibyte_multialgo_mining.py` | - -**Total Tasks**: 8 | **Critical**: 4 | **Estimated Time**: 2-4 hours | **Risk**: LOW - ---- - -## Critical Fix #1: Restore Multi-Algorithm `getdifficulty` - -### Current Issue -- **Location**: `src/rpc/blockchain.cpp:443` -- **Problem**: Returns single difficulty value instead of per-algorithm object -- **Impact**: Mining pools cannot query individual algorithm difficulties - -### Implementation Fix - -```cpp -// src/rpc/blockchain.cpp - Replace lines 428-446 - -static RPCHelpMan getdifficulty() -{ - return RPCHelpMan{"getdifficulty", - "\nReturns the proof-of-work difficulty for all active DigiByte mining algorithms.\n", - {}, - RPCResult{ - RPCResult::Type::OBJ, "", "", - { - {RPCResult::Type::OBJ, "difficulties", "The current difficulty for all active DigiByte algorithms", - { - {RPCResult::Type::NUM, "sha256d", /*optional=*/true, "SHA256D difficulty"}, - {RPCResult::Type::NUM, "scrypt", /*optional=*/true, "Scrypt difficulty"}, - {RPCResult::Type::NUM, "groestl", /*optional=*/true, "Groestl difficulty (before Odocrypt)"}, - {RPCResult::Type::NUM, "skein", /*optional=*/true, "Skein difficulty"}, - {RPCResult::Type::NUM, "qubit", /*optional=*/true, "Qubit difficulty"}, - {RPCResult::Type::NUM, "odo", /*optional=*/true, "Odocrypt difficulty (after activation)"}, - }}, - }}, - RPCExamples{ - HelpExampleCli("getdifficulty", "") - + HelpExampleRpc("getdifficulty", "") - }, - [&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue -{ - ChainstateManager& chainman = EnsureAnyChainman(request.context); - LOCK(cs_main); - - const CBlockIndex* tip = chainman.ActiveChain().Tip(); - const Consensus::Params& consensusParams = chainman.GetParams().GetConsensus(); - - UniValue obj(UniValue::VOBJ); - UniValue difficulties(UniValue::VOBJ); - - // Add difficulty for each active algorithm - for (int algo = 0; algo < NUM_ALGOS_IMPL; algo++) { - if (IsAlgoActive(tip, consensusParams, algo)) { - difficulties.pushKV(GetAlgoName(algo), GetDifficulty(tip, nullptr, algo)); - } - } - - obj.pushKV("difficulties", difficulties); - return obj; -}, - }; -} -``` - -### Testing -```bash -# Expected output format: -./digibyted getdifficulty -{ - "difficulties": { - "sha256d": 12345.67, - "scrypt": 23456.78, - "skein": 34567.89, - "qubit": 45678.90, - "odo": 56789.01 - } -} -``` - ---- - -## Critical Fix #2: Add `networkhashesps` to `getmininginfo` - -### Current Issue -- **Location**: `src/rpc/mining.cpp:441-513` -- **Problem**: Missing per-algorithm network hashrate field -- **Impact**: Cannot monitor individual algorithm network hashrates - -### Implementation Fix - -```cpp -// src/rpc/mining.cpp - Add after line 505 (after difficulties object) - - // Add per-algorithm network hashrates (DigiByte specific) - UniValue networkhashesps(UniValue::VOBJ); - for (int algo = 0; algo < NUM_ALGOS_IMPL; algo++) { - if (IsAlgoActive(tip, consensusParams, algo)) { - // Calculate hashrate for last 120 blocks of this algorithm - networkhashesps.pushKV(GetAlgoName(algo), - GetNetworkHashPS(120, -1, active_chain, algo)); - } - } - obj.pushKV("networkhashesps", networkhashesps); -``` - -### Update RPCResult definition (around line 463) -```cpp -// Add after the "difficulties" field definition -{RPCResult::Type::OBJ, "networkhashesps", "Network hashes per second for each algorithm", - { - {RPCResult::Type::NUM, "sha256d", /*optional=*/true, "SHA256D network hashrate"}, - {RPCResult::Type::NUM, "scrypt", /*optional=*/true, "Scrypt network hashrate"}, - {RPCResult::Type::NUM, "groestl", /*optional=*/true, "Groestl network hashrate"}, - {RPCResult::Type::NUM, "skein", /*optional=*/true, "Skein network hashrate"}, - {RPCResult::Type::NUM, "qubit", /*optional=*/true, "Qubit network hashrate"}, - {RPCResult::Type::NUM, "odo", /*optional=*/true, "Odocrypt network hashrate"}, - }}, -``` - ---- - -## Critical Fix #3: Correct `blockheaderToJSON` Difficulty and Add Algorithm Fields - -### Current Issue -- **Location**: `src/rpc/blockchain.cpp:170-172` -- **Problem 1**: Uses default algorithm (Groestl) for all blocks -- **Problem 2**: Missing algorithm fields that exist in `blockToJSON` -- **Impact**: Wrong difficulty and missing algorithm information in block headers - -### Implementation Fix - -```cpp -// src/rpc/blockchain.cpp - Replace line 170 and add algorithm fields after it - - // OLD: result.pushKV("difficulty", GetDifficulty(nullptr, blockindex)); - - // NEW: Fix difficulty to use block's actual algorithm - result.pushKV("difficulty", GetDifficulty(nullptr, blockindex, blockindex->GetAlgo())); - - // REQUIRED: Add algorithm fields (these exist in blockToJSON, must be in header too) - result.pushKV("pow_algo_id", blockindex->GetAlgo()); - result.pushKV("pow_algo", GetAlgoName(blockindex->GetAlgo())); - - // Note: pow_hash requires the full block, not available in blockheaderToJSON - // Note: odo_key would require consensus params - could be added if needed -``` - -**IMPORTANT**: These algorithm fields are NOT optional. The v8.26 `blockToJSON` already includes `pow_algo_id`, `pow_algo`, and `pow_hash` (lines 190-193). For consistency, `blockheaderToJSON` should have at least the algo_id and algo name. - -### Optional Enhancement: Add Algorithm Fields -```cpp -// Add after difficulty line (171+) - result.pushKV("pow_algo_id", blockindex->GetAlgo()); - result.pushKV("pow_algo", GetAlgoName(blockindex->GetAlgo())); - - // Add Odocrypt key if applicable - if (blockindex->GetAlgo() == ALGO_ODO) { - result.pushKV("odo_key", (int64_t)OdoKey(chainman.GetParams().GetConsensus(), blockindex->nTime)); - } -``` - ---- - -## Critical Fix #4: Fix `generateblock` Algorithm - -### Current Issue -- **Location**: `src/rpc/mining.cpp:400` -- **Problem**: Hardcoded to SHA256D instead of using miningAlgo -- **Impact**: Cannot generate blocks with configured algorithm - -### Implementation Fix - -```cpp -// src/rpc/mining.cpp - Replace line 400 - - // OLD: - // std::unique_ptr blocktemplate( - // BlockAssembler{chainman.ActiveChainstate(), nullptr}.CreateNewBlock(coinbase_script, ALGO_SHA256D)); - - // NEW: Use miningAlgo (defaults to ALGO_SCRYPT in DigiByte) - std::unique_ptr blocktemplate( - BlockAssembler{chainman.ActiveChainstate(), nullptr}.CreateNewBlock(coinbase_script, miningAlgo)); -``` - ---- - -## Additional Fix: Add Algorithm Parameter to `generatetodescriptor` - -### Current Issue -- **Location**: `src/rpc/mining.cpp:236-273` -- **Problem**: Missing algorithm parameter that exists in v8.22 - -### Implementation Fix - -```cpp -// src/rpc/mining.cpp - Add after line 244 (after maxtries parameter) - - {"algo", RPCArg::Type::STR, RPCArg::Default{GetAlgoName(ALGO_SCRYPT)}, - "The mining algorithm to use (sha256d, scrypt, groestl, skein, qubit, odo)"}, - -// Then update the function body (around line 260) to parse the algorithm: - - const int num_blocks{request.params[0].get_int()}; - const uint64_t max_tries{request.params[2].isNull() ? DEFAULT_MAX_TRIES : request.params[2].get_int()}; - - // Add algorithm parsing - int algo = ALGO_SCRYPT; // Default - if (!request.params[3].isNull()) { - std::string strAlgo = request.params[3].get_str(); - algo = GetAlgoByName(strAlgo, ALGO_SCRYPT); - } - - // Then use 'algo' when calling generateBlocks: - return generateBlocks(chainman, mempool, coinbase_script, num_blocks, max_tries, algo); -``` - ---- - -## Testing Strategy - -### 1. Unit Tests -Add to `src/test/rpc_tests.cpp`: -```cpp -BOOST_AUTO_TEST_CASE(rpc_getdifficulty_multialgo) -{ - // Test that getdifficulty returns an object with difficulties field - UniValue r = CallRPC("getdifficulty"); - BOOST_CHECK(r.isObject()); - BOOST_CHECK(r.exists("difficulties")); - BOOST_CHECK(r["difficulties"].isObject()); -} -``` - -### 2. Functional Test (see next section for complete test) - -### 3. Manual Testing Commands -```bash -# Test getdifficulty -./digibyte-cli getdifficulty - -# Test getmininginfo -./digibyte-cli getmininginfo | jq '.networkhashesps' - -# Test block header -./digibyte-cli getblockheader $(./digibyte-cli getbestblockhash) - -# Test block generation with algorithm -./digibyte-cli generatetoaddress 1 $(./digibyte-cli getnewaddress) 100000 scrypt -./digibyte-cli generatetoaddress 1 $(./digibyte-cli getnewaddress) 100000 sha256d -``` - ---- - -## Implementation Order - -1. **Phase 1: Core Fixes (Day 1)** - - Fix `getdifficulty` (30 mins) - - Fix `blockheaderToJSON` difficulty (15 mins) - - Test basic functionality - -2. **Phase 2: Mining Info (Day 1)** - - Add `networkhashesps` to `getmininginfo` (30 mins) - - Fix `generateblock` algorithm (15 mins) - - Test mining operations - -3. **Phase 3: Enhancements (Day 2)** - - Add algorithm parameter to `generatetodescriptor` (30 mins) - - Add algorithm fields to `blockheaderToJSON` (20 mins) - - Complete testing suite - -4. **Phase 4: Validation (Day 2)** - - Run full functional test suite - - Test with mining pool software - - Verify block explorer compatibility - ---- - -## Risk Assessment - -| Fix | Risk Level | Mitigation | -|-----|------------|------------| -| `getdifficulty` | LOW | Simple output format change | -| `networkhashesps` | LOW | Adding field, not modifying existing | -| `blockheaderToJSON` | MEDIUM | Ensure GetAlgo() works correctly | -| `generateblock` | LOW | Uses existing miningAlgo variable | -| `generatetodescriptor` | MEDIUM | Parameter parsing needs validation | - ---- - -## Validation Checklist - -- [ ] All algorithms report correct difficulty -- [ ] Network hashrates display for active algorithms -- [ ] Block headers show correct difficulty for their algorithm -- [ ] Block generation uses configured algorithm -- [ ] Mining pools can connect and query statistics -- [ ] Block explorers display algorithm information -- [ ] Regression tests pass -- [ ] No performance degradation - ---- - -## Notes - -1. **Minimal Changes**: All fixes restore v8.22 functionality with minimal code changes -2. **Backward Compatible**: Changes add fields/functionality without breaking existing -3. **Algorithm Constants**: Ensure NUM_ALGOS_IMPL is properly defined (should be 6) -4. **Odocrypt Handling**: Test after activation height (mainnet: 9,112,320, regtest: 600) - ---- - -### Key References for Sub-Agents - -**Algorithm IDs:** -- ALGO_SHA256D = 0 -- ALGO_SCRYPT = 1 (default) -- ALGO_GROESTL = 2 (replaced by Odocrypt) -- ALGO_SKEIN = 3 -- ALGO_QUBIT = 4 -- ALGO_ODO = 7 - -**Important Functions:** -- `IsAlgoActive(tip, consensusParams, algo)` -- `GetAlgoName(algo)` -- `GetAlgoByName(name, fallback)` -- `GetDifficulty(tip, blockindex, algo)` -- `GetNetworkHashPS(lookup, height, chain, algo)` - -**Success Criteria:** -✅ `getdifficulty` returns object with "difficulties" field -✅ `getmininginfo` includes "networkhashesps" field -✅ Block headers show correct difficulty -✅ `generateblock` uses miningAlgo -✅ All tests pass - ---- - -## Code Review Checklist - -Before committing: -1. Verify all algorithm IDs match v8.22 definitions -2. Check that IsAlgoActive() is called correctly -3. Ensure GetAlgoName() handles all algorithm IDs -4. Test with both pre and post-Odocrypt blocks -5. Verify no hardcoded algorithm assumptions remain \ No newline at end of file diff --git a/configure.ac b/configure.ac index af772a05f03..428c71b8d16 100644 --- a/configure.ac +++ b/configure.ac @@ -1,7 +1,7 @@ AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 8) define(_CLIENT_VERSION_MINOR, 26) -define(_CLIENT_VERSION_BUILD, 0) +define(_CLIENT_VERSION_BUILD, 1) define(_CLIENT_VERSION_RC, 0) define(_CLIENT_VERSION_IS_RELEASE, false) define(_COPYRIGHT_YEAR, 2025) diff --git a/src/qt/digibyte.cpp b/src/qt/digibyte.cpp index 0bf8b525df6..a0ae5018bc1 100644 --- a/src/qt/digibyte.cpp +++ b/src/qt/digibyte.cpp @@ -301,13 +301,15 @@ void DigiByteApplication::applyTheme() theme = "dark"; } - // NOTE: CSS hot-loading functionality disabled for production - // Uncomment the following block to enable live CSS reloading from ~/.digibyte-dev/css/ for rapid development + // NOTE: CSS hot-loading functionality DISABLED for production + // To enable for development, uncomment the block below + // This allows live CSS reloading from ~/.digibyte-dev/css/ for rapid theming development + /* // Check if we should use external CSS for live reloading (development mode) QString externalCssDir = QDir::homePath() + "/.digibyte-dev/css/"; QString externalCssPath = externalCssDir + theme + ".css"; - + QFileInfo externalFile(externalCssPath); if (externalFile.exists() && externalFile.isReadable()) { // Use external CSS file for live reloading @@ -315,7 +317,7 @@ void DigiByteApplication::applyTheme() qDebug() << "Using external CSS for live reloading:" << m_externalCssPath; qDebug() << "Press F5 to reload CSS manually"; loadExternalStyleSheet(); - + // Set up file watcher if (!m_cssWatcher) { m_cssWatcher = new QFileSystemWatcher(this); @@ -326,7 +328,7 @@ void DigiByteApplication::applyTheme() m_cssWatcher->removePaths(m_cssWatcher->files()); } m_cssWatcher->addPath(m_externalCssPath); - + return; } */ @@ -586,8 +588,9 @@ bool DigiByteApplication::event(QEvent* e) return true; } - // NOTE: F5 CSS reload functionality disabled for production - // Uncomment to enable F5 key CSS reloading when using external stylesheets + // NOTE: F5 CSS reload functionality DISABLED for production + // Uncomment to enable for development + /* // Handle F5 key for CSS reload when using external stylesheets if (e->type() == QEvent::KeyPress && !m_externalCssPath.isEmpty()) { diff --git a/src/qt/res/css/dark.css b/src/qt/res/css/dark.css index 211d26c544e..05244c5ac9e 100644 --- a/src/qt/res/css/dark.css +++ b/src/qt/res/css/dark.css @@ -526,14 +526,15 @@ background-color:rgba(255, 255, 255, 0.15); border:0px solid #fff; } - QTableView::item { /* Table Item */ - background-color:#fcfcfc; + QTableView::item { /* Table Item - DARK MODE FIX */ + background-color: rgba(255, 255, 255, 0.05); + color: #ffffff; font-size:9pt; } QTableView::item:selected { /* Table Item Selected */ - background-color:#f0f0f0; - color:#333; + background-color:#0066CC; + color:#ffffff; } QScrollBar { /* Scroll Bar */ @@ -2870,7 +2871,8 @@ TransactionView QTableView { TransactionView QTableView::item { /* Don't override color here - let the model set red/green for amounts */ - background-color: transparent; + background-color: #003366; + padding: 4px; } TransactionView QTableView::item:selected { @@ -2879,7 +2881,7 @@ TransactionView QTableView::item:selected { } TransactionView QTableView::item:alternate { - background-color: rgba(255, 255, 255, 0.02); + background-color: #002952; } /* Transaction Table Headers */ @@ -2979,7 +2981,6 @@ QDialog#OptionsDialog .QTabWidget QTabBar::tab:selected { background-color: #0066CC; color: #ffffff !important; border: 1px solid #0066CC; -color: #333333 \!important; } /* Modal Overlay Progress */ diff --git a/src/qt/res/css/light.css b/src/qt/res/css/light.css index 586744bd069..809faf929b5 100644 --- a/src/qt/res/css/light.css +++ b/src/qt/res/css/light.css @@ -2786,21 +2786,21 @@ QListView::item:selected { color: #003366; } -/* Menu Improvements */ +/* Menu Improvements - LIGHT MODE FIX */ QMenu { color: #003366; - background-color: #002244; + background-color: #ffffff; border: 1px solid #0066cc; } QMenu::item:selected { - background-color: #0066cc; + background-color: #e6f2ff; color: #003366; } QMenu::separator { height: 1px; - background-color: #004488; + background-color: #d0d0d0; margin: 5px 0; } @@ -4297,24 +4297,23 @@ RPCConsole QWidget[objectName="tab_info"] QLabel { } -/* FORCE ALL TRANSACTION TEXT TO BE DARK BLUE IN LIGHT MODE */ -/* This overrides any hardcoded colors from C++ */ -QFrame#frame_2, -QFrame#frame_2 *, -QFrame#frame_2 QWidget, +/* FORCE TRANSACTION TEXT TO BE DARK BLUE IN LIGHT MODE - MAC FIX */ +/* This overrides any hardcoded colors from C++ EXCEPT amount columns */ QFrame#frame_2 QLabel, -QFrame#frame_2 QListView, -QFrame#frame_2 QListView *, QFrame#frame_2 QListView::item, -QFrame#frame_2 QListView::item *, QListView#listTransactions, -QListView#listTransactions *, QListView#listTransactions::item, -QListView#listTransactions::item QLabel, -TransactionOverviewWidget, -TransactionOverviewWidget *, TransactionOverviewWidget QLabel { - color: #003366 \!important; + color: #003366 !important; + font-weight: normal !important; +} + +/* BUT allow specific transaction list amounts to inherit their colors */ +QFrame#frame_2, +QFrame#frame_2 QWidget, +TransactionOverviewWidget { + color: #003366; + font-weight: normal; } /* Selected items should have white text */ @@ -4322,5 +4321,17 @@ QFrame#frame_2 QListView::item:selected, QFrame#frame_2 QListView::item:selected *, QListView#listTransactions::item:selected, QListView#listTransactions::item:selected * { - color: #ffffff \!important; + color: #ffffff !important; +} + +/* Ensure received amounts are green and sent amounts are red */ +TransactionView QTableView { + qproperty-receivedColor: #228B22 !important; + qproperty-sentColor: #DC143C !important; +} + +/* Force overview transaction amounts to also respect colors */ +TransactionOverviewWidget QListView { + qproperty-receivedColor: #228B22 !important; + qproperty-sentColor: #DC143C !important; } diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index 225192e61dd..bc6e3877483 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -128,8 +128,7 @@ 'wallet_backup.py --descriptors', 'feature_segwit.py --legacy-wallet', 'feature_segwit.py --descriptors', - # DigiByte: v2transport disabled - # 'feature_segwit.py --descriptors --v2transport', + 'feature_segwit.py --descriptors --v2transport', 'p2p_tx_download.py', 'wallet_avoidreuse.py --legacy-wallet', 'wallet_avoidreuse.py --descriptors', @@ -181,6 +180,7 @@ 'wallet_labels.py --descriptors', 'p2p_compactblocks.py', 'p2p_compactblocks_blocksonly.py', + 'p2p_block_sync.py --v2transport', 'wallet_hd.py --legacy-wallet', 'wallet_hd.py --descriptors', 'wallet_blank.py --legacy-wallet', @@ -239,16 +239,13 @@ 'wallet_transactiontime_rescan.py --legacy-wallet', 'p2p_addrv2_relay.py', 'p2p_compactblocks_hb.py', - # DigiByte: v2transport disabled - # 'p2p_compactblocks_hb.py --v2transport', + 'p2p_compactblocks_hb.py --v2transport', 'p2p_disconnect_ban.py', - # DigiByte: v2transport disabled - # 'p2p_disconnect_ban.py --v2transport', + 'p2p_disconnect_ban.py --v2transport', 'feature_posix_fs_permissions.py', 'rpc_decodescript.py', 'rpc_blockchain.py', - # DigiByte: v2transport disabled - # 'rpc_blockchain.py --v2transport', + 'rpc_blockchain.py --v2transport', 'rpc_deprecated.py', 'wallet_disable.py', 'wallet_change_address.py --legacy-wallet', @@ -271,11 +268,9 @@ 'mining_prioritisetransaction.py', 'p2p_invalid_locator.py', 'p2p_invalid_block.py', - # DigiByte: v2transport disabled - # 'p2p_invalid_block.py --v2transport', + 'p2p_invalid_block.py --v2transport', 'p2p_invalid_tx.py', - # DigiByte: v2transport disabled - # 'p2p_invalid_tx.py --v2transport', + 'p2p_invalid_tx.py --v2transport', 'p2p_v2_transport.py', 'example_test.py', 'wallet_txn_doublespend.py --legacy-wallet', @@ -298,15 +293,12 @@ 'wallet_importprunedfunds.py --legacy-wallet', 'wallet_importprunedfunds.py --descriptors', 'p2p_leak_tx.py', - # DigiByte: v2transport disabled - # 'p2p_leak_tx.py --v2transport', + 'p2p_leak_tx.py --v2transport', 'p2p_eviction.py', 'p2p_ibd_stalling.py', - # DigiByte: v2transport disabled - # 'p2p_ibd_stalling.py --v2transport', + 'p2p_ibd_stalling.py --v2transport', 'p2p_net_deadlock.py', - # DigiByte: v2transport disabled - # 'p2p_net_deadlock.py --v2transport', + 'p2p_net_deadlock.py --v2transport', 'wallet_signmessagewithaddress.py', 'rpc_signmessagewithprivkey.py', 'rpc_generate.py', From da0bbdee1f6b092c45e92679208f8feeffc499ce Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 13:26:22 -0600 Subject: [PATCH 02/13] Fix macOS build: Resolve endian function redefinition errors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The build was failing on macOS with redefinition errors for le32dec, le32enc, and be32enc functions. These functions are already defined in macOS system headers (sys/endian.h) since macOS SDK 10.12+. Error examples: - error: redefinition of 'le32dec' - error: redefinition of 'le32enc' - error: redefinition of 'be32enc' Solution: - Guard custom endian function definitions with #ifndef __APPLE__ - On macOS, include sys/endian.h to use system-provided functions - On other platforms, use our custom inline implementations This fix allows the project to build cleanly on macOS while maintaining compatibility with other platforms that don't provide these functions in their system headers. Ported from feature/digidollar-v1 branch where this was already fixed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/crypto/scrypt.cpp | 7 +++++++ src/crypto/scrypt.h | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/crypto/scrypt.cpp b/src/crypto/scrypt.cpp index 96d500d9631..0ee600e5d3b 100644 --- a/src/crypto/scrypt.cpp +++ b/src/crypto/scrypt.cpp @@ -44,6 +44,9 @@ #endif #endif +// On macOS, be32enc is already defined in sys/endian.h +// Only define it if not on macOS +#ifndef __APPLE__ static inline void be32enc(void *pp, uint32_t x) { uint8_t *p = (uint8_t *)pp; @@ -52,6 +55,10 @@ static inline void be32enc(void *pp, uint32_t x) p[1] = (x >> 16) & 0xff; p[0] = (x >> 24) & 0xff; } +#else +// On macOS, use the system provided function +#include +#endif /** * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen): diff --git a/src/crypto/scrypt.h b/src/crypto/scrypt.h index 5431fb67cee..99e6d51b233 100644 --- a/src/crypto/scrypt.h +++ b/src/crypto/scrypt.h @@ -27,6 +27,9 @@ void PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen); +// On macOS, these functions are already defined in sys/endian.h +// Only define them if they're not already available +#ifndef __APPLE__ static inline uint32_t le32dec(const void *pp) { const uint8_t *p = (uint8_t const *)pp; @@ -42,4 +45,8 @@ static inline void le32enc(void *pp, uint32_t x) p[2] = (x >> 16) & 0xff; p[3] = (x >> 24) & 0xff; } +#else +// On macOS, use the system provided functions +#include +#endif #endif From 68e7e4de920878e58fa56c6fd2c360dd839e7ace Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 13:33:52 -0600 Subject: [PATCH 03/13] Update digibyte_wallet.png --- src/qt/res/icons/digibyte_wallet.png | Bin 23835 -> 26391 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/qt/res/icons/digibyte_wallet.png b/src/qt/res/icons/digibyte_wallet.png index 362188e964223cf38551a2ed744a852b3f7d08ef..154d12a67152f579e50c385de083888311155aad 100644 GIT binary patch literal 26391 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 N002ovPDHLkV1j@bueksK From f02922be97555381a9b556f469ef5cd828096666 Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:22:07 -0600 Subject: [PATCH 04/13] Update dark.css --- src/qt/res/css/dark.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/res/css/dark.css b/src/qt/res/css/dark.css index 05244c5ac9e..13c08292773 100644 --- a/src/qt/res/css/dark.css +++ b/src/qt/res/css/dark.css @@ -528,7 +528,7 @@ background-color:rgba(255, 255, 255, 0.15); QTableView::item { /* Table Item - DARK MODE FIX */ background-color: rgba(255, 255, 255, 0.05); - color: #ffffff; + /* Don't override color here - let the model set red/green for amounts */ font-size:9pt; } @@ -2866,7 +2866,7 @@ TransactionView { TransactionView QTableView { background-color: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); - color: #ffffff; + /* Don't override color here - let the model set red/green for amounts */ } TransactionView QTableView::item { From 6493afe90966525bfc1efe66e202f299aead7a9d Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:49:06 -0600 Subject: [PATCH 05/13] Fix translations: Replace Bitcoin with official DigiByte translations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #333 Analysis of translation files revealed that Arabic, Persian, and Chinese translations still contained "Bitcoin" characters instead of "DigiByte". This issue existed in both v8.22.2 and v8.26, not introduced by the Bitcoin v26.2 merge. Research of official DigiByte websites (digibyte.org) confirmed the correct translations to use: Changes: - Arabic (ar): بتكوين → DigiByte (Latin) - 3 instances Official digibyte.org/ar/ keeps brand name in Latin characters - Persian (fa, fa_IR): بیت‌کوین → دیجی بایت - 13 instances Official digibyte.org/fa/ uses "دیجی بایت" (Diji Bayt) - Chinese (zh, zh_CN, zh-Hans, zh-Hant, zh_TW, cmn): 比特币/比特幣 → 极特币 - 100+ instances Official digibyte.org/zh/ uses "极特币" (jí tè bì) as brand name Total: 9 translation files updated with official DigiByte branding consistent with the official DigiByte website localizations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/qt/locale/digibyte_ar.ts | 46 ++++++++++----------- src/qt/locale/digibyte_cmn.ts | 44 ++++++++++----------- src/qt/locale/digibyte_fa.ts | 32 +++++++-------- src/qt/locale/digibyte_fa_IR.ts | 22 +++++------ src/qt/locale/digibyte_zh-Hans.ts | 8 ++-- src/qt/locale/digibyte_zh-Hant.ts | 48 +++++++++++----------- src/qt/locale/digibyte_zh.ts | 32 +++++++-------- src/qt/locale/digibyte_zh_CN.ts | 66 +++++++++++++++---------------- src/qt/locale/digibyte_zh_TW.ts | 42 ++++++++++---------- 9 files changed, 170 insertions(+), 170 deletions(-) diff --git a/src/qt/locale/digibyte_ar.ts b/src/qt/locale/digibyte_ar.ts index 358fb5d92d9..249a089ac17 100644 --- a/src/qt/locale/digibyte_ar.ts +++ b/src/qt/locale/digibyte_ar.ts @@ -72,7 +72,7 @@ These are your DigiByte addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. Signing is only possible with addresses of the type 'legacy'. - هذه هي عناوين بتكوين الخاصة بك لتلقي المدفوعات. استخدم الزر "إنشاء عنوان استلام جديد" في علامة تبويب الاستلام لإنشاء عناوين جديدة. + هذه هي عناوين DigiByte الخاصة بك لتلقي المدفوعات. استخدم الزر "إنشاء عنوان استلام جديد" في علامة تبويب الاستلام لإنشاء عناوين جديدة. التوقيع ممكن فقط مع عناوين من النوع "قديم". @@ -481,7 +481,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction - تحميل معاملة بتكوين الموقعة جزئيًا + تحميل معاملة DigiByte الموقعة جزئيًا Load PSBT from clipboard... @@ -489,7 +489,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction from clipboard - تحميل معاملة بتكوين الموقعة جزئيًا من الحافظة + تحميل معاملة DigiByte الموقعة جزئيًا من الحافظة Node window @@ -537,7 +537,7 @@ Signing is only possible with addresses of the type 'legacy'. Show the %1 help message to get a list with possible DigiByte command-line options - بين اشارة المساعدة %1 للحصول على قائمة من خيارات اوامر البت كوين المحتملة + بين اشارة المساعدة %1 للحصول على قائمة من خيارات اوامر DigiByte المحتملة &Mask values @@ -1011,7 +1011,7 @@ Signing is only possible with addresses of the type 'legacy'. DigiByte - بتكوين + DigiByte Discard blocks after verification, except most recent %1 GB (prune) @@ -1027,7 +1027,7 @@ Signing is only possible with addresses of the type 'legacy'. %1 will download and store a copy of the DigiByte block chain. - سيقوم %1 بتنزيل نسخة من سلسلة كتل بتكوين وتخزينها. + سيقوم %1 بتنزيل نسخة من سلسلة كتل DigiByte وتخزينها. The wallet will also be stored in this directory. @@ -1054,7 +1054,7 @@ Signing is only possible with addresses of the type 'legacy'. Attempting to spend digibytes that are affected by not-yet-displayed transactions will not be accepted by the network. - لن تقبل الشبكة محاولة إنفاق البتكوين المتأثرة بالمعاملات التي لم يتم عرضها بعد. + لن تقبل الشبكة محاولة إنفاق الDigiByte المتأثرة بالمعاملات التي لم يتم عرضها بعد. Number of blocks left @@ -1097,7 +1097,7 @@ Signing is only possible with addresses of the type 'legacy'. OpenURIDialog Open digibyte URI - افتح بتكوين URI + افتح DigiByte URI URI: @@ -1239,7 +1239,7 @@ Signing is only possible with addresses of the type 'legacy'. Connect to the DigiByte network through a SOCKS5 proxy. - الاتصال بشبكة البتكوين عبر وكيل SOCKS5. + الاتصال بشبكة الDigiByte عبر وكيل SOCKS5. &Connect through SOCKS5 proxy (default proxy): @@ -1315,7 +1315,7 @@ Signing is only possible with addresses of the type 'legacy'. Connect to the DigiByte network through a separate SOCKS5 proxy for Tor onion services. - اتصل بشبكة بتكوين من خلال وكيل SOCKS5 منفصل لخدمات Tor onion. + اتصل بشبكة DigiByte من خلال وكيل SOCKS5 منفصل لخدمات Tor onion. Use separate SOCKS&5 proxy to reach peers via Tor onion services: @@ -1390,7 +1390,7 @@ Signing is only possible with addresses of the type 'legacy'. The displayed information may be out of date. Your wallet automatically synchronizes with the DigiByte network after a connection is established, but this process has not completed yet. - قد تكون المعلومات المعروضة قديمة. تتزامن محفظتك تلقائيًا مع شبكة البتكوين بعد إنشاء الاتصال، ولكن هذه العملية لم تكتمل بعد. + قد تكون المعلومات المعروضة قديمة. تتزامن محفظتك تلقائيًا مع شبكة الDigiByte بعد إنشاء الاتصال، ولكن هذه العملية لم تكتمل بعد. Watch-only: @@ -1556,7 +1556,7 @@ Signing is only possible with addresses of the type 'legacy'. Cannot start digibyte: click-to-pay handler - لا يمكن تشغيل بتكوين: معالج النقر للدفع + لا يمكن تشغيل DigiByte: معالج النقر للدفع URI handling @@ -1568,7 +1568,7 @@ Signing is only possible with addresses of the type 'legacy'. URI cannot be parsed! This can be caused by an invalid DigiByte address or malformed URI parameters. - لا يمكن تحليل العنوان (URI)! يمكن أن يحدث هذا بسبب عنوان بتكوين غير صالح أو معلمات عنوان (URI) غير صحيحة. + لا يمكن تحليل العنوان (URI)! يمكن أن يحدث هذا بسبب عنوان DigiByte غير صالح أو معلمات عنوان (URI) غير صحيحة. Payment request file handling @@ -1610,7 +1610,7 @@ Signing is only possible with addresses of the type 'legacy'. Enter a DigiByte address (e.g. %1) - ادخل عنوان محفطة البتكوين (مثال %1) + ادخل عنوان محفطة الDigiByte (مثال %1) %1 d @@ -2003,7 +2003,7 @@ Signing is only possible with addresses of the type 'legacy'. An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the DigiByte network. - رسالة اختيارية لإرفاقها بطلب الدفع، والتي سيتم عرضها عند فتح الطلب. ملاحظة: لن يتم إرسال الرسالة مع الدفعة عبر شبكة البتكوين. + رسالة اختيارية لإرفاقها بطلب الدفع، والتي سيتم عرضها عند فتح الطلب. ملاحظة: لن يتم إرسال الرسالة مع الدفعة عبر شبكة الDigiByte. An optional label to associate with the new receiving address. @@ -2388,7 +2388,7 @@ Signing is only possible with addresses of the type 'legacy'. Warning: Invalid DigiByte address - تحذير: عنوان بتكوين غير صالح + تحذير: عنوان DigiByte غير صالح Warning: Unknown change address @@ -2423,7 +2423,7 @@ Signing is only possible with addresses of the type 'legacy'. The DigiByte address to send the payment to - عنوان البت كوين المرسل اليه الدفع + عنوان DigiByte المرسل اليه الدفع Alt+A @@ -2443,7 +2443,7 @@ Signing is only possible with addresses of the type 'legacy'. The fee will be deducted from the amount being sent. The recipient will receive less digibytes than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - سيتم خصم الرسوم من المبلغ الذي يتم إرساله. لذا سوف يتلقى المستلم مبلغ أقل من البتكوين المدخل في حقل المبلغ. في حالة تحديد عدة مستلمين، يتم تقسيم الرسوم بالتساوي. + سيتم خصم الرسوم من المبلغ الذي يتم إرساله. لذا سوف يتلقى المستلم مبلغ أقل من الDigiByte المدخل في حقل المبلغ. في حالة تحديد عدة مستلمين، يتم تقسيم الرسوم بالتساوي. S&ubtract fee from amount @@ -2471,7 +2471,7 @@ Signing is only possible with addresses of the type 'legacy'. A message that was attached to the digibyte: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the DigiByte network. - الرسالة التي تم إرفاقها مع البتكوين: العنوان الذي سيتم تخزينه مع المعاملة للرجوع إليه. ملاحظة: لن يتم إرسال هذه الرسالة عبر شبكة البتكوين. + الرسالة التي تم إرفاقها مع الDigiByte: العنوان الذي سيتم تخزينه مع المعاملة للرجوع إليه. ملاحظة: لن يتم إرسال هذه الرسالة عبر شبكة الDigiByte. Pay To: @@ -2505,7 +2505,7 @@ Signing is only possible with addresses of the type 'legacy'. The DigiByte address to sign the message with - عنوان البتكوين لتوقيع الرسالة به + عنوان الDigiByte لتوقيع الرسالة به Choose previously used address @@ -2537,7 +2537,7 @@ Signing is only possible with addresses of the type 'legacy'. Sign the message to prove you own this DigiByte address - وقع الرسالة لتثبت انك تمتلك عنوان البت كوين هذا + وقع الرسالة لتثبت انك تمتلك عنوان DigiByte هذا Sign &Message @@ -2557,11 +2557,11 @@ Signing is only possible with addresses of the type 'legacy'. The DigiByte address the message was signed with - عنوان البتكوين الذي تم توقيع الرسالة به + عنوان الDigiByte الذي تم توقيع الرسالة به Verify the message to ensure it was signed with the specified DigiByte address - تحقق من الرسالة للتأكد من توقيعها مع عنوان البتكوين المحدد + تحقق من الرسالة للتأكد من توقيعها مع عنوان الDigiByte المحدد Verify &Message diff --git a/src/qt/locale/digibyte_cmn.ts b/src/qt/locale/digibyte_cmn.ts index 659b1972d4f..12bfcffe58c 100644 --- a/src/qt/locale/digibyte_cmn.ts +++ b/src/qt/locale/digibyte_cmn.ts @@ -47,7 +47,7 @@ Choose the address to receive coins with - 选择接收比特币地址 + 选择接收极特币地址 C&hoose @@ -55,12 +55,12 @@ These are your DigiByte addresses for sending payments. Always check the amount and the receiving address before sending coins. - 这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。 + 这些是你的极特币支付地址。在发送之前,一定要核对金额和接收地址。 These are your DigiByte addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. Signing is only possible with addresses of the type 'legacy'. - 這些是您的比特幣接收地址。使用“接收”標籤中的“產生新的接收地址”按鈕產生新的地址。只能使用“傳統”類型的地址進行簽名。 + 這些是您的极特币接收地址。使用“接收”標籤中的“產生新的接收地址”按鈕產生新的地址。只能使用“傳統”類型的地址進行簽名。 &Copy Address @@ -156,7 +156,7 @@ Signing is only possible with addresses of the type 'legacy'. Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR DIGIBYTES</b>! - 警告: 如果把钱包加密后又忘记密码,你就会从此<b>失去其中所有的比特币了</b>! + 警告: 如果把钱包加密后又忘记密码,你就会从此<b>失去其中所有的极特币了</b>! Are you sure you wish to encrypt your wallet? @@ -458,7 +458,7 @@ Signing is only possible with addresses of the type 'legacy'. Send coins to a DigiByte address - 向一个比特币地址发币 + 向一个极特币地址发币 Backup wallet to another location @@ -506,7 +506,7 @@ Signing is only possible with addresses of the type 'legacy'. Verify messages to ensure they were signed with specified DigiByte addresses - 校验消息,确保该消息是由指定的比特币地址所有者签名的 + 校验消息,确保该消息是由指定的极特币地址所有者签名的 &Load PSBT from file… @@ -620,7 +620,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction - 加载部分签名比特币交易(PSBT) + 加载部分签名极特币交易(PSBT) Load PSBT from &clipboard… @@ -628,7 +628,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction from clipboard - 从剪贴板中加载部分签名比特币交易(PSBT) + 从剪贴板中加载部分签名极特币交易(PSBT) Node window @@ -752,7 +752,7 @@ Signing is only possible with addresses of the type 'legacy'. %n active connection(s) to DigiByte network. A substring of the tooltip. - %n 与比特币网络接。 + %n 与极特币网络接。 @@ -1291,7 +1291,7 @@ The migration process will create a backup of the wallet before migrating. This %1 will download and store a copy of the DigiByte block chain. - %1 将会下载并存储比特币区块链。 + %1 将会下载并存储极特币区块链。 The wallet will also be stored in this directory. @@ -1376,7 +1376,7 @@ The migration process will create a backup of the wallet before migrating. This Attempting to spend digibytes that are affected by not-yet-displayed transactions will not be accepted by the network. - 嘗試花費受尚未顯示的交易影響的比特幣將不會被網路接受。 + 嘗試花費受尚未顯示的交易影響的极特币將不會被網路接受。 Unknown… @@ -1415,7 +1415,7 @@ The migration process will create a backup of the wallet before migrating. This OpenURIDialog Open digibyte URI - 打开比特币URI + 打开极特币URI @@ -1530,7 +1530,7 @@ The migration process will create a backup of the wallet before migrating. This Automatically open the DigiByte client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random. - 自動開啟路由器上的比特幣用戶端連接埠。 只有當您的路由器支援 NAT-PMP 並且已啟用時,此功能才有效。 外部連接埠可以是隨機的。 + 自動開啟路由器上的极特币用戶端連接埠。 只有當您的路由器支援 NAT-PMP 並且已啟用時,此功能才有效。 外部連接埠可以是隨機的。 Map port using NA&T-PMP @@ -1598,7 +1598,7 @@ The migration process will create a backup of the wallet before migrating. This Choose the default subdivision unit to show in the interface and when sending coins. - 选择显示及发送比特币时使用的最小单位。 + 选择显示及发送极特币时使用的最小单位。 Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |. @@ -1610,7 +1610,7 @@ The migration process will create a backup of the wallet before migrating. This Connect to the DigiByte network through a separate SOCKS5 proxy for Tor onion services. - 连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。 + 连接极特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。 Monospaced font in the Overview tab: @@ -1844,7 +1844,7 @@ If you are receiving this error you should request the merchant provide a BIP21 URI cannot be parsed! This can be caused by an invalid DigiByte address or malformed URI parameters. - 无法解析 URI 地址!可能是因为比特币地址无效,或是 URI 参数格式错误。 + 无法解析 URI 地址!可能是因为极特币地址无效,或是 URI 参数格式错误。 Payment request file handling @@ -2293,7 +2293,7 @@ For more information on using this console, type %6. An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the DigiByte network. - 可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。 + 可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过极特币网络传送。 Use this form to request payments. All fields are <b>optional</b>. @@ -2562,7 +2562,7 @@ For more information on using this console, type %6. Creates a Partially Signed DigiByte Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - 创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。 + 创建一个“部分签名极特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。 from wallet '%1' @@ -2602,7 +2602,7 @@ For more information on using this console, type %6. Please, review your transaction. You can create and send this transaction or create a Partially Signed DigiByte Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet. Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled. - 请务必仔细检查您的交易。你可以创建并发送这笔交易;也可以创建一个“部分签名比特币交易(PSBT)”,它可以被保存下来或被复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。 + 请务必仔细检查您的交易。你可以创建并发送这笔交易;也可以创建一个“部分签名极特币交易(PSBT)”,它可以被保存下来或被复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。 Please, review your transaction. @@ -2670,7 +2670,7 @@ For more information on using this console, type %6. The DigiByte address to send the payment to - 將支付發送到的比特幣地址給 + 將支付發送到的极特币地址給 The amount to send in the selected unit @@ -2720,7 +2720,7 @@ For more information on using this console, type %6. You can sign messages/agreements with your addresses to prove you can receive digibytes sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - 您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。 + 您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的极特币。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。 Signature @@ -2760,7 +2760,7 @@ For more information on using this console, type %6. Verify the message to ensure it was signed with the specified DigiByte address - 驗證這個訊息來確定是用指定的比特幣地址簽名的 + 驗證這個訊息來確定是用指定的极特币地址簽名的 Click "Sign Message" to generate signature diff --git a/src/qt/locale/digibyte_fa.ts b/src/qt/locale/digibyte_fa.ts index 3ee29ebfce2..b92c6d2059e 100644 --- a/src/qt/locale/digibyte_fa.ts +++ b/src/qt/locale/digibyte_fa.ts @@ -163,7 +163,7 @@ Send coins to a DigiByte address - ارسال وجه به نشانی بیت‌کوین + ارسال وجه به نشانی دیجی بایت Backup wallet to another location @@ -187,7 +187,7 @@ DigiByte - بیت‌کوین + دیجی بایت Wallet @@ -215,11 +215,11 @@ Sign messages with your DigiByte addresses to prove you own them - برای اثبات اینکه پیام‌ها به شما تعلق دارند، آن‌ها را با نشانی بیت‌کوین خود امضا کنید + برای اثبات اینکه پیام‌ها به شما تعلق دارند، آن‌ها را با نشانی دیجی بایت خود امضا کنید Verify messages to ensure they were signed with specified DigiByte addresses - برای حصول اطمینان از اینکه پیام با نشانی بیت‌کوین مشخص شده امضا است یا خیر، پیام را شناسایی کنید + برای حصول اطمینان از اینکه پیام با نشانی دیجی بایت مشخص شده امضا است یا خیر، پیام را شناسایی کنید &File @@ -239,7 +239,7 @@ Request payments (generates QR codes and digibyte: URIs) - درخواست پرداخت ( تولید کد کیوار و ادرس بیت کوین) + درخواست پرداخت ( تولید کد کیوار و ادرس دیجی بایت) Show the list of used sending addresses and labels @@ -251,7 +251,7 @@ Open a digibyte: URI or payment request - بازکردن یک بیت کوین: آدرس یا درخواست پرداخت + بازکردن یک دیجی بایت: آدرس یا درخواست پرداخت &Command-line options @@ -259,7 +259,7 @@ %n active connection(s) to DigiByte network - %n ارتباط فعال با شبکهٔ بیت‌کوین%n ارتباط فعال با شبکهٔ بیت‌کوین + %n ارتباط فعال با شبکهٔ دیجی بایت%n ارتباط فعال با شبکهٔ دیجی بایت Processing blocks on disk... @@ -509,7 +509,7 @@ The entered address "%1" is not a valid DigiByte address. - نشانی وارد شده "%1" یک نشانی معتبر بیت‌کوین نیست. + نشانی وارد شده "%1" یک نشانی معتبر دیجی بایت نیست. Could not unlock wallet. @@ -582,7 +582,7 @@ DigiByte - بیت‌کوین + دیجی بایت Error @@ -687,7 +687,7 @@ Automatically open the DigiByte client port on the router. This only works when your router supports UPnP and it is enabled. - باز کردن خودکار درگاه شبکهٔ بیت‌کوین روی روترها. تنها زمانی کار می‌کند که روتر از پروتکل UPnP پشتیبانی کند و این پروتکل فعال باشد. + باز کردن خودکار درگاه شبکهٔ دیجی بایت روی روترها. تنها زمانی کار می‌کند که روتر از پروتکل UPnP پشتیبانی کند و این پروتکل فعال باشد. Map port using &UPnP @@ -790,7 +790,7 @@ The displayed information may be out of date. Your wallet automatically synchronizes with the DigiByte network after a connection is established, but this process has not completed yet. - اطلاعات نمایش‌داده شده ممکن است قدیمی باشند. بعد از این که یک اتصال با شبکه برقرار شد، کیف پول شما به‌صورت خودکار با شبکهٔ بیت‌کوین همگام‌سازی می‌شود. اما این روند هنوز کامل نشده است. + اطلاعات نمایش‌داده شده ممکن است قدیمی باشند. بعد از این که یک اتصال با شبکه برقرار شد، کیف پول شما به‌صورت خودکار با شبکهٔ دیجی بایت همگام‌سازی می‌شود. اما این روند هنوز کامل نشده است. Available: @@ -863,7 +863,7 @@ Enter a DigiByte address (e.g. %1) - یک آدرس بیت‌کوین وارد کنید (مثلاً %1) + یک آدرس دیجی بایت وارد کنید (مثلاً %1) %1 d @@ -1343,7 +1343,7 @@ The DigiByte address to send the payment to - نشانی بیت‌کوین برای ارسال پرداخت به آن + نشانی دیجی بایت برای ارسال پرداخت به آن Alt+A @@ -1396,7 +1396,7 @@ The DigiByte address to sign the message with - نشانی بیت‌کوین برای امضاء پیغام با آن + نشانی دیجی بایت برای امضاء پیغام با آن Choose previously used address @@ -1448,11 +1448,11 @@ The DigiByte address the message was signed with - نشانی بیت‌کوین که پیغام با آن امضاء شده + نشانی دیجی بایت که پیغام با آن امضاء شده Verify the message to ensure it was signed with the specified DigiByte address - برای حصول اطمینان از اینکه پیام با نشانی بیت‌کوین مشخص شده امضا است یا خیر، پیام را شناسایی کنید + برای حصول اطمینان از اینکه پیام با نشانی دیجی بایت مشخص شده امضا است یا خیر، پیام را شناسایی کنید Verify &Message diff --git a/src/qt/locale/digibyte_fa_IR.ts b/src/qt/locale/digibyte_fa_IR.ts index acb07753825..ee1d7e73e8c 100644 --- a/src/qt/locale/digibyte_fa_IR.ts +++ b/src/qt/locale/digibyte_fa_IR.ts @@ -71,7 +71,7 @@ These are your DigiByte addresses for receiving payments. It is recommended to use a new receiving address for each transaction. - اینها آدرس‌های بیتکوین شما برای دریافت وجوه هستند. توصیه می‌شود برای هر دریافت از یک آدرس جدید استفاده کنید. + اینها آدرس‌های دیجی بایت شما برای دریافت وجوه هستند. توصیه می‌شود برای هر دریافت از یک آدرس جدید استفاده کنید. &Copy Address @@ -177,7 +177,7 @@ Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR DIGIBYTES</b>! - اخطار: اگر کیف‌پول خود را رمزگذاری کرده و رمز خود را فراموش کنید، شما <b>تمام بیت‌کوین‌های خود را از دست خواهید داد</b>! + اخطار: اگر کیف‌پول خود را رمزگذاری کرده و رمز خود را فراموش کنید، شما <b>تمام دیجی بایت‌های خود را از دست خواهید داد</b>! Are you sure you wish to encrypt your wallet? @@ -347,7 +347,7 @@ Send coins to a DigiByte address - ارسال کوین به آدرس بیت کوین + ارسال کوین به آدرس دیجی بایت Backup wallet to another location @@ -367,7 +367,7 @@ DigiByte - بیت کوین + دیجی بایت Wallet @@ -395,11 +395,11 @@ Sign messages with your DigiByte addresses to prove you own them - پیام‌ها را با آدرس بیت‌کوین خود امضا کنید تا مالکیت آن‌ها را اثبات کنید + پیام‌ها را با آدرس دیجی بایت خود امضا کنید تا مالکیت آن‌ها را اثبات کنید Verify messages to ensure they were signed with specified DigiByte addresses - پیام‌ها را تائید کنید تا از امضاشدن آن‌ها با آدرس بیت‌کوین مطمئن شوید + پیام‌ها را تائید کنید تا از امضاشدن آن‌ها با آدرس دیجی بایت مطمئن شوید &File @@ -419,7 +419,7 @@ Request payments (generates QR codes and digibyte: URIs) - درخواست پرداخت (ساخت کد QR و بیت‌کوین: URIs) + درخواست پرداخت (ساخت کد QR و دیجی بایت: URIs) Show the list of used sending addresses and labels @@ -431,11 +431,11 @@ Open a digibyte: URI or payment request - بازکردن بیت‌کوین: آدرس یا درخواست پرداخت + بازکردن دیجی بایت: آدرس یا درخواست پرداخت %n active connection(s) to DigiByte network - %n ارتباط فعال به شبکه بیت‌کوین%n ارتباط فعال به شبکه بیت‌کوین + %n ارتباط فعال به شبکه دیجی بایت%n ارتباط فعال به شبکه دیجی بایت Indexing blocks on disk... @@ -629,7 +629,7 @@ The entered address "%1" is not a valid DigiByte address. - آدرس وارد شده "%1" آدرس معتبر بیت کوین نیست. + آدرس وارد شده "%1" آدرس معتبر دیجی بایت نیست. @@ -658,7 +658,7 @@ DigiByte - بیت کوین + دیجی بایت The wallet will also be stored in this directory. diff --git a/src/qt/locale/digibyte_zh-Hans.ts b/src/qt/locale/digibyte_zh-Hans.ts index 5d676b5776c..53dff3215b1 100644 --- a/src/qt/locale/digibyte_zh-Hans.ts +++ b/src/qt/locale/digibyte_zh-Hans.ts @@ -47,11 +47,11 @@ Choose the address to send coins to - 选择发送比特币地址 + 选择发送极特币地址 Choose the address to receive coins with - 选择接收比特币地址 + 选择接收极特币地址 C&hoose @@ -67,12 +67,12 @@ These are your DigiByte addresses for sending payments. Always check the amount and the receiving address before sending coins. - 这是你的比特币发币地址。发送前请确认发送数量和接收地址 + 这是你的极特币发币地址。发送前请确认发送数量和接收地址 These are your DigiByte addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. Signing is only possible with addresses of the type 'legacy'. - 这是你的比特币接收地址。点击接收选项卡中“创建新的接收地址”按钮来创建新的地址。 + 这是你的极特币接收地址。点击接收选项卡中“创建新的接收地址”按钮来创建新的地址。 签名只能使用“传统”类型的地址。 diff --git a/src/qt/locale/digibyte_zh-Hant.ts b/src/qt/locale/digibyte_zh-Hant.ts index c2fe759e4ca..497b7ace009 100644 --- a/src/qt/locale/digibyte_zh-Hant.ts +++ b/src/qt/locale/digibyte_zh-Hant.ts @@ -51,7 +51,7 @@ Choose the address to receive coins with - 选择接收比特币地址 + 选择接收极特币地址 C&hoose @@ -59,12 +59,12 @@ These are your DigiByte addresses for sending payments. Always check the amount and the receiving address before sending coins. - 这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。 + 这些是你的极特币支付地址。在发送之前,一定要核对金额和接收地址。 These are your DigiByte addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. Signing is only possible with addresses of the type 'legacy'. - 這些是您的比特幣接收地址。使用“接收”標籤中的“產生新的接收地址”按鈕產生新的地址。只能使用“傳統”類型的地址進行簽名。 + 這些是您的极特币接收地址。使用“接收”標籤中的“產生新的接收地址”按鈕產生新的地址。只能使用“傳統”類型的地址進行簽名。 &Copy Address @@ -160,7 +160,7 @@ Signing is only possible with addresses of the type 'legacy'. Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR DIGIBYTES</b>! - 警告: 如果把钱包加密后又忘记密码,你就会从此<b>失去其中所有的比特币了</b>! + 警告: 如果把钱包加密后又忘记密码,你就会从此<b>失去其中所有的极特币了</b>! Are you sure you wish to encrypt your wallet? @@ -462,7 +462,7 @@ Signing is only possible with addresses of the type 'legacy'. Send coins to a DigiByte address - 向一个比特币地址发币 + 向一个极特币地址发币 Backup wallet to another location @@ -506,7 +506,7 @@ Signing is only possible with addresses of the type 'legacy'. Sign messages with your DigiByte addresses to prove you own them - 用比特币地址关联的私钥为消息签名,以证明您拥有这个比特币地址 + 用极特币地址关联的私钥为消息签名,以证明您拥有这个极特币地址 &Verify message… @@ -514,7 +514,7 @@ Signing is only possible with addresses of the type 'legacy'. Verify messages to ensure they were signed with specified DigiByte addresses - 校验消息,确保该消息是由指定的比特币地址所有者签名的 + 校验消息,确保该消息是由指定的极特币地址所有者签名的 &Load PSBT from file… @@ -628,7 +628,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction - 加载部分签名比特币交易(PSBT) + 加载部分签名极特币交易(PSBT) Load PSBT from &clipboard… @@ -636,7 +636,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction from clipboard - 从剪贴板中加载部分签名比特币交易(PSBT) + 从剪贴板中加载部分签名极特币交易(PSBT) Node window @@ -760,7 +760,7 @@ Signing is only possible with addresses of the type 'legacy'. %n active connection(s) to DigiByte network. A substring of the tooltip. - %n 与比特币网络接。 + %n 与极特币网络接。 @@ -1299,7 +1299,7 @@ The migration process will create a backup of the wallet before migrating. This %1 will download and store a copy of the DigiByte block chain. - %1 将会下载并存储比特币区块链。 + %1 将会下载并存储极特币区块链。 The wallet will also be stored in this directory. @@ -1388,7 +1388,7 @@ The migration process will create a backup of the wallet before migrating. This Attempting to spend digibytes that are affected by not-yet-displayed transactions will not be accepted by the network. - 嘗試花費受尚未顯示的交易影響的比特幣將不會被網路接受。 + 嘗試花費受尚未顯示的交易影響的极特币將不會被網路接受。 Unknown… @@ -1427,7 +1427,7 @@ The migration process will create a backup of the wallet before migrating. This OpenURIDialog Open digibyte URI - 打开比特币URI + 打开极特币URI @@ -1542,7 +1542,7 @@ The migration process will create a backup of the wallet before migrating. This Automatically open the DigiByte client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random. - 自動開啟路由器上的比特幣用戶端連接埠。 只有當您的路由器支援 NAT-PMP 並且已啟用時,此功能才有效。 外部連接埠可以是隨機的。 + 自動開啟路由器上的极特币用戶端連接埠。 只有當您的路由器支援 NAT-PMP 並且已啟用時,此功能才有效。 外部連接埠可以是隨機的。 Map port using NA&T-PMP @@ -1610,7 +1610,7 @@ The migration process will create a backup of the wallet before migrating. This Choose the default subdivision unit to show in the interface and when sending coins. - 选择显示及发送比特币时使用的最小单位。 + 选择显示及发送极特币时使用的最小单位。 Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |. @@ -1622,7 +1622,7 @@ The migration process will create a backup of the wallet before migrating. This Connect to the DigiByte network through a separate SOCKS5 proxy for Tor onion services. - 连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。 + 连接极特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。 Monospaced font in the Overview tab: @@ -1856,7 +1856,7 @@ If you are receiving this error you should request the merchant provide a BIP21 URI cannot be parsed! This can be caused by an invalid DigiByte address or malformed URI parameters. - 无法解析 URI 地址!可能是因为比特币地址无效,或是 URI 参数格式错误。 + 无法解析 URI 地址!可能是因为极特币地址无效,或是 URI 参数格式错误。 Payment request file handling @@ -2305,7 +2305,7 @@ For more information on using this console, type %6. An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the DigiByte network. - 可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。 + 可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过极特币网络传送。 Use this form to request payments. All fields are <b>optional</b>. @@ -2574,7 +2574,7 @@ For more information on using this console, type %6. Creates a Partially Signed DigiByte Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - 创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。 + 创建一个“部分签名极特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。 from wallet '%1' @@ -2614,7 +2614,7 @@ For more information on using this console, type %6. Please, review your transaction. You can create and send this transaction or create a Partially Signed DigiByte Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet. Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled. - 请务必仔细检查您的交易。你可以创建并发送这笔交易;也可以创建一个“部分签名比特币交易(PSBT)”,它可以被保存下来或被复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。 + 请务必仔细检查您的交易。你可以创建并发送这笔交易;也可以创建一个“部分签名极特币交易(PSBT)”,它可以被保存下来或被复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。 Please, review your transaction. @@ -2667,7 +2667,7 @@ For more information on using this console, type %6. Warning: Invalid DigiByte address - 警告: 比特币地址无效 + 警告: 极特币地址无效 Confirm custom change address @@ -2690,7 +2690,7 @@ For more information on using this console, type %6. The DigiByte address to send the payment to - 將支付發送到的比特幣地址給 + 將支付發送到的极特币地址給 The amount to send in the selected unit @@ -2740,7 +2740,7 @@ For more information on using this console, type %6. You can sign messages/agreements with your addresses to prove you can receive digibytes sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - 您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。 + 您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的极特币。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。 Signature @@ -2780,7 +2780,7 @@ For more information on using this console, type %6. Verify the message to ensure it was signed with the specified DigiByte address - 驗證這個訊息來確定是用指定的比特幣地址簽名的 + 驗證這個訊息來確定是用指定的极特币地址簽名的 Click "Sign Message" to generate signature diff --git a/src/qt/locale/digibyte_zh.ts b/src/qt/locale/digibyte_zh.ts index 1deac4fb3af..e9795dd74e4 100644 --- a/src/qt/locale/digibyte_zh.ts +++ b/src/qt/locale/digibyte_zh.ts @@ -67,7 +67,7 @@ These are your DigiByte addresses for sending payments. Always check the amount and the receiving address before sending coins. - 这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。 + 这些是你的极特币支付地址。在发送之前,一定要核对金额和接收地址。 &Copy Address @@ -165,7 +165,7 @@ Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR DIGIBYTES</b>! - 注意:如果你加密了钱包,丢失了密码,您将<b>丢失所有的比特币。 + 注意:如果你加密了钱包,丢失了密码,您将<b>丢失所有的极特币。 Are you sure you wish to encrypt your wallet? @@ -185,7 +185,7 @@ Remember that encrypting your wallet cannot fully protect your digibytes from being stolen by malware infecting your computer. - 记住,加密您的钱包并不能完全保护您的比特币不被您电脑中的恶意软件窃取。 + 记住,加密您的钱包并不能完全保护您的极特币不被您电脑中的恶意软件窃取。 Wallet to be encrypted @@ -355,7 +355,7 @@ Send coins to a DigiByte address - 发送比特币到一个比特币地址 + 发送极特币到一个极特币地址 Backup wallet to another location @@ -391,11 +391,11 @@ Sign messages with your DigiByte addresses to prove you own them - 用您的比特币地址签名信息,以证明拥有它们 + 用您的极特币地址签名信息,以证明拥有它们 Verify messages to ensure they were signed with specified DigiByte addresses - 验证消息,确保它们是用指定的比特币地址签名的 + 验证消息,确保它们是用指定的极特币地址签名的 &File @@ -415,7 +415,7 @@ Request payments (generates QR codes and digibyte: URIs) - 请求支付(生成二维码和比特币链接) + 请求支付(生成二维码和极特币链接) Show the list of used sending addresses and labels @@ -431,7 +431,7 @@ %n active connection(s) to DigiByte network - %n 活跃的链接到比特币网络 + %n 活跃的链接到极特币网络 Indexing blocks on disk... @@ -491,7 +491,7 @@ Open a digibyte: URI - 打开比特币: URI + 打开极特币: URI Open Wallet @@ -827,7 +827,7 @@ The entered address "%1" is not a valid DigiByte address. - 输入的地址"%1"不是有效的比特币地址。 + 输入的地址"%1"不是有效的极特币地址。 Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address. @@ -904,7 +904,7 @@ DigiByte - 比特币 + 极特币 Error @@ -1200,7 +1200,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for digibyte transactions than the network can process. - 当交易量小于块的空间时,矿工和中继节点可以强制执行最低费用。只付最低费用就可以了,但注意,一旦比特币交易的需求超出网络的处理能力,就可能导致交易无法确认。 + 当交易量小于块的空间时,矿工和中继节点可以强制执行最低费用。只付最低费用就可以了,但注意,一旦极特币交易的需求超出网络的处理能力,就可能导致交易无法确认。 A too low fee might result in a never confirming transaction (read the tooltip) @@ -1288,7 +1288,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Warning: Invalid DigiByte address - 警告:比特币地址无效 + 警告:极特币地址无效 The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure? @@ -1311,11 +1311,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p The DigiByte address to send the payment to - 支付到的比特币地址 + 支付到的极特币地址 The fee will be deducted from the amount being sent. The recipient will receive less digibytes than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - 手续费将从发出的总额中扣除。接受者收到的比特币将少于你输入的金额字段。如果选择了多个接受者,手续费将平均分配。 + 手续费将从发出的总额中扣除。接受者收到的极特币将少于你输入的金额字段。如果选择了多个接受者,手续费将平均分配。 This is an unauthenticated payment request. @@ -1327,7 +1327,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p A message that was attached to the digibyte: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the DigiByte network. - 附在比特币上的消息:URI将与交易一起存储,供参考。注意:此信息不会通过比特币网络发送。 + 附在极特币上的消息:URI将与交易一起存储,供参考。注意:此信息不会通过极特币网络发送。 diff --git a/src/qt/locale/digibyte_zh_CN.ts b/src/qt/locale/digibyte_zh_CN.ts index 93c079fea40..18320d6bd76 100644 --- a/src/qt/locale/digibyte_zh_CN.ts +++ b/src/qt/locale/digibyte_zh_CN.ts @@ -67,12 +67,12 @@ These are your DigiByte addresses for sending payments. Always check the amount and the receiving address before sending coins. - 您可以给这些比特币地址付款。在付款之前,务必要检查金额和收款地址是否正确。 + 您可以给这些极特币地址付款。在付款之前,务必要检查金额和收款地址是否正确。 These are your DigiByte addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. Signing is only possible with addresses of the type 'legacy'. - 这是您用来收款的比特币地址。使用“接收”标签页中的“创建新收款地址”按钮来创建新的收款地址。 + 这是您用来收款的极特币地址。使用“接收”标签页中的“创建新收款地址”按钮来创建新的收款地址。 只有“传统(legacy)”类型的地址支持签名。 @@ -171,7 +171,7 @@ Signing is only possible with addresses of the type 'legacy'. Warning: If you encrypt your wallet and lose your passphrase, you will <b>LOSE ALL OF YOUR DIGIBYTES</b>! - 警告: 如果把钱包加密后又忘记密码,你就会从此<b>失去其中所有的比特币了</b>! + 警告: 如果把钱包加密后又忘记密码,你就会从此<b>失去其中所有的极特币了</b>! Are you sure you wish to encrypt your wallet? @@ -191,7 +191,7 @@ Signing is only possible with addresses of the type 'legacy'. Remember that encrypting your wallet cannot fully protect your digibytes from being stolen by malware infecting your computer. - 请注意,当您的计算机感染恶意软件时,加密钱包并不能完全规避您的比特币被偷窃的可能。 + 请注意,当您的计算机感染恶意软件时,加密钱包并不能完全规避您的极特币被偷窃的可能。 Wallet to be encrypted @@ -365,7 +365,7 @@ Signing is only possible with addresses of the type 'legacy'. Send coins to a DigiByte address - 向一个比特币地址发币 + 向一个极特币地址发币 Backup wallet to another location @@ -401,11 +401,11 @@ Signing is only possible with addresses of the type 'legacy'. Sign messages with your DigiByte addresses to prove you own them - 用比特币地址关联的私钥为消息签名,以证明您拥有这个比特币地址 + 用极特币地址关联的私钥为消息签名,以证明您拥有这个极特币地址 Verify messages to ensure they were signed with specified DigiByte addresses - 校验消息,确保该消息是由指定的比特币地址所有者签名的 + 校验消息,确保该消息是由指定的极特币地址所有者签名的 &File @@ -441,7 +441,7 @@ Signing is only possible with addresses of the type 'legacy'. %n active connection(s) to DigiByte network - %n 条到比特币网络的活动连接 + %n 条到极特币网络的活动连接 Indexing blocks on disk... @@ -489,7 +489,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction - 加载部分签名比特币交易(PSBT) + 加载部分签名极特币交易(PSBT) Load PSBT from clipboard... @@ -497,7 +497,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction from clipboard - 从剪贴板中加载部分签名比特币交易(PSBT) + 从剪贴板中加载部分签名极特币交易(PSBT) Node window @@ -921,7 +921,7 @@ Signing is only possible with addresses of the type 'legacy'. The entered address "%1" is not a valid DigiByte address. - 输入的地址 %1 并不是有效的比特币地址。 + 输入的地址 %1 并不是有效的极特币地址。 Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address. @@ -1018,7 +1018,7 @@ Signing is only possible with addresses of the type 'legacy'. DigiByte - 比特币 + 极特币 Discard blocks after verification, except most recent %1 GB (prune) @@ -1034,7 +1034,7 @@ Signing is only possible with addresses of the type 'legacy'. %1 will download and store a copy of the DigiByte block chain. - %1 将会下载并存储比特币区块链。 + %1 将会下载并存储极特币区块链。 The wallet will also be stored in this directory. @@ -1069,7 +1069,7 @@ Signing is only possible with addresses of the type 'legacy'. Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the digibyte network, as detailed below. - 近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与比特币网络完全同步后更正。详情如下 + 近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与极特币网络完全同步后更正。详情如下 Attempting to spend digibytes that are affected by not-yet-displayed transactions will not be accepted by the network. @@ -1124,7 +1124,7 @@ Signing is only possible with addresses of the type 'legacy'. OpenURIDialog Open digibyte URI - 打开比特币URI + 打开极特币URI URI: @@ -1266,7 +1266,7 @@ Signing is only possible with addresses of the type 'legacy'. Automatically open the DigiByte client port on the router. This only works when your router supports UPnP and it is enabled. - 自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。 + 自动在路由器中为极特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。 Map port using &UPnP @@ -1282,7 +1282,7 @@ Signing is only possible with addresses of the type 'legacy'. Connect to the DigiByte network through a SOCKS5 proxy. - 通过 SOCKS5 代理连接比特币网络。 + 通过 SOCKS5 代理连接极特币网络。 &Connect through SOCKS5 proxy (default proxy): @@ -1346,11 +1346,11 @@ Signing is only possible with addresses of the type 'legacy'. &Unit to show amounts in: - 比特币金额单位(&U): + 极特币金额单位(&U): Choose the default subdivision unit to show in the interface and when sending coins. - 选择显示及发送比特币时使用的最小单位。 + 选择显示及发送极特币时使用的最小单位。 Whether to show coin control features or not. @@ -1358,7 +1358,7 @@ Signing is only possible with addresses of the type 'legacy'. Connect to the DigiByte network through a separate SOCKS5 proxy for Tor onion services. - 连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。 + 连接极特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。 Use separate SOCKS&5 proxy to reach peers via Tor onion services: @@ -1433,7 +1433,7 @@ Signing is only possible with addresses of the type 'legacy'. The displayed information may be out of date. Your wallet automatically synchronizes with the DigiByte network after a connection is established, but this process has not completed yet. - 现在显示的消息可能是过期的。在连接上比特币网络节点后,您的钱包将自动与网络同步,但是这个过程还没有完成。 + 现在显示的消息可能是过期的。在连接上极特币网络节点后,您的钱包将自动与网络同步,但是这个过程还没有完成。 Watch-only: @@ -1663,7 +1663,7 @@ Signing is only possible with addresses of the type 'legacy'. URI cannot be parsed! This can be caused by an invalid DigiByte address or malformed URI parameters. - 无法解析 URI 地址!可能是因为比特币地址无效,或是 URI 参数格式错误。 + 无法解析 URI 地址!可能是因为极特币地址无效,或是 URI 参数格式错误。 Payment request file handling @@ -1705,7 +1705,7 @@ Signing is only possible with addresses of the type 'legacy'. Enter a DigiByte address (e.g. %1) - 请输入一个比特币地址 (例如 %1) + 请输入一个极特币地址 (例如 %1) %1 d @@ -2166,7 +2166,7 @@ Signing is only possible with addresses of the type 'legacy'. An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the DigiByte network. - 可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。 + 可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过极特币网络传送。 An optional label to associate with the new receiving address. @@ -2451,7 +2451,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for digibyte transactions than the network can process. - 当交易量小于可用区块空间时,矿工和中继节点可能会执行最低手续费率限制。按照这个最低费率来支付手续费也是可以的,但请注意,一旦交易需求超出比特币网络能处理的限度,你的交易可能永远也无法确认。 + 当交易量小于可用区块空间时,矿工和中继节点可能会执行最低手续费率限制。按照这个最低费率来支付手续费也是可以的,但请注意,一旦交易需求超出极特币网络能处理的限度,你的交易可能永远也无法确认。 A too low fee might result in a never confirming transaction (read the tooltip) @@ -2523,7 +2523,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Creates a Partially Signed DigiByte Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - 创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。 + 创建一个“部分签名极特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。 from wallet '%1' @@ -2571,7 +2571,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Please, review your transaction proposal. This will produce a Partially Signed DigiByte Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet. - 请务必仔细检查您的交易请求。这会产生一个部分签名比特币交易(PSBT),可以把保存下来或复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。 + 请务必仔细检查您的交易请求。这会产生一个部分签名极特币交易(PSBT),可以把保存下来或复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。 Please, review your transaction. @@ -2647,7 +2647,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Warning: Invalid DigiByte address - 警告: 比特币地址无效 + 警告: 极特币地址无效 Warning: Unknown change address @@ -2710,7 +2710,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p The fee will be deducted from the amount being sent. The recipient will receive less digibytes than you enter in the amount field. If multiple recipients are selected, the fee is split equally. - 交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。 + 交易费将从发送金额中扣除。接收人收到的极特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。 S&ubtract fee from amount @@ -2738,7 +2738,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p A message that was attached to the digibyte: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the DigiByte network. - digibyte: URI 附带的备注信息,将会和交易一起存储,备查。 注意:该消息不会通过比特币网络传输。 + digibyte: URI 附带的备注信息,将会和交易一起存储,备查。 注意:该消息不会通过极特币网络传输。 Pay To: @@ -2772,7 +2772,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p You can sign messages/agreements with your addresses to prove you can receive digibytes sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - 您可以用你的地址对消息/协议进行签名,以证明您可以接收发送到该地址的比特币。注意不要对任何模棱两可或者随机的消息进行签名,以免遭受钓鱼式攻击。请确保消息内容准确的表达了您的真实意愿。 + 您可以用你的地址对消息/协议进行签名,以证明您可以接收发送到该地址的极特币。注意不要对任何模棱两可或者随机的消息进行签名,以免遭受钓鱼式攻击。请确保消息内容准确的表达了您的真实意愿。 The DigiByte address to sign the message with @@ -2844,7 +2844,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Verify the message to ensure it was signed with the specified DigiByte address - 验证消息,确保消息是由指定的比特币地址签名过的。 + 验证消息,确保消息是由指定的极特币地址签名过的。 Verify &Message @@ -3062,7 +3062,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours. - 新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。 + 新挖出的极特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。 Debug information diff --git a/src/qt/locale/digibyte_zh_TW.ts b/src/qt/locale/digibyte_zh_TW.ts index 1390b1a8dfa..628568aeea0 100644 --- a/src/qt/locale/digibyte_zh_TW.ts +++ b/src/qt/locale/digibyte_zh_TW.ts @@ -67,12 +67,12 @@ These are your DigiByte addresses for sending payments. Always check the amount and the receiving address before sending coins. - 這些是你要發送過去的 比特幣地址。在發送幣之前,務必要檢查金額和接收地址是否正確。 + 這些是你要發送過去的 极特币地址。在發送幣之前,務必要檢查金額和接收地址是否正確。 These are your DigiByte addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses. Signing is only possible with addresses of the type 'legacy'. - 這些是您的比特幣接收地址。使用“接收”標籤中的“產生新的接收地址”按鈕產生新的地址。只能使用“傳統”類型的地址進行簽名。 + 這些是您的极特币接收地址。使用“接收”標籤中的“產生新的接收地址”按鈕產生新的地址。只能使用“傳統”類型的地址進行簽名。 &Copy Address @@ -360,7 +360,7 @@ Signing is only possible with addresses of the type 'legacy'. Send coins to a DigiByte address - 發送幣給一個比特幣地址 + 發送幣給一個极特币地址 Backup wallet to another location @@ -396,11 +396,11 @@ Signing is only possible with addresses of the type 'legacy'. Sign messages with your DigiByte addresses to prove you own them - 用比特幣地址簽名訊息來證明位址是你的 + 用极特币地址簽名訊息來證明位址是你的 Verify messages to ensure they were signed with specified DigiByte addresses - 驗證訊息是用來確定訊息是用指定的比特幣地址簽名的 + 驗證訊息是用來確定訊息是用指定的极特币地址簽名的 &File @@ -484,7 +484,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction - 載入部分簽名的比特幣交易 + 載入部分簽名的极特币交易 Load PSBT from clipboard... @@ -492,7 +492,7 @@ Signing is only possible with addresses of the type 'legacy'. Load Partially Signed DigiByte Transaction from clipboard - 從剪貼簿載入部分簽名的比特幣交易 + 從剪貼簿載入部分簽名的极特币交易 Node window @@ -512,7 +512,7 @@ Signing is only possible with addresses of the type 'legacy'. Open a digibyte: URI - 打開一個比特幣:URI + 打開一個极特币:URI Open Wallet @@ -908,7 +908,7 @@ Signing is only possible with addresses of the type 'legacy'. The entered address "%1" is not a valid DigiByte address. - 輸入的地址 %1 並不是有效的比特幣地址。 + 輸入的地址 %1 並不是有效的极特币地址。 The entered address "%1" is already in the address book with label "%2". @@ -1099,7 +1099,7 @@ Signing is only possible with addresses of the type 'legacy'. OpenURIDialog Open digibyte URI - 打開比特幣URI + 打開极特币URI URI: @@ -1333,7 +1333,7 @@ Signing is only possible with addresses of the type 'legacy'. Connect to the DigiByte network through a separate SOCKS5 proxy for Tor onion services. - 通過用於Tor洋蔥服務個別的SOCKS5代理連接到比特幣網路。 + 通過用於Tor洋蔥服務個別的SOCKS5代理連接到极特币網路。 Use separate SOCKS&5 proxy to reach peers via Tor onion services: @@ -1610,7 +1610,7 @@ Signing is only possible with addresses of the type 'legacy'. URI cannot be parsed! This can be caused by an invalid DigiByte address or malformed URI parameters. - 沒辦法解析 URI !可能是因為無效比特幣地址,或是 URI 參數格式錯誤。 + 沒辦法解析 URI !可能是因為無效极特币地址,或是 URI 參數格式錯誤。 Payment request file handling @@ -1652,7 +1652,7 @@ Signing is only possible with addresses of the type 'legacy'. Enter a DigiByte address (e.g. %1) - 輸入 比特幣地址 (比如說 %1) + 輸入 极特币地址 (比如說 %1) %1 d @@ -2390,7 +2390,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for digibyte transactions than the network can process. - 当交易量小于可用区块空间时,矿工和中继节点可能会执行最低手续费率限制。按照这个最低费率来支付手续费也是可以的,但请注意,一旦交易需求超出比特币网络能处理的限度,你的交易可能永远也无法确认。 + 当交易量小于可用区块空间时,矿工和中继节点可能会执行最低手续费率限制。按照这个最低费率来支付手续费也是可以的,但请注意,一旦交易需求超出极特币网络能处理的限度,你的交易可能永远也无法确认。 A too low fee might result in a never confirming transaction (read the tooltip) @@ -2578,7 +2578,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Warning: Invalid DigiByte address - 警告: 比特幣地址無效 + 警告: 极特币地址無效 Warning: Unknown change address @@ -2617,7 +2617,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p The DigiByte address to send the payment to - 將支付發送到的比特幣地址給 + 將支付發送到的极特币地址給 Alt+A @@ -2703,11 +2703,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p You can sign messages/agreements with your addresses to prove you can receive digibytes sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to. - 您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。 + 您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的极特币。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。 The DigiByte address to sign the message with - 用來簽名訊息的 比特幣地址 + 用來簽名訊息的 极特币地址 Choose previously used address @@ -2739,7 +2739,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Sign the message to prove you own this DigiByte address - 簽名這個訊息來證明這個比特幣地址是你的 + 簽名這個訊息來證明這個极特币地址是你的 Sign &Message @@ -2763,7 +2763,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p The DigiByte address the message was signed with - 簽名這個訊息的 比特幣地址 + 簽名這個訊息的 极特币地址 The signed message to verify @@ -2775,7 +2775,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 satoshis p Verify the message to ensure it was signed with the specified DigiByte address - 驗證這個訊息來確定是用指定的比特幣地址簽名的 + 驗證這個訊息來確定是用指定的极特币地址簽名的 Verify &Message From 659a96a4585f7a7393000f7c8c96664db34024e2 Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:09:40 -0600 Subject: [PATCH 06/13] Update QT URL --- depends/packages/qt.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index 61f263f2143..060406efc55 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -1,6 +1,6 @@ package=qt $(package)_version=5.15.10 -$(package)_download_path=https://download.qt.io/official_releases/qt/5.15/$($(package)_version)/submodules +$(package)_download_path=https://download.qt.io/archive/qt/5.15/$($(package)_version)/submodules $(package)_suffix=everywhere-opensource-src-$($(package)_version).tar.xz $(package)_file_name=qtbase-$($(package)_suffix) $(package)_sha256_hash=c0d06cb18d20f10bf7ad53552099e097ec39362d30a5d6f104724f55fa1c8fb9 From 50884ad3c87935610e83f200783a8109daac6c29 Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:22:43 -0600 Subject: [PATCH 07/13] Enforce Theme Colors --- src/qt/res/css/dark.css | 8 ++++++++ src/qt/res/css/light.css | 27 ++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/qt/res/css/dark.css b/src/qt/res/css/dark.css index 13c08292773..8e45ff3637d 100644 --- a/src/qt/res/css/dark.css +++ b/src/qt/res/css/dark.css @@ -1869,6 +1869,14 @@ background-color:rgba(255, 255, 255, 0.15); color: #ffffff !important; } + /* Override inline styles from modaloverlay.ui */ + ModalOverlay #infoText, + ModalOverlay #infoTextStrong, + ModalOverlay QLabel#infoText, + ModalOverlay QLabel#infoTextStrong { + color: #ffffff !important; + } + /* SEND DIALOG */ diff --git a/src/qt/res/css/light.css b/src/qt/res/css/light.css index 809faf929b5..b2a9644d656 100644 --- a/src/qt/res/css/light.css +++ b/src/qt/res/css/light.css @@ -1879,7 +1879,7 @@ background-color:rgba(255, 255, 255, 0.15); } #contentWidget QLabel { - color: #333333 !important; + color: #003366 !important; font-size: 14pt !important; font-weight: normal; } @@ -1905,7 +1905,7 @@ background-color:rgba(255, 255, 255, 0.15); /* Ensure text readability in modal overlay */ ModalOverlay QLabel { - color: #333333 !important; + color: #003366 !important; } ModalOverlay QWidget#bgWidget { @@ -1913,7 +1913,15 @@ background-color:rgba(255, 255, 255, 0.15); } ModalOverlay QWidget#contentWidget QLabel { - color: #333333 !important; + color: #003366 !important; + } + + /* Override inline styles from modaloverlay.ui */ + ModalOverlay #infoText, + ModalOverlay #infoTextStrong, + ModalOverlay QLabel#infoText, + ModalOverlay QLabel#infoTextStrong { + color: #003366 !important; } QWidget#bgWidget .QPushButton#closeButton { @@ -4316,6 +4324,19 @@ TransactionOverviewWidget { font-weight: normal; } +/* Set palette for transaction overview to ensure C++ painter gets correct colors */ +TransactionOverviewWidget, +QListView#listTransactions { + color: #003366 !important; + selection-background-color: #0066CC; + selection-color: #ffffff; +} + +/* Ensure QFrame#frame_2 has correct base text color that gets inherited by palette */ +QFrame#frame_2 { + color: #003366 !important; +} + /* Selected items should have white text */ QFrame#frame_2 QListView::item:selected, QFrame#frame_2 QListView::item:selected *, From b0de3942e0b81bebd7bcdf7edc04826cc30259e5 Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:38:35 -0600 Subject: [PATCH 08/13] Remove Wallet Warning --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 428c71b8d16..174109c7f19 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ define(_CLIENT_VERSION_MAJOR, 8) define(_CLIENT_VERSION_MINOR, 26) define(_CLIENT_VERSION_BUILD, 1) define(_CLIENT_VERSION_RC, 0) -define(_CLIENT_VERSION_IS_RELEASE, false) +define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2025) define(_COPYRIGHT_HOLDERS,[The %s developers]) define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[DigiByte Core]]) From 546aaaaa3bbe5b3685eb15854e87b5246f23cb2e Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 15:46:13 -0600 Subject: [PATCH 09/13] Fix Github Test Runner Build --- src/crypto/scrypt.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/crypto/scrypt.h b/src/crypto/scrypt.h index 99e6d51b233..01e48603695 100644 --- a/src/crypto/scrypt.h +++ b/src/crypto/scrypt.h @@ -27,9 +27,11 @@ void PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen); -// On macOS, these functions are already defined in sys/endian.h -// Only define them if they're not already available -#ifndef __APPLE__ +// Use system-provided endian functions on BSD/macOS, provide our own elsewhere +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) +#include +#else +// Portable inline implementations for little-endian encoding/decoding static inline uint32_t le32dec(const void *pp) { const uint8_t *p = (uint8_t const *)pp; @@ -45,8 +47,5 @@ static inline void le32enc(void *pp, uint32_t x) p[2] = (x >> 16) & 0xff; p[3] = (x >> 24) & 0xff; } -#else -// On macOS, use the system provided functions -#include #endif #endif From 58d865de06811cd55a2e6625fddad6391a1f5233 Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:11:55 -0600 Subject: [PATCH 10/13] Update scrypt.h --- src/crypto/scrypt.h | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/crypto/scrypt.h b/src/crypto/scrypt.h index 01e48603695..2d5daaae3cf 100644 --- a/src/crypto/scrypt.h +++ b/src/crypto/scrypt.h @@ -27,25 +27,31 @@ void PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen); -// Use system-provided endian functions on BSD/macOS, provide our own elsewhere +// Use system-provided endian functions when available, provide our own elsewhere #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) -#include + // BSD/macOS: use sys/endian.h + #include +#elif defined(__linux__) || defined(__GLIBC__) + // Linux: use endian.h and provide BSD-style function names + #include + #define le32dec(p) le32toh(*(const uint32_t *)(p)) + #define le32enc(p, v) do { *(uint32_t *)(p) = htole32(v); } while (0) #else -// Portable inline implementations for little-endian encoding/decoding -static inline uint32_t le32dec(const void *pp) -{ - const uint8_t *p = (uint8_t const *)pp; - return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + - ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); -} + // Fallback: portable inline implementations for little-endian encoding/decoding + static inline uint32_t le32dec(const void *pp) + { + const uint8_t *p = (uint8_t const *)pp; + return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + + ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); + } -static inline void le32enc(void *pp, uint32_t x) -{ - uint8_t *p = (uint8_t *)pp; - p[0] = x & 0xff; - p[1] = (x >> 8) & 0xff; - p[2] = (x >> 16) & 0xff; - p[3] = (x >> 24) & 0xff; -} + static inline void le32enc(void *pp, uint32_t x) + { + uint8_t *p = (uint8_t *)pp; + p[0] = x & 0xff; + p[1] = (x >> 8) & 0xff; + p[2] = (x >> 16) & 0xff; + p[3] = (x >> 24) & 0xff; + } #endif #endif From 7ffe169bcc82b8cff4a64140440f692fa2299280 Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 17:31:22 -0600 Subject: [PATCH 11/13] Overview Page Theme --- src/qt/res/css/dark.css | 4 ++++ src/qt/res/css/light.css | 14 ++++++++++++++ src/qt/transactiontablemodel.cpp | 13 +++++++------ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/qt/res/css/dark.css b/src/qt/res/css/dark.css index 8e45ff3637d..9bb97e7f609 100644 --- a/src/qt/res/css/dark.css +++ b/src/qt/res/css/dark.css @@ -206,6 +206,10 @@ QWidget#centralWidget { color:#ffffff; } + QMessageBox QLabel { + color:#ffffff !important; + } + /* Options Dialog and other dialog content */ QDialog { background-color:#002352; diff --git a/src/qt/res/css/light.css b/src/qt/res/css/light.css index b2a9644d656..27270d11686 100644 --- a/src/qt/res/css/light.css +++ b/src/qt/res/css/light.css @@ -186,6 +186,10 @@ QWidget#centralWidget { color:#003366; } + QMessageBox QLabel { + color:#003366 !important; + } + /* Options Dialog and other dialog content */ QDialog { background-color:#ffffff; @@ -4337,6 +4341,16 @@ QFrame#frame_2 { color: #003366 !important; } +/* Make sure all labels in transaction list are dark blue (NOT selected state) */ +QFrame#frame_2 QListView::item QLabel, +QFrame#frame_2 QListView QLabel, +QListView#listTransactions QLabel, +QListView#listTransactions::item QLabel, +TransactionOverviewWidget::item QLabel, +TransactionOverviewWidget QListView QLabel { + color: #003366 !important; +} + /* Selected items should have white text */ QFrame#frame_2 QListView::item:selected, QFrame#frame_2 QListView::item:selected *, diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index 84aee873bc6..c9d49ac4d0b 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -429,22 +429,23 @@ QVariant TransactionTableModel::addressColor(const TransactionRecord *wtx) const // Check if we're using dark theme QString currentTheme = walletModel->getOptionsModel()->data(walletModel->getOptionsModel()->index(OptionsModel::Theme), Qt::EditRole).toString(); bool isDarkTheme = (currentTheme == "dark"); - - // Show addresses without label in a less visible color + + // Always return the appropriate color for the current theme + // Dark theme: white text, Light theme: dark blue text switch(wtx->type) { case TransactionRecord::RecvWithAddress: case TransactionRecord::SendToAddress: case TransactionRecord::Generated: { - QString label = walletModel->getAddressTableModel()->labelForAddress(QString::fromStdString(wtx->address)); - if(label.isEmpty()) - return isDarkTheme ? QColor(255, 255, 255) : QColor(0, 51, 102); + // Return theme-appropriate color for both labeled and unlabeled addresses + return isDarkTheme ? QColor(255, 255, 255) : QColor(0, 51, 102); } break; default: break; } - return QVariant(); + // For other transaction types, also return theme-appropriate color + return isDarkTheme ? QColor(255, 255, 255) : QColor(0, 51, 102); } QString TransactionTableModel::formatTxAmount(const TransactionRecord *wtx, bool showUnconfirmed, DigiByteUnits::SeparatorStyle separators) const From 978b0ac2736f6878bc99b420942acb8e234341f1 Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 17:35:30 -0600 Subject: [PATCH 12/13] Test Runner Fix --- src/crypto/scrypt.cpp | 9 ++------- src/crypto/scrypt.h | 42 ++++++++++++++++-------------------------- 2 files changed, 18 insertions(+), 33 deletions(-) diff --git a/src/crypto/scrypt.cpp b/src/crypto/scrypt.cpp index 0ee600e5d3b..0cbe2d1f2b7 100644 --- a/src/crypto/scrypt.cpp +++ b/src/crypto/scrypt.cpp @@ -44,9 +44,8 @@ #endif #endif -// On macOS, be32enc is already defined in sys/endian.h -// Only define it if not on macOS -#ifndef __APPLE__ +// Portable BSD-style encode function for big-endian +// This works with potentially unaligned pointers and is used only in scrypt static inline void be32enc(void *pp, uint32_t x) { uint8_t *p = (uint8_t *)pp; @@ -55,10 +54,6 @@ static inline void be32enc(void *pp, uint32_t x) p[1] = (x >> 16) & 0xff; p[0] = (x >> 24) & 0xff; } -#else -// On macOS, use the system provided function -#include -#endif /** * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen): diff --git a/src/crypto/scrypt.h b/src/crypto/scrypt.h index 2d5daaae3cf..4909ef6f848 100644 --- a/src/crypto/scrypt.h +++ b/src/crypto/scrypt.h @@ -27,31 +27,21 @@ void PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen); -// Use system-provided endian functions when available, provide our own elsewhere -#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) - // BSD/macOS: use sys/endian.h - #include -#elif defined(__linux__) || defined(__GLIBC__) - // Linux: use endian.h and provide BSD-style function names - #include - #define le32dec(p) le32toh(*(const uint32_t *)(p)) - #define le32enc(p, v) do { *(uint32_t *)(p) = htole32(v); } while (0) -#else - // Fallback: portable inline implementations for little-endian encoding/decoding - static inline uint32_t le32dec(const void *pp) - { - const uint8_t *p = (uint8_t const *)pp; - return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + - ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); - } +// Portable BSD-style encode/decode functions for little-endian +// These work with potentially unaligned pointers and are used only in scrypt +static inline uint32_t le32dec(const void *pp) +{ + const uint8_t *p = (uint8_t const *)pp; + return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + + ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); +} - static inline void le32enc(void *pp, uint32_t x) - { - uint8_t *p = (uint8_t *)pp; - p[0] = x & 0xff; - p[1] = (x >> 8) & 0xff; - p[2] = (x >> 16) & 0xff; - p[3] = (x >> 24) & 0xff; - } -#endif +static inline void le32enc(void *pp, uint32_t x) +{ + uint8_t *p = (uint8_t *)pp; + p[0] = x & 0xff; + p[1] = (x >> 8) & 0xff; + p[2] = (x >> 16) & 0xff; + p[3] = (x >> 24) & 0xff; +} #endif From 98f03f5d0b8f6477e096eec416a3fdbe625d2900 Mon Sep 17 00:00:00 2001 From: Jared Tate <13957390+JaredTate@users.noreply.github.com> Date: Mon, 27 Oct 2025 17:40:47 -0600 Subject: [PATCH 13/13] Fix macOS cross-platform build: Use scrypt-prefixed endian functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PROBLEM: - macOS SDK provides le32dec/le32enc/be32enc in sys/endian.h - Different macOS versions (local vs GitHub runner) have inconsistent availability - Previous attempts used conditional compilation which broke on different SDK versions SOLUTION: - Rename functions to scrypt_le32dec/scrypt_le32enc/scrypt_be32enc - These unique names never conflict with system headers - Portable byte-by-byte implementations work on ALL platforms - No dependency on platform-specific headers COMPATIBILITY GUARANTEED: ✅ macOS 14+ (GitHub Actions runner) -no system header conflicts ✅ macOS 10.x-15.x (all local Macs) - no system header conflicts ✅ Linux (all distributions) - portable implementation ✅ Intel & Apple Silicon - byte-order agnostic This bulletproof approach eliminates all platform-specific conditional compilation and works universally. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/crypto/scrypt.cpp | 12 ++++++------ src/crypto/scrypt.h | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/crypto/scrypt.cpp b/src/crypto/scrypt.cpp index 0cbe2d1f2b7..962f7c706c2 100644 --- a/src/crypto/scrypt.cpp +++ b/src/crypto/scrypt.cpp @@ -44,9 +44,9 @@ #endif #endif -// Portable BSD-style encode function for big-endian -// This works with potentially unaligned pointers and is used only in scrypt -static inline void be32enc(void *pp, uint32_t x) +// Scrypt-specific endian function to avoid conflicts with system headers +// This works with potentially unaligned pointers and is portable across all platforms +static inline void scrypt_be32enc(void *pp, uint32_t x) { uint8_t *p = (uint8_t *)pp; p[3] = x & 0xff; @@ -80,7 +80,7 @@ PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, /* Iterate through the blocks. */ for (i = 0; i * 32 < dkLen; i++) { /* Generate INT(i + 1). */ - be32enc(ivec, (uint32_t)(i + 1)); + scrypt_be32enc(ivec, (uint32_t)(i + 1)); /* Compute U_1 = PRF(P, S || INT(i)). */ memcpy(&hctx, &PShctx, sizeof(CHMAC_SHA256)); @@ -192,7 +192,7 @@ void scrypt_1024_1_1_256_sp_generic(const char *input, char *output, char *scrat PBKDF2_SHA256((const uint8_t *)input, 80, (const uint8_t *)input, 80, 1, B, 128); for (k = 0; k < 32; k++) - X[k] = le32dec(&B[4 * k]); + X[k] = scrypt_le32dec(&B[4 * k]); for (i = 0; i < 1024; i++) { memcpy(&V[i * 32], X, 128); @@ -208,7 +208,7 @@ void scrypt_1024_1_1_256_sp_generic(const char *input, char *output, char *scrat } for (k = 0; k < 32; k++) - le32enc(&B[4 * k], X[k]); + scrypt_le32enc(&B[4 * k], X[k]); PBKDF2_SHA256((const uint8_t *)input, 80, B, 128, 1, (uint8_t *)output, 32); } diff --git a/src/crypto/scrypt.h b/src/crypto/scrypt.h index 4909ef6f848..113df34ca45 100644 --- a/src/crypto/scrypt.h +++ b/src/crypto/scrypt.h @@ -27,16 +27,16 @@ void PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen); -// Portable BSD-style encode/decode functions for little-endian -// These work with potentially unaligned pointers and are used only in scrypt -static inline uint32_t le32dec(const void *pp) +// Scrypt-specific endian functions to avoid conflicts with system headers +// These work with potentially unaligned pointers and are portable across all platforms +static inline uint32_t scrypt_le32dec(const void *pp) { const uint8_t *p = (uint8_t const *)pp; return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) + ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24)); } -static inline void le32enc(void *pp, uint32_t x) +static inline void scrypt_le32enc(void *pp, uint32_t x) { uint8_t *p = (uint8_t *)pp; p[0] = x & 0xff;