- Daemon: automatically downloads blockchain snapshot when no data exists
No -bootstrap flag needed. Use -nobootstrap to skip.
- Qt wallet: auto-bootstraps on first run (no question asked)
Existing users still get the optional re-download prompt.
- New users just install and run - blockchain downloads automatically
- Works on all platforms (Windows, Linux, macOS, ARM64)
copy_option::overwrite_if_exists was removed in Boost 1.90+,
replaced with copy_options::overwrite_existing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a "Data Directory" section to Options > Main tab that lets users
browse for a new data directory. On confirmation, files are automatically
migrated to the new location on restart (wallet.dat copied first with
atomic rename for safety). Supports "Restart Now" or "Later" workflow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fixes multiple concurrency bugs exposed during shutdown when Tor proxy
connections are failing:
- Reorder shutdown: stop network threads before destroying Tor V3 services
- Make RPC listener responsive to fShutdown (poll_one+sleep vs blocking run_one)
- Wrap StopRequests() in try/catch and drain io_service on exit
- Fix leaked CNode AddRef in ThreadSocketHandler2 and ThreadMessageHandler2
(return→break so Release loop executes)
- Guard vNodes.size() read with cs_vNodes lock (data race)
- Guard Qt UI signal callbacks with fShutdown check (use-after-free)
- Add cs_vNodes lock in CNetCleanup global destructor
- Force-disconnect remaining nodes in StopNode() after threads stop
- Make Tor maintenance thread sleep in 500ms intervals for prompt shutdown
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move centralWidget assignment before page creation to fix use of
uninitialized pointer. Use Qt::Widget flags when pages have a parent
(embedded in QStackedWidget) and pass centralWidget as parent for all
lazily-created pages (messagePage, signMessagePage, verifyMessagePage).
Also fix TransactionView which unconditionally set FramelessWindowHint.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instrument AppInit2 with StartupPerfLog timing for each startup phase
(block index, wallet load, rescan, tor, peers, etc). Show queued
transaction count in the progress bar during wallet history sync.
Emit transactionSyncProgressChanged for real-time pending counts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Prevent UI freezes during sync by batching wallet transaction notifications
with a 250ms debounce timer and full-refresh fallback for large batches.
Disable dynamic sorting and view updates on overview/transaction pages while
syncing. Add request/reply/error filter checkboxes to the RPC console with
in-memory message store. Implement macOS LaunchAgents-based autostart.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sync fixes:
- Extend stall detection beyond IBD to catch post-IBD sync gaps
- Walk-forward inv continuation to avoid CBlockLocator exponential gap loop
- Track walk-forward progress for stall recovery without restarting from scratch
GUI fixes:
- Load transactions synchronously in constructor (deferred QTimer never fired)
- Use beginResetModel/endResetModel instead of deprecated reset()
- Schedule full refresh on TRY_LOCK failure to avoid dropped CT_NEW notifications
- Only update cachedNumBlocks after successful balance check (prevents permanent loss)
- Add GetAllBalances() single-pass balance retrieval with TRY_LOCK
Bootstrap:
- Add trusted snapshot manifest verification for bootstrap archives
- Add IsKnownCheckpoint() to validate manifest against compiled-in checkpoints
- Skip txleveldb rebuild when verified manifest is present
Bump version to 5.3.7 across all packaging manifests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add MakeSecureString(const std::string&) in allocators.h
- Replace .c_str() shims in walletpassphrase, walletpassphrasechange,
encryptwallet RPCs and askpassphrasedialog
- Update TODO_DOCUMENTATION.md to mark issue as resolved
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add test-linux-unit CI job; release now depends on tests passing
- Replace LOCK(cs_wallet) with TRY_LOCK in transactiontablemodel to avoid GUI freezes
- Add build artifacts to .gitignore (dist/, zips, object scripts)
- Add unit test instructions to README
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
During sync, NotifyTransactionChanged fires for every wallet tx in
every block, each triggering 3 blocking LOCK(cs_wallet) calls on
the UI thread: updateWallet, GetAllBalances, getNumTransactions.
With the block processing thread holding cs_wallet almost continuously,
the UI thread blocks waiting for the lock - causing "not responding".
Fixes:
- GetAllBalances: LOCK → TRY_LOCK, returns false if busy
- updateWallet (tx table): LOCK → TRY_LOCK, skips if busy
- updateTransaction: removed checkBalanceChanged() call entirely
(pollBalanceChanged timer handles it every 2.5s with TRY_LOCK)
- getNumTransactions: replaced with rowCount() from cached model
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On Linux, int64_t is long but qint64 is long long - different types
that can't bind to the same reference. Use int64_t locals to match
the GetAllBalances signature.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove time-based sync check that showed "out of sync" when blocks
were >6 hours old. For PoS chains with few stakers, blocks can be
hours apart - that's idle, not out of sync. Now uses block count
only. Also adds periodic UI refresh every 30s and switches cached
stake weight from volatile to std::atomic.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add CLEANUP_NOTES.md documenting cleanup strategy
- Add TODO_DOCUMENTATION.md with detailed context for all TODOs
- Improve inline comments for thread safety issue in rpcmining.cpp
- Clarify potential collision note in walletmodel.cpp
- Remove unclear 'DRM' comment, replace with descriptive text
No functional changes - documentation only.
Move GetStakeWeight() off the UI thread by caching in the staking
miner thread. Replace blocking LOCK(cs_vNodes) with TRY_LOCK in
clientmodel and staking icon updates. Fix out-of-sync label getting
stuck when disconnected. Add daemon bootstrap and faster IBD pipeline.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Daemon: add -bootstrap flag to download chain files from server on startup
- Qt: bootstrap prompt shows every launch with "Don't show this again" checkbox
- IBD: reduce pipeline refill interval from 1000 to 100 blocks for faster sync
- Add bootstrap.o to daemon makefiles (mingw + unix)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Peer connectivity (small network optimizations):
- Reduce hardcoded seed fallback delay from 30s to 10s
- Reduce peer retry interval from 600s to 120s
- Lower staking minimum peers from 3 to 1
- Relay addr messages to all connected peers instead of just 2
UI responsiveness:
- Add progress reporting to ScanForWalletTransactions (every 10K blocks)
- Use TRY_LOCK in WalletModel::pollBalanceChanged to avoid blocking UI
- Use TRY_LOCK in TransactionTablePriv::refreshWallet with retry
Auto-bootstrap:
- Add bootstrap.h/cpp with HTTP download via boost::asio
- On first run, prompt user to download blockchain snapshot from
bootstrap.cryptographic-triangles.org directly into data directory
- Downloads filelist.txt manifest then each file with progress dialog
- Falls back to IP 194.233.88.206 if DNS fails
- Gracefully continues to P2P sync if bootstrap unavailable
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Moved setOrganizationName/setApplicationName calls BEFORE
IntroDialog::pickDataDirectory() so QSettings knows where to save the
user's data directory choice.
Previously, QSettings was created without org/app names set, causing
the "strDataDir" setting to be lost, forcing the dialog to appear on
every startup.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Major sync performance overhaul:
- Assumevalid: skip FetchInputs/ConnectInputs for blocks below
checkpoint (2,186,940). Only write txindex entries. Eliminates
millions of LevelDB reads during initial sync.
- Skip SyncWithWallets during IBD with automatic post-IBD wallet
rescan from genesis and SecureMsg chain scan.
- Skip wallet best-chain locator update during IBD so restarts
trigger proper rescan.
- Remove send/receive buffer limits (were 1MB/5MB, now unlimited).
The 1MB send buffer was the root cause of ~180 block stalls -
ProcessMessages stops reading when nSendSize >= SendBufferSize().
- Reduce IBD pipeline batch from 500 to 100 blocks for faster
re-requesting with near-instant block processing.
- Seed getblocks limit raised to 20000 during IBD (was 500).
- Faster message handler polling during IBD (10ms vs 100ms).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Shows an intro dialog on first launch letting users choose where to store
blockchain data. Saves the choice in QSettings so it only appears once.
Styled to match the existing Triangles dark theme.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove Q_OS_MAC guards around trayIconActivated slot declaration
and implementation. MOC generates code referencing the slot
unconditionally, causing a build error on macOS. The slot is
harmless when present - on macOS the tray icon isn't created
so it simply never gets called.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename client from "Black Pharao" to "Cryptographic Triangles"
- Update CLIENT_VERSION from 4.2.1.0 to 5.1.3.0
- Update DISPLAY_VERSION from 5.0.0.0 to 5.1.3.0
- Update .pro VERSION to 5.1.3.0
- Fix RC file: copyright 2014-2026, fix OriginalFilename typo
- Update about dialog copyright to 2014-2026
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New command: smsgbroadcast <addrFrom> <message>
Iterates all public keys in smsgDB and sends an encrypted message to each.
Skips the sender's own address. Reports sent/failed counts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Address table and transaction table now load asynchronously via
QTimer::singleShot after the event loop starts instead of blocking
the constructor
- MessageModel (secure messaging) lazy-loaded 1s after wallet init
or on-demand when navigating to message page
- Splash screen stays visible until window.show() completes
- Guard updateConfirmations() against empty transaction table
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Defer SecureMsgStart and ReacceptWalletTransactions to background thread
so GUI appears faster during startup
- Add shutdown checks in wallet scan/reaccept to prevent hanging on exit
- Smart wallet rescan: start from wallet birthday instead of genesis block
- Raise default dbcache from 25 to 128 MB for better performance
- Replace deprecated QDesktopServices with QStandardPaths (Qt5 compat)
- Enforce Qt5+ requirement in build system, remove -fpermissive flag
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Port codebase to build with OpenSSL 3.x and Boost 1.90+:
- Rewrite bignum.h to use BIGNUM* pointer instead of inheriting from opaque BIGNUM
- Fix ECDSA_SIG, EVP_CIPHER_CTX, HMAC_CTX opaque type access across key.cpp, crypter.cpp, smessage.cpp
- Modernize Boost.Asio API (io_context, resolver, executor) in trianglesrpc.cpp
- Remove embedded Tor v2 client (incompatible with OpenSSL 3.x), keep Tor v3 SOCKS5 approach
- Update header logo to Cryptographic Triangles branding (300x63)
- Replace Bittrex exchange link with Pinball (313.cash) across all locales
- Fix MSYS2/MinGW64 build: linker flags, Boost library names, miniupnpc static linking
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Version 4.2.1.0
- wallet makeover
- staking behaviour adjustments
- non mandatory update-
- no need for updating daemons (only recomended if used for staking)