From 3c6fcfbc9d9c61469be4f13d63d3badb6459517b Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:12:16 +0900 Subject: [PATCH 01/45] Add multi-OS release workflow and release guide --- .github/workflows/release.yml | 201 ++++++++++++++++++++++++++++++++++ doc/release-github-actions.md | 37 +++++++ 2 files changed, 238 insertions(+) create mode 100644 .github/workflows/release.yml create mode 100644 doc/release-github-actions.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000000..37b22f3e3973 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,201 @@ +name: Build and Release XPChain Core + +on: + push: + tags: + - 'v*' + workflow_dispatch: + inputs: + tag: + description: 'Release tag (example: v0.17.0-4)' + required: true + type: string + +permissions: + contents: write + +env: + RELEASE_TAG: ${{ github.event_name == 'workflow_dispatch' && inputs.tag || github.ref_name }} + +jobs: + linux: + name: Linux Ubuntu x86_64 + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + build-essential libtool autotools-dev automake pkg-config bsdmainutils \ + python3 libssl-dev libevent-dev \ + libboost-system-dev libboost-filesystem-dev libboost-chrono-dev \ + libboost-test-dev libboost-thread-dev libdb-dev libdb++-dev \ + qtbase5-dev qttools5-dev qttools5-dev-tools \ + libprotobuf-dev protobuf-compiler libqrencode-dev libminiupnpc-dev + + - name: Build + run: | + ./autogen.sh + ./configure --with-incompatible-bdb + make -j"$(nproc)" + + - name: Package + run: | + TAG="${RELEASE_TAG}" + mkdir -p dist + cp src/xpchaind src/xpchain-cli src/xpchain-tx src/qt/xpchain-qt dist/ + tar -C dist -czf "xpchain-${TAG}-linux-x86_64.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: linux-x86_64 + path: xpchain-*.tar.gz + + windows64: + name: Windows x86_64 + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git \ + g++-mingw-w64-x86-64 + + - name: Build depends (x86_64-w64-mingw32) + run: | + cd depends + make HOST=x86_64-w64-mingw32 -j"$(nproc)" + + - name: Configure and build + run: | + ./autogen.sh + CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/ + make -j"$(nproc)" + + - name: Package + run: | + TAG="${RELEASE_TAG}" + mkdir -p dist + cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe src/qt/xpchain-qt.exe dist/ + cd dist + zip -9 "../xpchain-${TAG}-win64.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: win64 + path: xpchain-*-win64.zip + + windows32: + name: Windows x86 + runs-on: ubuntu-22.04 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git \ + g++-mingw-w64-i686 mingw-w64-i686-dev + + - name: Build depends (i686-w64-mingw32) + run: | + cd depends + make HOST=i686-w64-mingw32 -j"$(nproc)" + + - name: Configure and build + run: | + ./autogen.sh + CONFIG_SITE=$PWD/depends/i686-w64-mingw32/share/config.site ./configure --prefix=/ + make -j"$(nproc)" + + - name: Package + run: | + TAG="${RELEASE_TAG}" + mkdir -p dist + cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe src/qt/xpchain-qt.exe dist/ + cd dist + zip -9 "../xpchain-${TAG}-win32.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: win32 + path: xpchain-*-win32.zip + + macos: + name: macOS arm64/x86_64 runner build + runs-on: macos-13 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install dependencies + run: | + brew update + brew install autoconf automake libtool pkg-config openssl@3 libevent boost berkeley-db@4 miniupnpc protobuf qt@5 qrencode + + - name: Build + env: + LDFLAGS: -L/usr/local/opt/openssl@3/lib -L/usr/local/opt/berkeley-db@4/lib + CPPFLAGS: -I/usr/local/opt/openssl@3/include -I/usr/local/opt/berkeley-db@4/include + PKG_CONFIG_PATH: /usr/local/opt/openssl@3/lib/pkgconfig:/usr/local/opt/qt@5/lib/pkgconfig + run: | + ./autogen.sh + ./configure --with-gui=qt5 + make -j"$(sysctl -n hw.ncpu)" + + - name: Package + run: | + TAG="${RELEASE_TAG}" + mkdir -p dist + cp src/xpchaind src/xpchain-cli src/xpchain-tx src/qt/xpchain-qt dist/ + tar -C dist -czf "xpchain-${TAG}-macos.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: macos + path: xpchain-*-macos.tar.gz + + release: + name: Publish GitHub Release + runs-on: ubuntu-22.04 + needs: [linux, windows64, windows32, macos] + steps: + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + path: release-assets + + - name: Flatten assets + run: | + mkdir -p out + find release-assets -type f \( -name '*.zip' -o -name '*.tar.gz' \) -exec cp {} out/ \; + ls -lah out + + - name: Create release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.RELEASE_TAG }} + name: XPChain Core ${{ env.RELEASE_TAG }} + generate_release_notes: true + files: out/* diff --git a/doc/release-github-actions.md b/doc/release-github-actions.md new file mode 100644 index 000000000000..f518a1e4eaf0 --- /dev/null +++ b/doc/release-github-actions.md @@ -0,0 +1,37 @@ +# XPChain Core 릴리즈 가이드 (GitHub Actions) + +이 저장소(`arnoldcho/xpchain-community-core`)는 태그 기준으로 자동 빌드/릴리즈하도록 설정되어 있습니다. + +## 1) 지원 대상 +- Linux (Ubuntu x86_64): `xpchaind`, `xpchain-cli`, `xpchain-tx`, `xpchain-qt` +- Windows 64bit: `xpchaind.exe`, `xpchain-cli.exe`, `xpchain-tx.exe`, `xpchain-qt.exe` +- Windows 32bit: `xpchaind.exe`, `xpchain-cli.exe`, `xpchain-tx.exe`, `xpchain-qt.exe` +- macOS: `xpchaind`, `xpchain-cli`, `xpchain-tx`, `xpchain-qt` + +주의: iOS는 XPChain Core(데스크톱/노드 소프트웨어) 공식 빌드 타깃이 아닙니다. + +## 2) 릴리즈 실행 방법 + +### 방법 A. 태그 푸시 (권장) +```bash +git tag v0.17.0-4 +git push origin v0.17.0-4 +``` + +### 방법 B. 수동 실행 +- GitHub 저장소 > Actions > `Build and Release XPChain Core` +- `Run workflow` 클릭 +- `tag` 입력 (예: `v0.17.0-4`) + +## 3) 결과물 확인 +- GitHub Releases에 자동 생성 +- 첨부 파일 예시: + - `xpchain-v0.17.0-4-linux-x86_64.tar.gz` + - `xpchain-v0.17.0-4-win64.zip` + - `xpchain-v0.17.0-4-win32.zip` + - `xpchain-v0.17.0-4-macos.tar.gz` + +## 4) 운영 권장사항 +- 태그를 찍기 전에 `master` 기준으로 테스트 빌드 1회 권장 +- 릴리즈 노트에 변경점(합의/지갑/네트워크)을 꼭 명시 +- 파일 해시(`sha256sum`)를 릴리즈 노트에 함께 게시 From 92ba467a9c703f9f0a0f177d97c3ba012efba399 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:22:21 +0900 Subject: [PATCH 02/45] Fix release workflow runner and release dependencies --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 37b22f3e3973..83611d36e1d7 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -141,7 +141,7 @@ jobs: macos: name: macOS arm64/x86_64 runner build - runs-on: macos-13 + runs-on: macos-latest steps: - name: Checkout uses: actions/checkout@v4 @@ -179,7 +179,7 @@ jobs: release: name: Publish GitHub Release runs-on: ubuntu-22.04 - needs: [linux, windows64, windows32, macos] + needs: [linux, windows64, windows32] steps: - name: Download build artifacts uses: actions/download-artifact@v4 From 81abd3f07b12abb2203d4c72ff3638c2776c8e71 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:29:05 +0900 Subject: [PATCH 03/45] Fix linux build by including deque in httpserver --- src/httpserver.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/httpserver.cpp b/src/httpserver.cpp index d722adee152a..854a9c7384c4 100644 --- a/src/httpserver.cpp +++ b/src/httpserver.cpp @@ -14,6 +14,7 @@ #include #include +#include #include #include #include From d7a50e50d45a96b5a913d8d1dd90b9dafb13bcd5 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:34:38 +0900 Subject: [PATCH 04/45] Fix linux return-path build error and macOS boost detection --- .github/workflows/release.yml | 10 +++++----- src/validation.cpp | 2 ++ 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 83611d36e1d7..77458f1e1359 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -154,13 +154,13 @@ jobs: brew install autoconf automake libtool pkg-config openssl@3 libevent boost berkeley-db@4 miniupnpc protobuf qt@5 qrencode - name: Build - env: - LDFLAGS: -L/usr/local/opt/openssl@3/lib -L/usr/local/opt/berkeley-db@4/lib - CPPFLAGS: -I/usr/local/opt/openssl@3/include -I/usr/local/opt/berkeley-db@4/include - PKG_CONFIG_PATH: /usr/local/opt/openssl@3/lib/pkgconfig:/usr/local/opt/qt@5/lib/pkgconfig run: | + BREW_PREFIX="$(brew --prefix)" + export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib -L${BREW_PREFIX}/opt/boost/lib" + export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" + export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" ./autogen.sh - ./configure --with-gui=qt5 + ./configure --with-gui=qt5 --with-boost="${BREW_PREFIX}/opt/boost" make -j"$(sysctl -n hw.ncpu)" - name: Package diff --git a/src/validation.cpp b/src/validation.cpp index bebdd47fc440..e307b1a8bb9d 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -1210,6 +1210,8 @@ double_t GetAnnualRate(int nHeight, const Consensus::Params& consensusParams) return 0.05; } + // Defensive fallback for compiler return-path analysis. + return 0.05; } CAmount GetProofOfStakeReward(int nHeight, CAmount nAmount, uint32_t nTime, const Consensus::Params& consensusParams) From f024a1edc9a848508bde78554cbaf4e6ace24a2f Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:40:34 +0900 Subject: [PATCH 05/45] Fix boost placeholders build issue in validationinterface --- src/validationinterface.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index 248e774a8d18..a52cdafa3a2a 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -16,8 +16,11 @@ #include #include +#include #include +using namespace boost::placeholders; + struct MainSignalsInstance { boost::signals2::signal UpdatedBlockTip; boost::signals2::signal TransactionAddedToMempool; From 718b337a3b9c8556675628b82e250e57fa57445d Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:42:05 +0900 Subject: [PATCH 06/45] Qualify boost placeholders in validationinterface --- src/validationinterface.cpp | 42 ++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index a52cdafa3a2a..85e600d8129c 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -19,8 +19,6 @@ #include #include -using namespace boost::placeholders; - struct MainSignalsInstance { boost::signals2::signal UpdatedBlockTip; boost::signals2::signal TransactionAddedToMempool; @@ -63,11 +61,11 @@ size_t CMainSignals::CallbacksPending() { } void CMainSignals::RegisterWithMempoolSignals(CTxMemPool& pool) { - pool.NotifyEntryRemoved.connect(boost::bind(&CMainSignals::MempoolEntryRemoved, this, _1, _2)); + pool.NotifyEntryRemoved.connect(boost::bind(&CMainSignals::MempoolEntryRemoved, this, boost::placeholders::_1, boost::placeholders::_2)); } void CMainSignals::UnregisterWithMempoolSignals(CTxMemPool& pool) { - pool.NotifyEntryRemoved.disconnect(boost::bind(&CMainSignals::MempoolEntryRemoved, this, _1, _2)); + pool.NotifyEntryRemoved.disconnect(boost::bind(&CMainSignals::MempoolEntryRemoved, this, boost::placeholders::_1, boost::placeholders::_2)); } CMainSignals& GetMainSignals() @@ -76,27 +74,27 @@ CMainSignals& GetMainSignals() } void RegisterValidationInterface(CValidationInterface* pwalletIn) { - g_signals.m_internals->UpdatedBlockTip.connect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3)); - g_signals.m_internals->TransactionAddedToMempool.connect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1)); - g_signals.m_internals->BlockConnected.connect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3)); - g_signals.m_internals->BlockDisconnected.connect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1)); - g_signals.m_internals->TransactionRemovedFromMempool.connect(boost::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1)); - g_signals.m_internals->ChainStateFlushed.connect(boost::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, _1)); - g_signals.m_internals->Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2)); - g_signals.m_internals->BlockChecked.connect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2)); - g_signals.m_internals->NewPoWValidBlock.connect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2)); + g_signals.m_internals->UpdatedBlockTip.connect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + g_signals.m_internals->TransactionAddedToMempool.connect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, boost::placeholders::_1)); + g_signals.m_internals->BlockConnected.connect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + g_signals.m_internals->BlockDisconnected.connect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, boost::placeholders::_1)); + g_signals.m_internals->TransactionRemovedFromMempool.connect(boost::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, boost::placeholders::_1)); + g_signals.m_internals->ChainStateFlushed.connect(boost::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, boost::placeholders::_1)); + g_signals.m_internals->Broadcast.connect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, boost::placeholders::_1, boost::placeholders::_2)); + g_signals.m_internals->BlockChecked.connect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, boost::placeholders::_1, boost::placeholders::_2)); + g_signals.m_internals->NewPoWValidBlock.connect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, boost::placeholders::_1, boost::placeholders::_2)); } void UnregisterValidationInterface(CValidationInterface* pwalletIn) { - g_signals.m_internals->BlockChecked.disconnect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, _1, _2)); - g_signals.m_internals->Broadcast.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, _1, _2)); - g_signals.m_internals->ChainStateFlushed.disconnect(boost::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, _1)); - g_signals.m_internals->TransactionAddedToMempool.disconnect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, _1)); - g_signals.m_internals->BlockConnected.disconnect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, _1, _2, _3)); - g_signals.m_internals->BlockDisconnected.disconnect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, _1)); - g_signals.m_internals->TransactionRemovedFromMempool.disconnect(boost::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, _1)); - g_signals.m_internals->UpdatedBlockTip.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3)); - g_signals.m_internals->NewPoWValidBlock.disconnect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, _1, _2)); + g_signals.m_internals->BlockChecked.disconnect(boost::bind(&CValidationInterface::BlockChecked, pwalletIn, boost::placeholders::_1, boost::placeholders::_2)); + g_signals.m_internals->Broadcast.disconnect(boost::bind(&CValidationInterface::ResendWalletTransactions, pwalletIn, boost::placeholders::_1, boost::placeholders::_2)); + g_signals.m_internals->ChainStateFlushed.disconnect(boost::bind(&CValidationInterface::ChainStateFlushed, pwalletIn, boost::placeholders::_1)); + g_signals.m_internals->TransactionAddedToMempool.disconnect(boost::bind(&CValidationInterface::TransactionAddedToMempool, pwalletIn, boost::placeholders::_1)); + g_signals.m_internals->BlockConnected.disconnect(boost::bind(&CValidationInterface::BlockConnected, pwalletIn, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + g_signals.m_internals->BlockDisconnected.disconnect(boost::bind(&CValidationInterface::BlockDisconnected, pwalletIn, boost::placeholders::_1)); + g_signals.m_internals->TransactionRemovedFromMempool.disconnect(boost::bind(&CValidationInterface::TransactionRemovedFromMempool, pwalletIn, boost::placeholders::_1)); + g_signals.m_internals->UpdatedBlockTip.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + g_signals.m_internals->NewPoWValidBlock.disconnect(boost::bind(&CValidationInterface::NewPoWValidBlock, pwalletIn, boost::placeholders::_1, boost::placeholders::_2)); } void UnregisterAllValidationInterfaces() { From 7a116d0b9e5e68613a09b29d6d46d43cf7f71cb3 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:44:25 +0900 Subject: [PATCH 07/45] Fix boost placeholder usage in validation connect trace --- src/validation.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index e307b1a8bb9d..9db9c051c4fa 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -45,6 +45,7 @@ #include #include +#include #include #include @@ -2510,11 +2511,11 @@ class ConnectTrace { public: explicit ConnectTrace(CTxMemPool &_pool) : blocksConnected(1), pool(_pool) { - pool.NotifyEntryRemoved.connect(boost::bind(&ConnectTrace::NotifyEntryRemoved, this, _1, _2)); + pool.NotifyEntryRemoved.connect(boost::bind(&ConnectTrace::NotifyEntryRemoved, this, boost::placeholders::_1, boost::placeholders::_2)); } ~ConnectTrace() { - pool.NotifyEntryRemoved.disconnect(boost::bind(&ConnectTrace::NotifyEntryRemoved, this, _1, _2)); + pool.NotifyEntryRemoved.disconnect(boost::bind(&ConnectTrace::NotifyEntryRemoved, this, boost::placeholders::_1, boost::placeholders::_2)); } void BlockConnected(CBlockIndex* pindex, std::shared_ptr pblock) { From b0e95b413ab1e35eeb631df94fcef68a612c631b Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:47:35 +0900 Subject: [PATCH 08/45] Stabilize CI downloads and macOS boost library detection --- .github/workflows/release.yml | 7 ++++--- depends/packages/boost.mk | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 77458f1e1359..179c51bdf7ed 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -76,7 +76,7 @@ jobs: - name: Build depends (x86_64-w64-mingw32) run: | cd depends - make HOST=x86_64-w64-mingw32 -j"$(nproc)" + make HOST=x86_64-w64-mingw32 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" - name: Configure and build run: | @@ -117,7 +117,7 @@ jobs: - name: Build depends (i686-w64-mingw32) run: | cd depends - make HOST=i686-w64-mingw32 -j"$(nproc)" + make HOST=i686-w64-mingw32 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" - name: Configure and build run: | @@ -156,11 +156,12 @@ jobs: - name: Build run: | BREW_PREFIX="$(brew --prefix)" + BOOST_PREFIX="$(brew --prefix boost)" export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib -L${BREW_PREFIX}/opt/boost/lib" export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" ./autogen.sh - ./configure --with-gui=qt5 --with-boost="${BREW_PREFIX}/opt/boost" + ./configure --with-gui=qt5 --with-boost="${BOOST_PREFIX}" --with-boost-libdir="${BOOST_PREFIX}/lib" make -j"$(sysctl -n hw.ncpu)" - name: Package diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk index 61806c7509ef..e0e6d711899d 100644 --- a/depends/packages/boost.mk +++ b/depends/packages/boost.mk @@ -1,6 +1,6 @@ package=boost $(package)_version=1_64_0 -$(package)_download_path=https://dl.bintray.com/boostorg/release/1.64.0/source/ +$(package)_download_path=https://archives.boost.io/release/1.64.0/source/ $(package)_file_name=$(package)_$($(package)_version).tar.bz2 $(package)_sha256_hash=7bcc5caace97baa948931d712ea5f37038dbb1c5d89b43ad4def4ed7cb683332 From 39e9438be4f141810a9dc011000a8b93515e3754 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 13:57:49 +0900 Subject: [PATCH 09/45] Make Windows builds no-gui and relax macOS build blocking --- .github/workflows/release.yml | 45 ++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 179c51bdf7ed..a595d7feb796 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -76,21 +76,26 @@ jobs: - name: Build depends (x86_64-w64-mingw32) run: | cd depends - make HOST=x86_64-w64-mingw32 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" + make HOST=x86_64-w64-mingw32 NO_QT=1 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" - name: Configure and build run: | ./autogen.sh - CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/ + CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/ --without-gui make -j"$(nproc)" - name: Package run: | TAG="${RELEASE_TAG}" mkdir -p dist - cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe src/qt/xpchain-qt.exe dist/ + cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe dist/ + if [ -f src/qt/xpchain-qt.exe ]; then cp src/qt/xpchain-qt.exe dist/; fi cd dist - zip -9 "../xpchain-${TAG}-win64.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe + if [ -f xpchain-qt.exe ]; then + zip -9 "../xpchain-${TAG}-win64.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe + else + zip -9 "../xpchain-${TAG}-win64.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe + fi - name: Upload artifact uses: actions/upload-artifact@v4 @@ -117,21 +122,26 @@ jobs: - name: Build depends (i686-w64-mingw32) run: | cd depends - make HOST=i686-w64-mingw32 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" + make HOST=i686-w64-mingw32 NO_QT=1 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" - name: Configure and build run: | ./autogen.sh - CONFIG_SITE=$PWD/depends/i686-w64-mingw32/share/config.site ./configure --prefix=/ + CONFIG_SITE=$PWD/depends/i686-w64-mingw32/share/config.site ./configure --prefix=/ --without-gui make -j"$(nproc)" - name: Package run: | TAG="${RELEASE_TAG}" mkdir -p dist - cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe src/qt/xpchain-qt.exe dist/ + cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe dist/ + if [ -f src/qt/xpchain-qt.exe ]; then cp src/qt/xpchain-qt.exe dist/; fi cd dist - zip -9 "../xpchain-${TAG}-win32.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe + if [ -f xpchain-qt.exe ]; then + zip -9 "../xpchain-${TAG}-win32.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe + else + zip -9 "../xpchain-${TAG}-win32.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe + fi - name: Upload artifact uses: actions/upload-artifact@v4 @@ -142,6 +152,7 @@ jobs: macos: name: macOS arm64/x86_64 runner build runs-on: macos-latest + continue-on-error: true steps: - name: Checkout uses: actions/checkout@v4 @@ -157,19 +168,31 @@ jobs: run: | BREW_PREFIX="$(brew --prefix)" BOOST_PREFIX="$(brew --prefix boost)" + export BOOST_ROOT="${BOOST_PREFIX}" + export BOOST_INCLUDEDIR="${BOOST_PREFIX}/include" + export BOOST_LIBRARYDIR="${BOOST_PREFIX}/lib" + export BOOST_SYSTEM_LIB="-lboost_system" + export BOOST_FILESYSTEM_LIB="-lboost_filesystem" + export BOOST_THREAD_LIB="-lboost_thread" + export BOOST_CHRONO_LIB="-lboost_chrono" export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib -L${BREW_PREFIX}/opt/boost/lib" export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" ./autogen.sh - ./configure --with-gui=qt5 --with-boost="${BOOST_PREFIX}" --with-boost-libdir="${BOOST_PREFIX}/lib" + ./configure --without-gui --with-boost="${BOOST_PREFIX}" --with-boost-libdir="${BOOST_PREFIX}/lib" make -j"$(sysctl -n hw.ncpu)" - name: Package run: | TAG="${RELEASE_TAG}" mkdir -p dist - cp src/xpchaind src/xpchain-cli src/xpchain-tx src/qt/xpchain-qt dist/ - tar -C dist -czf "xpchain-${TAG}-macos.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt + cp src/xpchaind src/xpchain-cli src/xpchain-tx dist/ + if [ -f src/qt/xpchain-qt ]; then cp src/qt/xpchain-qt dist/; fi + if [ -f dist/xpchain-qt ]; then + tar -C dist -czf "xpchain-${TAG}-macos.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt + else + tar -C dist -czf "xpchain-${TAG}-macos.tar.gz" xpchaind xpchain-cli xpchain-tx + fi - name: Upload artifact uses: actions/upload-artifact@v4 From b04451012940fb3099f9d50bb724d43fd10aa1f3 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:02:21 +0900 Subject: [PATCH 10/45] Update Qt 5.9.6 source URL to new_archive --- 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 65ecadb43b52..d81ac6229f36 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -1,6 +1,6 @@ PACKAGE=qt $(package)_version=5.9.6 -$(package)_download_path=https://download.qt.io/official_releases/qt/5.9/$($(package)_version)/submodules +$(package)_download_path=https://download.qt.io/new_archive/qt/5.9/$($(package)_version)/submodules $(package)_suffix=opensource-src-$($(package)_version).tar.xz $(package)_file_name=qtbase-$($(package)_suffix) $(package)_sha256_hash=eed620cb268b199bd83b3fc6a471c51d51e1dc2dbb5374fc97a0cc75facbe36f From 5cca461c2daf9c4582fde1effa1eabcd548c2c26 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:06:54 +0900 Subject: [PATCH 11/45] Qualify boost bind placeholders across qt and core sources --- src/qt/bitcoingui.cpp | 4 ++-- src/qt/clientmodel.cpp | 10 +++++----- src/qt/mintingtablemodel.cpp | 2 +- src/qt/splashscreen.cpp | 6 +++--- src/qt/transactiontablemodel.cpp | 4 ++-- src/qt/walletmodel.cpp | 8 ++++---- src/rpc/server.cpp | 2 +- src/torcontrol.cpp | 22 +++++++++++----------- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 606272f88ee0..7634ef0a80b3 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -1253,8 +1253,8 @@ static bool ThreadSafeMessageBox(BitcoinGUI *gui, const std::string& message, co void BitcoinGUI::subscribeToCoreSignals() { // Connect signals to client - m_handler_message_box = m_node.handleMessageBox(boost::bind(ThreadSafeMessageBox, this, _1, _2, _3)); - m_handler_question = m_node.handleQuestion(boost::bind(ThreadSafeMessageBox, this, _1, _3, _4)); + m_handler_message_box = m_node.handleMessageBox(boost::bind(ThreadSafeMessageBox, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + m_handler_question = m_node.handleQuestion(boost::bind(ThreadSafeMessageBox, this, boost::placeholders::_1, boost::placeholders::_3, boost::placeholders::_4)); } void BitcoinGUI::unsubscribeFromCoreSignals() diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index 7154ac14be63..c40a6703a738 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -247,13 +247,13 @@ static void BlockTipChanged(ClientModel *clientmodel, bool initialSync, int heig void ClientModel::subscribeToCoreSignals() { // Connect signals to client - m_handler_show_progress = m_node.handleShowProgress(boost::bind(ShowProgress, this, _1, _2)); - m_handler_notify_num_connections_changed = m_node.handleNotifyNumConnectionsChanged(boost::bind(NotifyNumConnectionsChanged, this, _1)); - m_handler_notify_network_active_changed = m_node.handleNotifyNetworkActiveChanged(boost::bind(NotifyNetworkActiveChanged, this, _1)); + m_handler_show_progress = m_node.handleShowProgress(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); + m_handler_notify_num_connections_changed = m_node.handleNotifyNumConnectionsChanged(boost::bind(NotifyNumConnectionsChanged, this, boost::placeholders::_1)); + m_handler_notify_network_active_changed = m_node.handleNotifyNetworkActiveChanged(boost::bind(NotifyNetworkActiveChanged, this, boost::placeholders::_1)); m_handler_notify_alert_changed = m_node.handleNotifyAlertChanged(boost::bind(NotifyAlertChanged, this)); m_handler_banned_list_changed = m_node.handleBannedListChanged(boost::bind(BannedListChanged, this)); - m_handler_notify_block_tip = m_node.handleNotifyBlockTip(boost::bind(BlockTipChanged, this, _1, _2, _3, _4, false)); - m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(boost::bind(BlockTipChanged, this, _1, _2, _3, _4, true)); + m_handler_notify_block_tip = m_node.handleNotifyBlockTip(boost::bind(BlockTipChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, false)); + m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(boost::bind(BlockTipChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, true)); } void ClientModel::unsubscribeFromCoreSignals() diff --git a/src/qt/mintingtablemodel.cpp b/src/qt/mintingtablemodel.cpp index 6079f6d7d004..009e5227a360 100644 --- a/src/qt/mintingtablemodel.cpp +++ b/src/qt/mintingtablemodel.cpp @@ -591,7 +591,7 @@ static void NotifyTransactionChanged(MintingTableModel *mtm, const uint256 &hash void MintingTableModel::subscribeToCoreSignals() { // Connect signals to wallet - m_handler_transaction_changed = walletModel->wallet().handleTransactionChanged(boost::bind(NotifyTransactionChanged, this, _1, _2)); + m_handler_transaction_changed = walletModel->wallet().handleTransactionChanged(boost::bind(NotifyTransactionChanged, this, boost::placeholders::_1, boost::placeholders::_2)); } void MintingTableModel::unsubscribeFromCoreSignals() diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp index d95c926dbcba..d6d3aeb3713d 100644 --- a/src/qt/splashscreen.cpp +++ b/src/qt/splashscreen.cpp @@ -178,7 +178,7 @@ static void ShowProgress(SplashScreen *splash, const std::string &title, int nPr #ifdef ENABLE_WALLET void SplashScreen::ConnectWallet(std::unique_ptr wallet) { - m_connected_wallet_handlers.emplace_back(wallet->handleShowProgress(boost::bind(ShowProgress, this, _1, _2, false))); + m_connected_wallet_handlers.emplace_back(wallet->handleShowProgress(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2, false))); m_connected_wallets.emplace_back(std::move(wallet)); } #endif @@ -186,8 +186,8 @@ void SplashScreen::ConnectWallet(std::unique_ptr wallet) void SplashScreen::subscribeToCoreSignals() { // Connect signals to client - m_handler_init_message = m_node.handleInitMessage(boost::bind(InitMessage, this, _1)); - m_handler_show_progress = m_node.handleShowProgress(boost::bind(ShowProgress, this, _1, _2, _3)); + m_handler_init_message = m_node.handleInitMessage(boost::bind(InitMessage, this, boost::placeholders::_1)); + m_handler_show_progress = m_node.handleShowProgress(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); #ifdef ENABLE_WALLET m_handler_load_wallet = m_node.handleLoadWallet([this](std::unique_ptr wallet) { ConnectWallet(std::move(wallet)); }); #endif diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index e87d88e985bb..a55853872092 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -744,8 +744,8 @@ static void ShowProgress(TransactionTableModel *ttm, const std::string &title, i void TransactionTableModel::subscribeToCoreSignals() { // Connect signals to wallet - m_handler_transaction_changed = walletModel->wallet().handleTransactionChanged(boost::bind(NotifyTransactionChanged, this, _1, _2)); - m_handler_show_progress = walletModel->wallet().handleShowProgress(boost::bind(ShowProgress, this, _1, _2)); + m_handler_transaction_changed = walletModel->wallet().handleTransactionChanged(boost::bind(NotifyTransactionChanged, this, boost::placeholders::_1, boost::placeholders::_2)); + m_handler_show_progress = walletModel->wallet().handleShowProgress(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); } void TransactionTableModel::unsubscribeFromCoreSignals() diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 7ca403fb9dc5..4347356da483 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -441,10 +441,10 @@ void WalletModel::subscribeToCoreSignals() // Connect signals to wallet m_handler_unload = m_wallet->handleUnload(boost::bind(&NotifyUnload, this)); m_handler_status_changed = m_wallet->handleStatusChanged(boost::bind(&NotifyKeyStoreStatusChanged, this)); - m_handler_address_book_changed = m_wallet->handleAddressBookChanged(boost::bind(NotifyAddressBookChanged, this, _1, _2, _3, _4, _5)); - m_handler_transaction_changed = m_wallet->handleTransactionChanged(boost::bind(NotifyTransactionChanged, this, _1, _2)); - m_handler_show_progress = m_wallet->handleShowProgress(boost::bind(ShowProgress, this, _1, _2)); - m_handler_watch_only_changed = m_wallet->handleWatchOnlyChanged(boost::bind(NotifyWatchonlyChanged, this, _1)); + m_handler_address_book_changed = m_wallet->handleAddressBookChanged(boost::bind(NotifyAddressBookChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5)); + m_handler_transaction_changed = m_wallet->handleTransactionChanged(boost::bind(NotifyTransactionChanged, this, boost::placeholders::_1, boost::placeholders::_2)); + m_handler_show_progress = m_wallet->handleShowProgress(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); + m_handler_watch_only_changed = m_wallet->handleWatchOnlyChanged(boost::bind(NotifyWatchonlyChanged, this, boost::placeholders::_1)); } void WalletModel::unsubscribeFromCoreSignals() diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index afb7cb5ba95e..13c03a2964e9 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -509,7 +509,7 @@ std::vector CRPCTable::listCommands() const std::transform( mapCommands.begin(), mapCommands.end(), std::back_inserter(commandList), - boost::bind(&commandMap::value_type::first,_1) ); + boost::bind(&commandMap::value_type::first,boost::placeholders::_1) ); return commandList; } diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp index c88f61f1ec5b..d83d0b291f16 100644 --- a/src/torcontrol.cpp +++ b/src/torcontrol.cpp @@ -459,8 +459,8 @@ TorController::TorController(struct event_base* _base, const std::string& _targe if (!reconnect_ev) LogPrintf("tor: Failed to create event for reconnection: out of memory?\n"); // Start connection attempts immediately - if (!conn.Connect(_target, boost::bind(&TorController::connected_cb, this, _1), - boost::bind(&TorController::disconnected_cb, this, _1) )) { + if (!conn.Connect(_target, boost::bind(&TorController::connected_cb, this, boost::placeholders::_1), + boost::bind(&TorController::disconnected_cb, this, boost::placeholders::_1) )) { LogPrintf("tor: Initiating connection to Tor control port %s failed\n", _target); } // Read service private key if cached @@ -538,7 +538,7 @@ void TorController::auth_cb(TorControlConnection& _conn, const TorControlReply& // Note that the 'virtual' port doesn't have to be the same as our internal port, but this is just a convenient // choice. TODO; refactor the shutdown sequence some day. _conn.Command(strprintf("ADD_ONION %s Port=%i,127.0.0.1:%i", private_key, GetListenPort(), GetListenPort()), - boost::bind(&TorController::add_onion_cb, this, _1, _2)); + boost::bind(&TorController::add_onion_cb, this, boost::placeholders::_1, boost::placeholders::_2)); } else { LogPrintf("tor: Authentication failed\n"); } @@ -597,7 +597,7 @@ void TorController::authchallenge_cb(TorControlConnection& _conn, const TorContr } std::vector computedClientHash = ComputeResponse(TOR_SAFE_CLIENTKEY, cookie, clientNonce, serverNonce); - _conn.Command("AUTHENTICATE " + HexStr(computedClientHash), boost::bind(&TorController::auth_cb, this, _1, _2)); + _conn.Command("AUTHENTICATE " + HexStr(computedClientHash), boost::bind(&TorController::auth_cb, this, boost::placeholders::_1, boost::placeholders::_2)); } else { LogPrintf("tor: Invalid reply to AUTHCHALLENGE\n"); } @@ -646,23 +646,23 @@ void TorController::protocolinfo_cb(TorControlConnection& _conn, const TorContro if (methods.count("HASHEDPASSWORD")) { LogPrint(BCLog::TOR, "tor: Using HASHEDPASSWORD authentication\n"); boost::replace_all(torpassword, "\"", "\\\""); - _conn.Command("AUTHENTICATE \"" + torpassword + "\"", boost::bind(&TorController::auth_cb, this, _1, _2)); + _conn.Command("AUTHENTICATE \"" + torpassword + "\"", boost::bind(&TorController::auth_cb, this, boost::placeholders::_1, boost::placeholders::_2)); } else { LogPrintf("tor: Password provided with -torpassword, but HASHEDPASSWORD authentication is not available\n"); } } else if (methods.count("NULL")) { LogPrint(BCLog::TOR, "tor: Using NULL authentication\n"); - _conn.Command("AUTHENTICATE", boost::bind(&TorController::auth_cb, this, _1, _2)); + _conn.Command("AUTHENTICATE", boost::bind(&TorController::auth_cb, this, boost::placeholders::_1, boost::placeholders::_2)); } else if (methods.count("SAFECOOKIE")) { // Cookie: hexdump -e '32/1 "%02x""\n"' ~/.tor/control_auth_cookie LogPrint(BCLog::TOR, "tor: Using SAFECOOKIE authentication, reading cookie authentication from %s\n", cookiefile); std::pair status_cookie = ReadBinaryFile(cookiefile, TOR_COOKIE_SIZE); if (status_cookie.first && status_cookie.second.size() == TOR_COOKIE_SIZE) { - // _conn.Command("AUTHENTICATE " + HexStr(status_cookie.second), boost::bind(&TorController::auth_cb, this, _1, _2)); + // _conn.Command("AUTHENTICATE " + HexStr(status_cookie.second), boost::bind(&TorController::auth_cb, this, boost::placeholders::_1, boost::placeholders::_2)); cookie = std::vector(status_cookie.second.begin(), status_cookie.second.end()); clientNonce = std::vector(TOR_NONCE_SIZE, 0); GetRandBytes(clientNonce.data(), TOR_NONCE_SIZE); - _conn.Command("AUTHCHALLENGE SAFECOOKIE " + HexStr(clientNonce), boost::bind(&TorController::authchallenge_cb, this, _1, _2)); + _conn.Command("AUTHCHALLENGE SAFECOOKIE " + HexStr(clientNonce), boost::bind(&TorController::authchallenge_cb, this, boost::placeholders::_1, boost::placeholders::_2)); } else { if (status_cookie.first) { LogPrintf("tor: Authentication cookie %s is not exactly %i bytes, as is required by the spec\n", cookiefile, TOR_COOKIE_SIZE); @@ -684,7 +684,7 @@ void TorController::connected_cb(TorControlConnection& _conn) { reconnect_timeout = RECONNECT_TIMEOUT_START; // First send a PROTOCOLINFO command to figure out what authentication is expected - if (!_conn.Command("PROTOCOLINFO 1", boost::bind(&TorController::protocolinfo_cb, this, _1, _2))) + if (!_conn.Command("PROTOCOLINFO 1", boost::bind(&TorController::protocolinfo_cb, this, boost::placeholders::_1, boost::placeholders::_2))) LogPrintf("tor: Error sending initial protocolinfo command\n"); } @@ -711,8 +711,8 @@ void TorController::Reconnect() /* Try to reconnect and reestablish if we get booted - for example, Tor * may be restarting. */ - if (!conn.Connect(target, boost::bind(&TorController::connected_cb, this, _1), - boost::bind(&TorController::disconnected_cb, this, _1) )) { + if (!conn.Connect(target, boost::bind(&TorController::connected_cb, this, boost::placeholders::_1), + boost::bind(&TorController::disconnected_cb, this, boost::placeholders::_1) )) { LogPrintf("tor: Re-initiating connection to Tor control port %s failed\n", target); } } From c93221918b3f92b092765e12c7ef9b8a2c60c7a2 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:14:43 +0900 Subject: [PATCH 12/45] Make macOS build blocking and set explicit boost lib names --- .github/workflows/release.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a595d7feb796..5d1fdeb3b0ac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -152,7 +152,6 @@ jobs: macos: name: macOS arm64/x86_64 runner build runs-on: macos-latest - continue-on-error: true steps: - name: Checkout uses: actions/checkout@v4 @@ -171,15 +170,17 @@ jobs: export BOOST_ROOT="${BOOST_PREFIX}" export BOOST_INCLUDEDIR="${BOOST_PREFIX}/include" export BOOST_LIBRARYDIR="${BOOST_PREFIX}/lib" - export BOOST_SYSTEM_LIB="-lboost_system" - export BOOST_FILESYSTEM_LIB="-lboost_filesystem" - export BOOST_THREAD_LIB="-lboost_thread" - export BOOST_CHRONO_LIB="-lboost_chrono" export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib -L${BREW_PREFIX}/opt/boost/lib" export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" ./autogen.sh - ./configure --without-gui --with-boost="${BOOST_PREFIX}" --with-boost-libdir="${BOOST_PREFIX}/lib" + ./configure --without-gui \ + --with-boost="${BOOST_PREFIX}" \ + --with-boost-libdir="${BOOST_PREFIX}/lib" \ + --with-boost-system=boost_system \ + --with-boost-filesystem=boost_filesystem \ + --with-boost-thread=boost_thread \ + --with-boost-chrono=boost_chrono make -j"$(sysctl -n hw.ncpu)" - name: Package From 8d50e480b9fe553387f863e5b010b3be2737a8e7 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:16:22 +0900 Subject: [PATCH 13/45] Force mingw posix toolchain for Windows builds --- .github/workflows/release.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5d1fdeb3b0ac..0827a00a30a3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -73,6 +73,11 @@ jobs: build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git \ g++-mingw-w64-x86-64 + - name: Select posix mingw toolchain (x86_64) + run: | + sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix + sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix + - name: Build depends (x86_64-w64-mingw32) run: | cd depends @@ -119,6 +124,11 @@ jobs: build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git \ g++-mingw-w64-i686 mingw-w64-i686-dev + - name: Select posix mingw toolchain (i686) + run: | + sudo update-alternatives --set i686-w64-mingw32-g++ /usr/bin/i686-w64-mingw32-g++-posix + sudo update-alternatives --set i686-w64-mingw32-gcc /usr/bin/i686-w64-mingw32-gcc-posix + - name: Build depends (i686-w64-mingw32) run: | cd depends From d1423f14e7e8b7df54fb2f464054a1a7ef1faea0 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:18:44 +0900 Subject: [PATCH 14/45] Fix Qt build by including QPainterPath --- src/qt/trafficgraphwidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/qt/trafficgraphwidget.cpp b/src/qt/trafficgraphwidget.cpp index 35569149fcfb..f224cf7e58c1 100644 --- a/src/qt/trafficgraphwidget.cpp +++ b/src/qt/trafficgraphwidget.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include From 9db4469f004f880847b66e3f1526d520067aa152 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:23:30 +0900 Subject: [PATCH 15/45] Fix macOS boost link flags in CI workflow --- .github/workflows/release.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0827a00a30a3..109b1c601c3e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -183,14 +183,11 @@ jobs: export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib -L${BREW_PREFIX}/opt/boost/lib" export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" + export LIBS="-lboost_system -lboost_filesystem -lboost_thread -lboost_chrono $LIBS" ./autogen.sh ./configure --without-gui \ --with-boost="${BOOST_PREFIX}" \ - --with-boost-libdir="${BOOST_PREFIX}/lib" \ - --with-boost-system=boost_system \ - --with-boost-filesystem=boost_filesystem \ - --with-boost-thread=boost_thread \ - --with-boost-chrono=boost_chrono + --with-boost-libdir="${BOOST_PREFIX}/lib" make -j"$(sysctl -n hw.ncpu)" - name: Package From 1f10e4116f8d45362a76780a68e3779615672bad Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:28:55 +0900 Subject: [PATCH 16/45] Fix mingw build by using gmtime_s on Windows --- src/utiltime.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utiltime.cpp b/src/utiltime.cpp index 908791da48af..e82dd77f114b 100644 --- a/src/utiltime.cpp +++ b/src/utiltime.cpp @@ -79,7 +79,7 @@ void MilliSleep(int64_t n) std::string FormatISO8601DateTime(int64_t nTime) { struct tm ts; time_t time_val = nTime; -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(_WIN32) gmtime_s(&ts, &time_val); #else gmtime_r(&time_val, &ts); @@ -90,7 +90,7 @@ std::string FormatISO8601DateTime(int64_t nTime) { std::string FormatISO8601Date(int64_t nTime) { struct tm ts; time_t time_val = nTime; -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(_WIN32) gmtime_s(&ts, &time_val); #else gmtime_r(&time_val, &ts); @@ -101,7 +101,7 @@ std::string FormatISO8601Date(int64_t nTime) { std::string FormatISO8601Time(int64_t nTime) { struct tm ts; time_t time_val = nTime; -#ifdef _MSC_VER +#if defined(_MSC_VER) || defined(_WIN32) gmtime_s(&ts, &time_val); #else gmtime_r(&time_val, &ts); From 368bd8392f20c98902213259e8d215d7b92f1370 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:36:53 +0900 Subject: [PATCH 17/45] Fix macOS configure by removing forced global boost LIBS --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 109b1c601c3e..1cdc605dfe88 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -183,7 +183,6 @@ jobs: export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib -L${BREW_PREFIX}/opt/boost/lib" export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" - export LIBS="-lboost_system -lboost_filesystem -lboost_thread -lboost_chrono $LIBS" ./autogen.sh ./configure --without-gui \ --with-boost="${BOOST_PREFIX}" \ From 8d972f81fd1b82b796e9170430e72c66e4a7168d Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:49:19 +0900 Subject: [PATCH 18/45] Enable Windows Qt builds and strip release binaries --- .github/workflows/release.yml | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1cdc605dfe88..31e16122fdd8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,6 +49,7 @@ jobs: TAG="${RELEASE_TAG}" mkdir -p dist cp src/xpchaind src/xpchain-cli src/xpchain-tx src/qt/xpchain-qt dist/ + strip dist/xpchaind dist/xpchain-cli dist/xpchain-tx dist/xpchain-qt || true tar -C dist -czf "xpchain-${TAG}-linux-x86_64.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt - name: Upload artifact @@ -81,26 +82,22 @@ jobs: - name: Build depends (x86_64-w64-mingw32) run: | cd depends - make HOST=x86_64-w64-mingw32 NO_QT=1 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" + make HOST=x86_64-w64-mingw32 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" - name: Configure and build run: | ./autogen.sh - CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/ --without-gui + CONFIG_SITE=$PWD/depends/x86_64-w64-mingw32/share/config.site ./configure --prefix=/ make -j"$(nproc)" - name: Package run: | TAG="${RELEASE_TAG}" mkdir -p dist - cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe dist/ - if [ -f src/qt/xpchain-qt.exe ]; then cp src/qt/xpchain-qt.exe dist/; fi + cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe src/qt/xpchain-qt.exe dist/ + x86_64-w64-mingw32-strip dist/xpchaind.exe dist/xpchain-cli.exe dist/xpchain-tx.exe dist/xpchain-qt.exe || true cd dist - if [ -f xpchain-qt.exe ]; then - zip -9 "../xpchain-${TAG}-win64.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe - else - zip -9 "../xpchain-${TAG}-win64.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe - fi + zip -9 "../xpchain-${TAG}-win64.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe - name: Upload artifact uses: actions/upload-artifact@v4 @@ -132,26 +129,22 @@ jobs: - name: Build depends (i686-w64-mingw32) run: | cd depends - make HOST=i686-w64-mingw32 NO_QT=1 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" + make HOST=i686-w64-mingw32 FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" - name: Configure and build run: | ./autogen.sh - CONFIG_SITE=$PWD/depends/i686-w64-mingw32/share/config.site ./configure --prefix=/ --without-gui + CONFIG_SITE=$PWD/depends/i686-w64-mingw32/share/config.site ./configure --prefix=/ make -j"$(nproc)" - name: Package run: | TAG="${RELEASE_TAG}" mkdir -p dist - cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe dist/ - if [ -f src/qt/xpchain-qt.exe ]; then cp src/qt/xpchain-qt.exe dist/; fi + cp src/xpchaind.exe src/xpchain-cli.exe src/xpchain-tx.exe src/qt/xpchain-qt.exe dist/ + i686-w64-mingw32-strip dist/xpchaind.exe dist/xpchain-cli.exe dist/xpchain-tx.exe dist/xpchain-qt.exe || true cd dist - if [ -f xpchain-qt.exe ]; then - zip -9 "../xpchain-${TAG}-win32.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe - else - zip -9 "../xpchain-${TAG}-win32.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe - fi + zip -9 "../xpchain-${TAG}-win32.zip" xpchaind.exe xpchain-cli.exe xpchain-tx.exe xpchain-qt.exe - name: Upload artifact uses: actions/upload-artifact@v4 From 3c662b1cea1f944c92c190a76d5b4299485814a8 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 14:58:48 +0900 Subject: [PATCH 19/45] Stabilize macOS CI configure flags --- .github/workflows/release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 31e16122fdd8..47089efd99f1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -178,7 +178,9 @@ jobs: export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" ./autogen.sh ./configure --without-gui \ - --with-boost="${BOOST_PREFIX}" \ + --disable-tests \ + --disable-bench \ + --with-incompatible-bdb \ --with-boost-libdir="${BOOST_PREFIX}/lib" make -j"$(sysctl -n hw.ncpu)" From eec70c5f14a479cc0be080fadd25926b851dbcf1 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 15:01:57 +0900 Subject: [PATCH 20/45] Fix macOS boost lib detection in CI --- .github/workflows/release.yml | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 47089efd99f1..9cc57b90f532 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -173,7 +173,18 @@ jobs: export BOOST_ROOT="${BOOST_PREFIX}" export BOOST_INCLUDEDIR="${BOOST_PREFIX}/include" export BOOST_LIBRARYDIR="${BOOST_PREFIX}/lib" - export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib -L${BREW_PREFIX}/opt/boost/lib" + if ls "${BOOST_PREFIX}/lib"/libboost_system-mt* >/dev/null 2>&1; then + BOOST_SYSTEM_LIB="boost_system-mt" + BOOST_FILESYSTEM_LIB="boost_filesystem-mt" + BOOST_THREAD_LIB="boost_thread-mt" + BOOST_CHRONO_LIB="boost_chrono-mt" + else + BOOST_SYSTEM_LIB="boost_system" + BOOST_FILESYSTEM_LIB="boost_filesystem" + BOOST_THREAD_LIB="boost_thread" + BOOST_CHRONO_LIB="boost_chrono" + fi + export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib" export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" ./autogen.sh @@ -181,7 +192,11 @@ jobs: --disable-tests \ --disable-bench \ --with-incompatible-bdb \ - --with-boost-libdir="${BOOST_PREFIX}/lib" + --with-boost-libdir="${BOOST_PREFIX}/lib" \ + --with-boost-system="${BOOST_SYSTEM_LIB}" \ + --with-boost-filesystem="${BOOST_FILESYSTEM_LIB}" \ + --with-boost-thread="${BOOST_THREAD_LIB}" \ + --with-boost-chrono="${BOOST_CHRONO_LIB}" make -j"$(sysctl -n hw.ncpu)" - name: Package From 3cbc25c0c1eef91770a638734116e4d4fc146454 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 15:05:27 +0900 Subject: [PATCH 21/45] Enable macOS GUI build in release workflow --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9cc57b90f532..a58ccdbbcf1e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -188,7 +188,7 @@ jobs: export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" ./autogen.sh - ./configure --without-gui \ + ./configure --with-gui=qt5 \ --disable-tests \ --disable-bench \ --with-incompatible-bdb \ From b95401f1aeb1cbff47efd9bb18ea54768072217d Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 15:10:08 +0900 Subject: [PATCH 22/45] Fix Qt 5.9.6 mingw build by including limits --- depends/packages/qt.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index d81ac6229f36..8b16f61fc200 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -122,6 +122,8 @@ define $(package)_preprocess_cmds sed -i.old "s|updateqm.commands = \$$$$\$$$$LRELEASE|updateqm.commands = $($(package)_extract_dir)/qttools/bin/lrelease|" qttranslations/translations/translations.pro && \ sed -i.old "/updateqm.depends =/d" qttranslations/translations/translations.pro && \ sed -i.old "s/src_plugins.depends = src_sql src_network/src_plugins.depends = src_network/" qtbase/src/src.pro && \ + sed -i.old '/#include /a\ +\#include ' qtbase/src/corelib/tools/qbytearraymatcher.h && \ sed -i.old "s|X11/extensions/XIproto.h|X11/X.h|" qtbase/src/plugins/platforms/xcb/qxcbxsettings.cpp && \ sed -i.old 's/if \[ "$$$$XPLATFORM_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/if \[ "$$$$BUILD_ON_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/' qtbase/configure && \ sed -i.old 's/CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, 0)/CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, kCGMouseButtonLeft)/' qtbase/src/plugins/platforms/cocoa/qcocoacursor.mm && \ From 00b490aedabbc7311ac3536f3d287b85cf0cef59 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 15:18:32 +0900 Subject: [PATCH 23/45] Adjust macOS boost detection to use boost prefix --- .github/workflows/release.yml | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a58ccdbbcf1e..2291ad617e53 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -173,17 +173,7 @@ jobs: export BOOST_ROOT="${BOOST_PREFIX}" export BOOST_INCLUDEDIR="${BOOST_PREFIX}/include" export BOOST_LIBRARYDIR="${BOOST_PREFIX}/lib" - if ls "${BOOST_PREFIX}/lib"/libboost_system-mt* >/dev/null 2>&1; then - BOOST_SYSTEM_LIB="boost_system-mt" - BOOST_FILESYSTEM_LIB="boost_filesystem-mt" - BOOST_THREAD_LIB="boost_thread-mt" - BOOST_CHRONO_LIB="boost_chrono-mt" - else - BOOST_SYSTEM_LIB="boost_system" - BOOST_FILESYSTEM_LIB="boost_filesystem" - BOOST_THREAD_LIB="boost_thread" - BOOST_CHRONO_LIB="boost_chrono" - fi + export BOOST_LDFLAGS="-L${BOOST_PREFIX}/lib" export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib" export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" @@ -192,11 +182,8 @@ jobs: --disable-tests \ --disable-bench \ --with-incompatible-bdb \ - --with-boost-libdir="${BOOST_PREFIX}/lib" \ - --with-boost-system="${BOOST_SYSTEM_LIB}" \ - --with-boost-filesystem="${BOOST_FILESYSTEM_LIB}" \ - --with-boost-thread="${BOOST_THREAD_LIB}" \ - --with-boost-chrono="${BOOST_CHRONO_LIB}" + --with-boost="${BOOST_PREFIX}" \ + --with-boost-libdir="${BOOST_PREFIX}/lib" make -j"$(sysctl -n hw.ncpu)" - name: Package From f8d2ed7e29105bf7d9c07e1d3fab888e5b74029e Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 15:26:10 +0900 Subject: [PATCH 24/45] Switch DNS seed and website domain to xpchain.co.kr --- src/chainparams.cpp | 8 ++------ src/init.cpp | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index fe55bca65ffb..47203b088883 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -143,9 +143,7 @@ class CMainParams : public CChainParams { // This is fine at runtime as we'll fall back to using them as a oneshot if they don't support the // service bits we want, but we should get them updated to support all service bits wanted by any // release ASAP to avoid it where possible. - vSeeds.emplace_back("seed1.xpchain.io"); - vSeeds.emplace_back("seed2.xpchain.io"); - vSeeds.emplace_back("seed3.xpchain.io"); + vSeeds.emplace_back("seed1.xpchain.co.kr"); base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,76); base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,28); @@ -249,9 +247,7 @@ class CTestNetParams : public CChainParams { vFixedSeeds.clear(); vSeeds.clear(); // nodes with support for servicebits filtering should be at the top - vSeeds.emplace_back("seed1.xpchain.io"); - vSeeds.emplace_back("seed2.xpchain.io"); - vSeeds.emplace_back("seed3.xpchain.io"); + vSeeds.emplace_back("seed1.xpchain.co.kr"); base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,138); base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,88); diff --git a/src/init.cpp b/src/init.cpp index d1ed7ef960c1..df8c6eb3d4b1 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -530,7 +530,7 @@ void SetupServerArgs() std::string LicenseInfo() { const std::string URL_SOURCE_CODE = ""; - const std::string URL_WEBSITE = ""; + const std::string URL_WEBSITE = ""; return CopyrightHolders(strprintf(_("Copyright (C) %i-%i"), 2018, COPYRIGHT_YEAR) + " ") + "\n" + "\n" + From 18d52320a4463b1818c1bbf7caad16730828ea21 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 15:28:48 +0900 Subject: [PATCH 25/45] Update source code URL to community core repository --- src/init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init.cpp b/src/init.cpp index df8c6eb3d4b1..c0376561434d 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -529,7 +529,7 @@ void SetupServerArgs() std::string LicenseInfo() { - const std::string URL_SOURCE_CODE = ""; + const std::string URL_SOURCE_CODE = ""; const std::string URL_WEBSITE = ""; return CopyrightHolders(strprintf(_("Copyright (C) %i-%i"), 2018, COPYRIGHT_YEAR) + " ") + "\n" + From de8a61273326e36d27c9e70933c53ff3c9b33c2b Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 15:32:00 +0900 Subject: [PATCH 26/45] Allow macOS builds when boost_system is header-only --- build-aux/m4/ax_boost_system.m4 | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/build-aux/m4/ax_boost_system.m4 b/build-aux/m4/ax_boost_system.m4 index 1c05450cbe1d..1476a0189fa5 100644 --- a/build-aux/m4/ax_boost_system.m4 +++ b/build-aux/m4/ax_boost_system.m4 @@ -109,11 +109,19 @@ AC_DEFUN([AX_BOOST_SYSTEM], fi if test "x$ax_lib" = "x"; then - AC_MSG_ERROR(Could not find a version of the boost_system library!) + dnl Boost.System can be header-only in newer Boost versions. + dnl If no library is found, continue without -lboost_system. + AC_MSG_WARN([Could not find a version of the boost_system library; continuing without it]) + BOOST_SYSTEM_LIB="" + AC_SUBST(BOOST_SYSTEM_LIB) + link_system="yes" + fi + if test "x$link_system" = "xno"; then + AC_MSG_WARN([Could not link against $ax_lib; continuing without boost_system library]) + BOOST_SYSTEM_LIB="" + AC_SUBST(BOOST_SYSTEM_LIB) + link_system="yes" fi - if test "x$link_system" = "xno"; then - AC_MSG_ERROR(Could not link against $ax_lib !) - fi fi CPPFLAGS="$CPPFLAGS_SAVED" From fb61f069df5b5ad510d4f256888d1e3c3fc4e9ea Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 15:36:55 +0900 Subject: [PATCH 27/45] Replace xpchain.io references with xpchain.co.kr --- README.md | 4 ++-- doc/README.md | 2 +- doc/man/xpchain-cli.1 | 2 +- doc/man/xpchain-qt.1 | 2 +- doc/man/xpchain-tx.1 | 2 +- doc/man/xpchaind.1 | 2 +- doc/release-notes.md | 2 +- doc/release-process.md | 2 +- doc/xpchain-release-notes/xpchain-release-notes-0.17.0-2.md | 2 +- doc/xpchain-release-notes/xpchain-release-notes-0.17.0-3.md | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 048fc55c41de..ce674a6b7717 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ XPChain Core integration/staging tree [![Build Status](https://travis-ci.org/xpc-wg/xpchain.svg?branch=master)](https://travis-ci.org/xpc-wg/xpchain) -https://www.xpchain.io/ +https://www.xpchain.co.kr/ What is XPChain? ---------------- @@ -18,7 +18,7 @@ XPChain Core is the name of open source software which enables the use of this currency. For more information, read the [original whitepaper](https://www.xpchain.io/?loc=lnkwhitepaper). +the XPChain Core software, see https://bitcoincore.org/en/download/, --> read the [original whitepaper](https://www.xpchain.co.kr/?loc=lnkwhitepaper). For Exchanges ------- diff --git a/doc/README.md b/doc/README.md index 3641ca888f06..270ecf6afb59 100644 --- a/doc/README.md +++ b/doc/README.md @@ -5,7 +5,7 @@ Setup --------------------- XPChain Core is the original XPChain client and it builds the backbone of the network. It downloads and, by default, stores the entire history of XPChain transactions (which is currently more than 100 GBs); depending on the speed of your computer and network connection, the synchronization process can take anywhere from a few hours to a day or more. -To download XPChain Core, visit the [official website](https://www.xpchain.io/). +To download XPChain Core, visit the [official website](https://www.xpchain.co.kr/). Running --------------------- diff --git a/doc/man/xpchain-cli.1 b/doc/man/xpchain-cli.1 index 6b3435c97eb2..5884eddd4b7c 100644 --- a/doc/man/xpchain-cli.1 +++ b/doc/man/xpchain-cli.1 @@ -105,7 +105,7 @@ Copyright (C) 2018-2019 The XPChain Core developers Copyright (C) 2009-2019 The Bitcoin Core developers Please contribute if you find XPChain Core useful. Visit - for further information about the software. + for further information about the software. The source code is available from . This is experimental software. diff --git a/doc/man/xpchain-qt.1 b/doc/man/xpchain-qt.1 index 33bad8f74795..37ce73a95bbb 100644 --- a/doc/man/xpchain-qt.1 +++ b/doc/man/xpchain-qt.1 @@ -613,7 +613,7 @@ Copyright (C) 2018-2019 The XPChain Core developers Copyright (C) 2009-2019 The Bitcoin Core developers Please contribute if you find XPChain Core useful. Visit - for further information about the software. + for further information about the software. The source code is available from . This is experimental software. diff --git a/doc/man/xpchain-tx.1 b/doc/man/xpchain-tx.1 index 5c25ec859e20..0213aa327e07 100644 --- a/doc/man/xpchain-tx.1 +++ b/doc/man/xpchain-tx.1 @@ -109,7 +109,7 @@ Copyright (C) 2018-2019 The XPChain Core developers Copyright (C) 2009-2019 The Bitcoin Core developers Please contribute if you find XPChain Core useful. Visit - for further information about the software. + for further information about the software. The source code is available from . This is experimental software. diff --git a/doc/man/xpchaind.1 b/doc/man/xpchaind.1 index 7f2358e0374b..145a52f85008 100644 --- a/doc/man/xpchaind.1 +++ b/doc/man/xpchaind.1 @@ -587,7 +587,7 @@ Copyright (C) 2018-2019 The XPChain Core developers Copyright (C) 2009-2019 The Bitcoin Core developers Please contribute if you find XPChain Core useful. Visit - for further information about the software. + for further information about the software. The source code is available from . This is experimental software. diff --git a/doc/release-notes.md b/doc/release-notes.md index d41fdb16ece9..3bf43495a691 100644 --- a/doc/release-notes.md +++ b/doc/release-notes.md @@ -3,7 +3,7 @@ release-notes at release time) XPChain Core version *version* is now available from: - + This is a new minor version release, including various bugfixes and performance improvements. diff --git a/doc/release-process.md b/doc/release-process.md index ac3dacd82055..c3b68490cfe4 100644 --- a/doc/release-process.md +++ b/doc/release-process.md @@ -27,7 +27,7 @@ Before every major release: Finally: * Announce the release: - - Update xpchain.io + - Update xpchain.co.kr - Official announcements in Discord, Twitter, etc. - Archive release notes for the new version to `doc/release-notes/` (branch `master` and branch of the release) - Create a [new GitHub release](https://github.com/xpc-wg/xpchain/releases/new) with a link to the archived release notes. diff --git a/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-2.md b/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-2.md index 409f95402855..15ecbb2f5fd1 100644 --- a/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-2.md +++ b/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-2.md @@ -1,6 +1,6 @@ XPChain Core version 0.17.0-2 is now available from: - + This is a new minor version release, with various bugfixes and translation updates. diff --git a/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-3.md b/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-3.md index 600317576225..77f351f4e6d3 100644 --- a/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-3.md +++ b/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-3.md @@ -1,6 +1,6 @@ XPChain Core version 0.17.0-3 is now available from: - + This is a new minor version release, including various bugfixes and performance improvements. From 31d4f1291fc1c02c75e1afa0117e16bcd9d8515f Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 16:00:57 +0900 Subject: [PATCH 28/45] Fix macOS build by including list in validation.cpp --- src/validation.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/validation.cpp b/src/validation.cpp index 9db9c051c4fa..c9d730a25adb 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -42,6 +42,7 @@ #include #include +#include #include #include From 40a57bc3b4b63537c4dbac4076b90647c981b869 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 16:10:15 +0900 Subject: [PATCH 29/45] Fix macOS compile by including list in validation.h --- src/validation.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/validation.h b/src/validation.h index 20ddb21a47b2..4072a4b4a150 100644 --- a/src/validation.h +++ b/src/validation.h @@ -21,6 +21,7 @@ #include #include +#include #include #include #include From 005506196de60f64996eefebd56420889eb51f77 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 16:18:32 +0900 Subject: [PATCH 30/45] Fix filesystem basename usage for modern boost --- src/dbwrapper.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dbwrapper.cpp b/src/dbwrapper.cpp index f5fb71580004..e0e55dcefe2c 100644 --- a/src/dbwrapper.cpp +++ b/src/dbwrapper.cpp @@ -115,7 +115,7 @@ static leveldb::Options GetOptions(size_t nCacheSize) } CDBWrapper::CDBWrapper(const fs::path& path, size_t nCacheSize, bool fMemory, bool fWipe, bool obfuscate) - : m_name(fs::basename(path)) + : m_name(path.filename().string()) { penv = nullptr; readoptions.verify_checksums = true; From a0aab21409a18f43a0127d85a7dbbec74219c07b Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 16:27:37 +0900 Subject: [PATCH 31/45] Update wallet db filesystem calls for modern boost --- src/wallet/db.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/db.cpp b/src/wallet/db.cpp index 949b296dd826..54f1624c2ab9 100644 --- a/src/wallet/db.cpp +++ b/src/wallet/db.cpp @@ -326,7 +326,7 @@ bool BerkeleyBatch::VerifyEnvironment(const fs::path& file_path, std::string& er LogPrintf("Using wallet %s\n", walletFile); // Wallet file must be a plain filename without a directory - if (walletFile != fs::basename(walletFile) + fs::extension(walletFile)) + if (fs::path(walletFile).filename().string() != walletFile) { errorStr = strprintf(_("Wallet %s resides outside wallet directory %s"), walletFile, walletDir.string()); return false; @@ -779,7 +779,7 @@ bool BerkeleyDatabase::Backup(const std::string& strDest) return false; } - fs::copy_file(pathSrc, pathDest, fs::copy_option::overwrite_if_exists); + fs::copy_file(pathSrc, pathDest, fs::copy_options::overwrite_existing); LogPrintf("copied %s to %s\n", strFile, pathDest.string()); return true; } catch (const fs::filesystem_error& e) { From 56da0fc32c82e42d9d3cbd483ad30768574378df Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 16:43:36 +0900 Subject: [PATCH 32/45] Pin macOS protobuf to v21 for C++11 compatibility --- .github/workflows/release.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2291ad617e53..c2caf2dfdb53 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -164,19 +164,21 @@ jobs: - name: Install dependencies run: | brew update - brew install autoconf automake libtool pkg-config openssl@3 libevent boost berkeley-db@4 miniupnpc protobuf qt@5 qrencode + brew install autoconf automake libtool pkg-config openssl@3 libevent boost berkeley-db@4 miniupnpc protobuf@21 qt@5 qrencode - name: Build run: | BREW_PREFIX="$(brew --prefix)" BOOST_PREFIX="$(brew --prefix boost)" + PROTOBUF_PREFIX="$(brew --prefix protobuf@21)" export BOOST_ROOT="${BOOST_PREFIX}" export BOOST_INCLUDEDIR="${BOOST_PREFIX}/include" export BOOST_LIBRARYDIR="${BOOST_PREFIX}/lib" export BOOST_LDFLAGS="-L${BOOST_PREFIX}/lib" - export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib" - export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include" - export PKG_CONFIG_PATH="${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" + export PATH="${PROTOBUF_PREFIX}/bin:${PATH}" + export LDFLAGS="-L${BREW_PREFIX}/opt/openssl@3/lib -L${BREW_PREFIX}/opt/berkeley-db@4/lib -L${PROTOBUF_PREFIX}/lib" + export CPPFLAGS="-I${BREW_PREFIX}/opt/openssl@3/include -I${BREW_PREFIX}/opt/berkeley-db@4/include -I${BREW_PREFIX}/opt/boost/include -I${PROTOBUF_PREFIX}/include" + export PKG_CONFIG_PATH="${PROTOBUF_PREFIX}/lib/pkgconfig:${BREW_PREFIX}/opt/openssl@3/lib/pkgconfig:${BREW_PREFIX}/opt/qt@5/lib/pkgconfig" ./autogen.sh ./configure --with-gui=qt5 \ --disable-tests \ From e04b40186b990b2381dc5eb973f8b7f0eaa14011 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 16:53:08 +0900 Subject: [PATCH 33/45] Fix macOS objc_msgSend calls for modern Xcode --- src/qt/macdockiconhandler.mm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/qt/macdockiconhandler.mm b/src/qt/macdockiconhandler.mm index b9ad191da774..8c063254c4be 100644 --- a/src/qt/macdockiconhandler.mm +++ b/src/qt/macdockiconhandler.mm @@ -16,9 +16,11 @@ static MacDockIconHandler *s_instance = nullptr; -bool dockClickHandler(id self,SEL _cmd,...) { +bool dockClickHandler(id self, SEL _cmd, id sender, bool hasVisibleWindows) { Q_UNUSED(self) Q_UNUSED(_cmd) + Q_UNUSED(sender) + Q_UNUSED(hasVisibleWindows) s_instance->handleDockIconClickEvent(); @@ -28,16 +30,18 @@ bool dockClickHandler(id self,SEL _cmd,...) { void setupDockClickHandler() { Class cls = objc_getClass("NSApplication"); - id appInst = objc_msgSend((id)cls, sel_registerName("sharedApplication")); + id (*objc_msgSend_id)(id, SEL) = reinterpret_cast(objc_msgSend); + id appInst = objc_msgSend_id((id)cls, sel_registerName("sharedApplication")); if (appInst != nullptr) { - id delegate = objc_msgSend(appInst, sel_registerName("delegate")); - Class delClass = (Class)objc_msgSend(delegate, sel_registerName("class")); + id delegate = objc_msgSend_id(appInst, sel_registerName("delegate")); + if (delegate == nullptr) return; + Class delClass = (Class)objc_msgSend_id(delegate, sel_registerName("class")); SEL shouldHandle = sel_registerName("applicationShouldHandleReopen:hasVisibleWindows:"); if (class_getInstanceMethod(delClass, shouldHandle)) - class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:"); + class_replaceMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:@B"); else - class_addMethod(delClass, shouldHandle, (IMP)dockClickHandler,"B@:"); + class_addMethod(delClass, shouldHandle, (IMP)dockClickHandler, "B@:@B"); } } From a9d2ca66858668a9fe400f0729fb4f2f0ac93712 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 17:35:34 +0900 Subject: [PATCH 34/45] Add macOS DMG packaging to release workflow --- .github/workflows/release.yml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c2caf2dfdb53..e266a9e96a74 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -193,8 +193,14 @@ jobs: TAG="${RELEASE_TAG}" mkdir -p dist cp src/xpchaind src/xpchain-cli src/xpchain-tx dist/ - if [ -f src/qt/xpchain-qt ]; then cp src/qt/xpchain-qt dist/; fi - if [ -f dist/xpchain-qt ]; then + if [ -f src/qt/xpchain-qt ]; then + cp src/qt/xpchain-qt dist/ + make appbundle + QT5_PREFIX="$(brew --prefix qt@5)" + "${QT5_PREFIX}/bin/macdeployqt" XPChain-Qt.app -verbose=1 + mkdir -p dmg-src + cp -R XPChain-Qt.app dmg-src/ + hdiutil create -volname "XPChain-Qt" -srcfolder dmg-src -ov -format UDZO "xpchain-${TAG}-macos.dmg" tar -C dist -czf "xpchain-${TAG}-macos.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt else tar -C dist -czf "xpchain-${TAG}-macos.tar.gz" xpchaind xpchain-cli xpchain-tx @@ -204,7 +210,9 @@ jobs: uses: actions/upload-artifact@v4 with: name: macos - path: xpchain-*-macos.tar.gz + path: | + xpchain-*-macos.tar.gz + xpchain-*-macos.dmg release: name: Publish GitHub Release @@ -219,7 +227,7 @@ jobs: - name: Flatten assets run: | mkdir -p out - find release-assets -type f \( -name '*.zip' -o -name '*.tar.gz' \) -exec cp {} out/ \; + find release-assets -type f \( -name '*.zip' -o -name '*.tar.gz' -o -name '*.dmg' \) -exec cp {} out/ \; ls -lah out - name: Create release From af192a0a4f422ad9b870b202c87e86d11a724c73 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 19:10:59 +0900 Subject: [PATCH 35/45] Improve macOS DMG packaging layout and app signing --- .github/workflows/release.yml | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e266a9e96a74..56ca1507c0ba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -164,7 +164,7 @@ jobs: - name: Install dependencies run: | brew update - brew install autoconf automake libtool pkg-config openssl@3 libevent boost berkeley-db@4 miniupnpc protobuf@21 qt@5 qrencode + brew install autoconf automake libtool pkg-config openssl@3 libevent boost berkeley-db@4 miniupnpc protobuf@21 qt@5 qrencode create-dmg - name: Build run: | @@ -198,9 +198,23 @@ jobs: make appbundle QT5_PREFIX="$(brew --prefix qt@5)" "${QT5_PREFIX}/bin/macdeployqt" XPChain-Qt.app -verbose=1 + # Re-sign after deployment to avoid broken signature state on user machines. + codesign --force --deep --sign - --timestamp=none XPChain-Qt.app + codesign --verify --deep --strict --verbose=2 XPChain-Qt.app mkdir -p dmg-src - cp -R XPChain-Qt.app dmg-src/ - hdiutil create -volname "XPChain-Qt" -srcfolder dmg-src -ov -format UDZO "xpchain-${TAG}-macos.dmg" + ditto XPChain-Qt.app dmg-src/XPChain-Qt.app + ln -s /Applications dmg-src/Applications + create-dmg \ + --volname "XPChain-Qt" \ + --window-pos 200 120 \ + --window-size 560 360 \ + --icon-size 120 \ + --icon "XPChain-Qt.app" 140 170 \ + --icon "Applications" 420 170 \ + --hide-extension "XPChain-Qt.app" \ + --app-drop-link 420 170 \ + "xpchain-${TAG}-macos.dmg" \ + "dmg-src" tar -C dist -czf "xpchain-${TAG}-macos.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt else tar -C dist -czf "xpchain-${TAG}-macos.tar.gz" xpchaind xpchain-cli xpchain-tx From 1546412a54dfb208b483cd1004670ec62c298c74 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 19:36:50 +0900 Subject: [PATCH 36/45] Fix wallet backup copy for older Boost filesystem --- src/wallet/db.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/wallet/db.cpp b/src/wallet/db.cpp index 54f1624c2ab9..76c2724dcb5e 100644 --- a/src/wallet/db.cpp +++ b/src/wallet/db.cpp @@ -779,7 +779,10 @@ bool BerkeleyDatabase::Backup(const std::string& strDest) return false; } - fs::copy_file(pathSrc, pathDest, fs::copy_options::overwrite_existing); + if (fs::exists(pathDest)) { + fs::remove(pathDest); + } + fs::copy_file(pathSrc, pathDest); LogPrintf("copied %s to %s\n", strFile, pathDest.string()); return true; } catch (const fs::filesystem_error& e) { From 5e306dd4152fb565d8cefd59dbb21d7bf1f44c21 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 19:41:14 +0900 Subject: [PATCH 37/45] Bundle missing Boost dylibs in macOS app package --- .github/workflows/release.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 56ca1507c0ba..95b7175b502b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -198,6 +198,20 @@ jobs: make appbundle QT5_PREFIX="$(brew --prefix qt@5)" "${QT5_PREFIX}/bin/macdeployqt" XPChain-Qt.app -verbose=1 + BOOST_LIBDIR="$(brew --prefix boost)/lib" + APP_FW_DIR="XPChain-Qt.app/Contents/Frameworks" + # macdeployqt may miss transitive non-Qt dylibs (e.g. libboost_atomic). + for lib in libboost_atomic.dylib libboost_thread.dylib libboost_filesystem.dylib libboost_chrono.dylib; do + if [ -f "${BOOST_LIBDIR}/${lib}" ]; then + cp -f "${BOOST_LIBDIR}/${lib}" "${APP_FW_DIR}/${lib}" + install_name_tool -id "@loader_path/${lib}" "${APP_FW_DIR}/${lib}" || true + fi + done + install_name_tool -change "$(brew --prefix boost)/lib/libboost_atomic.dylib" "@loader_path/libboost_atomic.dylib" "${APP_FW_DIR}/libboost_thread.dylib" || true + install_name_tool -change "$(brew --prefix boost)/lib/libboost_chrono.dylib" "@loader_path/libboost_chrono.dylib" "${APP_FW_DIR}/libboost_thread.dylib" || true + install_name_tool -change "$(brew --prefix boost)/lib/libboost_thread.dylib" "@executable_path/../Frameworks/libboost_thread.dylib" "XPChain-Qt.app/Contents/MacOS/XPChain-Qt" || true + install_name_tool -change "$(brew --prefix boost)/lib/libboost_filesystem.dylib" "@executable_path/../Frameworks/libboost_filesystem.dylib" "XPChain-Qt.app/Contents/MacOS/XPChain-Qt" || true + install_name_tool -change "$(brew --prefix boost)/lib/libboost_chrono.dylib" "@executable_path/../Frameworks/libboost_chrono.dylib" "XPChain-Qt.app/Contents/MacOS/XPChain-Qt" || true # Re-sign after deployment to avoid broken signature state on user machines. codesign --force --deep --sign - --timestamp=none XPChain-Qt.app codesign --verify --deep --strict --verbose=2 XPChain-Qt.app From 14576d2834a9778cd57c13393a1c6c6665166149 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 19:56:15 +0900 Subject: [PATCH 38/45] Bundle all Boost dylibs for macOS app runtime --- .github/workflows/release.yml | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 95b7175b502b..1880571cd9fb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -199,19 +199,30 @@ jobs: QT5_PREFIX="$(brew --prefix qt@5)" "${QT5_PREFIX}/bin/macdeployqt" XPChain-Qt.app -verbose=1 BOOST_LIBDIR="$(brew --prefix boost)/lib" + APP_BIN="XPChain-Qt.app/Contents/MacOS/XPChain-Qt" APP_FW_DIR="XPChain-Qt.app/Contents/Frameworks" - # macdeployqt may miss transitive non-Qt dylibs (e.g. libboost_atomic). - for lib in libboost_atomic.dylib libboost_thread.dylib libboost_filesystem.dylib libboost_chrono.dylib; do - if [ -f "${BOOST_LIBDIR}/${lib}" ]; then - cp -f "${BOOST_LIBDIR}/${lib}" "${APP_FW_DIR}/${lib}" - install_name_tool -id "@loader_path/${lib}" "${APP_FW_DIR}/${lib}" || true - fi + # macdeployqt may miss transitive non-Qt dylibs. Bundle all Boost dylibs and rewrite install names. + for libpath in "${BOOST_LIBDIR}"/libboost_*.dylib; do + [ -f "${libpath}" ] || continue + cp -f "${libpath}" "${APP_FW_DIR}/" + done + + for dylib in "${APP_FW_DIR}"/libboost_*.dylib; do + [ -f "${dylib}" ] || continue + base="$(basename "${dylib}")" + install_name_tool -id "@loader_path/${base}" "${dylib}" || true + otool -L "${dylib}" | awk '/libboost_.*\\.dylib/{print $1}' | while read -r dep; do + [ -n "${dep}" ] || continue + dep_base="$(basename "${dep}")" + install_name_tool -change "${dep}" "@loader_path/${dep_base}" "${dylib}" || true + done + done + + otool -L "${APP_BIN}" | awk '/libboost_.*\\.dylib/{print $1}' | while read -r dep; do + [ -n "${dep}" ] || continue + dep_base="$(basename "${dep}")" + install_name_tool -change "${dep}" "@executable_path/../Frameworks/${dep_base}" "${APP_BIN}" || true done - install_name_tool -change "$(brew --prefix boost)/lib/libboost_atomic.dylib" "@loader_path/libboost_atomic.dylib" "${APP_FW_DIR}/libboost_thread.dylib" || true - install_name_tool -change "$(brew --prefix boost)/lib/libboost_chrono.dylib" "@loader_path/libboost_chrono.dylib" "${APP_FW_DIR}/libboost_thread.dylib" || true - install_name_tool -change "$(brew --prefix boost)/lib/libboost_thread.dylib" "@executable_path/../Frameworks/libboost_thread.dylib" "XPChain-Qt.app/Contents/MacOS/XPChain-Qt" || true - install_name_tool -change "$(brew --prefix boost)/lib/libboost_filesystem.dylib" "@executable_path/../Frameworks/libboost_filesystem.dylib" "XPChain-Qt.app/Contents/MacOS/XPChain-Qt" || true - install_name_tool -change "$(brew --prefix boost)/lib/libboost_chrono.dylib" "@executable_path/../Frameworks/libboost_chrono.dylib" "XPChain-Qt.app/Contents/MacOS/XPChain-Qt" || true # Re-sign after deployment to avoid broken signature state on user machines. codesign --force --deep --sign - --timestamp=none XPChain-Qt.app codesign --verify --deep --strict --verbose=2 XPChain-Qt.app From eacd3dac17b10aa4056ee9ffa9fb234ded521c22 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 20:51:07 +0900 Subject: [PATCH 39/45] Bundle Linux runtime shared libs in release artifact --- .github/workflows/release.yml | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1880571cd9fb..ddfa9f95835d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,7 +36,8 @@ jobs: libboost-system-dev libboost-filesystem-dev libboost-chrono-dev \ libboost-test-dev libboost-thread-dev libdb-dev libdb++-dev \ qtbase5-dev qttools5-dev qttools5-dev-tools \ - libprotobuf-dev protobuf-compiler libqrencode-dev libminiupnpc-dev + libprotobuf-dev protobuf-compiler libqrencode-dev libminiupnpc-dev \ + patchelf - name: Build run: | @@ -47,10 +48,28 @@ jobs: - name: Package run: | TAG="${RELEASE_TAG}" - mkdir -p dist + mkdir -p dist/lib cp src/xpchaind src/xpchain-cli src/xpchain-tx src/qt/xpchain-qt dist/ strip dist/xpchaind dist/xpchain-cli dist/xpchain-tx dist/xpchain-qt || true - tar -C dist -czf "xpchain-${TAG}-linux-x86_64.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt + # Bundle non-system shared libs so runtime does not depend on host distro versions. + : > /tmp/xpc-lib-list.txt + for bin in dist/xpchaind dist/xpchain-cli dist/xpchain-tx dist/xpchain-qt; do + ldd "$bin" | awk '/=> \// {print $3}' >> /tmp/xpc-lib-list.txt + done + sort -u /tmp/xpc-lib-list.txt | while read -r lib; do + [ -n "$lib" ] || continue + case "$lib" in + /lib/*|/lib64/*) + # Keep glibc/loader from target system. + continue + ;; + esac + cp -L "$lib" "dist/lib/$(basename "$lib")" + done + for bin in dist/xpchaind dist/xpchain-cli dist/xpchain-tx dist/xpchain-qt; do + patchelf --set-rpath '$ORIGIN/lib' "$bin" + done + tar -C dist -czf "xpchain-${TAG}-linux-x86_64.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt lib - name: Upload artifact uses: actions/upload-artifact@v4 From 1db5063e68c7715cc42f956a4197c824a47b54fe Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 20:58:11 +0900 Subject: [PATCH 40/45] Switch Linux release to depends-based 4-file standalone build --- .github/workflows/release.yml | 36 +++++++++-------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ddfa9f95835d..eb675401b9fd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,44 +32,26 @@ jobs: sudo apt-get update sudo apt-get install -y \ build-essential libtool autotools-dev automake pkg-config bsdmainutils \ - python3 libssl-dev libevent-dev \ - libboost-system-dev libboost-filesystem-dev libboost-chrono-dev \ - libboost-test-dev libboost-thread-dev libdb-dev libdb++-dev \ - qtbase5-dev qttools5-dev qttools5-dev-tools \ - libprotobuf-dev protobuf-compiler libqrencode-dev libminiupnpc-dev \ - patchelf + curl git python3 + + - name: Build depends (x86_64-linux-gnu) + run: | + cd depends + make HOST=x86_64-linux-gnu FALLBACK_DOWNLOAD_PATH=https://bitcoincore.org/depends-sources -j"$(nproc)" - name: Build run: | ./autogen.sh - ./configure --with-incompatible-bdb + CONFIG_SITE=$PWD/depends/x86_64-linux-gnu/share/config.site ./configure --prefix=/ make -j"$(nproc)" - name: Package run: | TAG="${RELEASE_TAG}" - mkdir -p dist/lib + mkdir -p dist cp src/xpchaind src/xpchain-cli src/xpchain-tx src/qt/xpchain-qt dist/ strip dist/xpchaind dist/xpchain-cli dist/xpchain-tx dist/xpchain-qt || true - # Bundle non-system shared libs so runtime does not depend on host distro versions. - : > /tmp/xpc-lib-list.txt - for bin in dist/xpchaind dist/xpchain-cli dist/xpchain-tx dist/xpchain-qt; do - ldd "$bin" | awk '/=> \// {print $3}' >> /tmp/xpc-lib-list.txt - done - sort -u /tmp/xpc-lib-list.txt | while read -r lib; do - [ -n "$lib" ] || continue - case "$lib" in - /lib/*|/lib64/*) - # Keep glibc/loader from target system. - continue - ;; - esac - cp -L "$lib" "dist/lib/$(basename "$lib")" - done - for bin in dist/xpchaind dist/xpchain-cli dist/xpchain-tx dist/xpchain-qt; do - patchelf --set-rpath '$ORIGIN/lib' "$bin" - done - tar -C dist -czf "xpchain-${TAG}-linux-x86_64.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt lib + tar -C dist -czf "xpchain-${TAG}-linux-x86_64.tar.gz" xpchaind xpchain-cli xpchain-tx xpchain-qt - name: Upload artifact uses: actions/upload-artifact@v4 From 82129c4b8bb3b3282a1d4f97a3c516891c617a85 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 22:13:56 +0900 Subject: [PATCH 41/45] Add Vultr Linux node setup and troubleshooting log --- doc/linux-node-setup-log-vultr.md | 202 ++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 doc/linux-node-setup-log-vultr.md diff --git a/doc/linux-node-setup-log-vultr.md b/doc/linux-node-setup-log-vultr.md new file mode 100644 index 000000000000..b58ddf8badd7 --- /dev/null +++ b/doc/linux-node-setup-log-vultr.md @@ -0,0 +1,202 @@ +# Vultr Node Setup Log + +## 2026-02-24 - Initial Instance Provisioning + +### Purpose +- XPChain wallet/node installation test on Ubuntu desktop environment + +### Provider / Plan +- Provider: Vultr +- Plan: Shared CPU `$10/mo` +- Size: `vc2-1c-2gb` +- vCPU: `1` +- Memory: `2 GB` +- Storage: `55 GB` + +### Region / Image +- Region: `Singapore, SG` +- Marketplace App: `Ubuntu Desktop (XFCE)` +- OS: `Ubuntu 24.04` +- Marketplace variable `desktopuser`: `arnold` + +### Server Identity +- Hostname: `XPChain-Node-05` +- Label: `XPChain-Node-05` + +### Connectivity +- Instance connectivity: `Instance(s) with Public IP` +- Public IPv4: `Enabled` +- Public IPv6: `Not selected` + +### Additional Features +- VPC Network: `Disabled` +- Automatic Backups: `Disabled` +- DDoS Protection: `Disabled` +- Limited User Login: `Not enabled in this screen` +- Cloud-Init User Data: `Disabled` + +### Pending +- [ ] Deploy instance +- [ ] SSH access verification +- [ ] XPChain binaries install +- [ ] xpchaind first run and sync check +- [ ] Firewall / systemd setup +- [ ] Installation guide update for website + +## Linux Install Procedure (v0.17.0-4) + +### Release source +- Tag: `v0.17.0-4` +- Download URL: + - `https://github.com/arnoldcho/xpchain-community-core/releases/download/v0.17.0-4/xpchain-v0.17.0-4-linux-x86_64.tar.gz` + +### Installation commands +```bash +mkdir -p ~/xpchain && cd ~/xpchain +wget -O xpchain-v0.17.0-4-linux-x86_64.tar.gz \ +https://github.com/arnoldcho/xpchain-community-core/releases/download/v0.17.0-4/xpchain-v0.17.0-4-linux-x86_64.tar.gz +tar -xzf xpchain-v0.17.0-4-linux-x86_64.tar.gz +chmod +x xpchaind xpchain-cli xpchain-tx xpchain-qt +``` + +### Archive structure note +- `xpchain-v0.17.0-4-linux-x86_64.tar.gz` extracts binaries directly into current directory. +- No subdirectory is created after extraction. + +### Initial node config +```bash +mkdir -p ~/.xpchain +cat > ~/.xpchain/xpchain.conf << 'EOF' +server=1 +listen=1 +port=8798 +bind=0.0.0.0 +discover=1 +dnsseed=1 +maxconnections=64 +fallbackfee=0.11 +EOF +``` + +### Fee fallback option +- If fee estimation is unstable right after startup/sync, set a fallback fee. +- Recommended: put it in `xpchain.conf` so both daemon and wallet use it consistently. +- Temporary CLI/GUI launch examples: +```bash +./xpchaind -fallbackfee=0.11 +./xpchain-qt -fallbackfee=0.11 +``` + +### Start and verify +```bash +./xpchaind -daemon +./xpchain-cli getblockchaininfo +./xpchain-cli getnetworkinfo +./xpchain-cli getconnectioncount +``` + +### Qt launch (desktop environment) +```bash +./xpchain-qt +``` + +### Firewall +```bash +sudo ufw allow 8798/tcp +sudo ufw status +``` + +### Notes +- This section is a baseline procedure and will be updated if runtime/install issues are found. + +## Troubleshooting + +### `./xpchaind: error while loading shared libraries: libboost_filesystem.so.1.74.0` + +Cause: +- Current Linux release artifact was built on Ubuntu 22.04 toolchain and linked against Boost `1.74`. +- Ubuntu 24.04 default Boost runtime is newer, so `libboost_filesystem.so.1.74.0` may not exist. + +Current guidance: +1. Preferred for immediate test: + - Use Ubuntu `22.04` server image for runtime compatibility with current artifact. +2. Preferred long-term release fix: + - Rebuild Linux artifact targeting Ubuntu `24.04` (or package with portable/static strategy). +3. Quick diagnostics command: +```bash +ldd ./xpchaind | grep -E 'not found|boost' +``` + +## Validation Result (2026-02-24) + +### Runtime status +- `xpchaind` startup: `OK` +- `xpchain-cli getblockchaininfo`: `OK` +- `xpchain-cli getnetworkinfo`: `OK` +- `xpchain-cli getconnectioncount`: `7` (at capture time) + +### Sync snapshot +- `chain`: `main` +- `blocks`: `3368` (sync in progress) +- `headers`: `424000` +- `initialblockdownload`: `true` + +### Notes +- Linux standalone (4-file) runtime test passed on current test server. +- Node is syncing and network connections are established. + +## Basic CLI Commands + +```bash +# 노드 기본 상태 +./xpchain-cli getblockchaininfo +./xpchain-cli getnetworkinfo +./xpchain-cli getconnectioncount + +# 지갑 상태 +./xpchain-cli getwalletinfo +./xpchain-cli getbalances + +# 블록/트랜잭션 조회 +./xpchain-cli getbestblockhash +./xpchain-cli getblockcount +./xpchain-cli getblockhash +./xpchain-cli getblock +./xpchain-cli getrawtransaction 1 + +# 주소/입출금 +./xpchain-cli getnewaddress +./xpchain-cli getreceivedbyaddress
+./xpchain-cli sendtoaddress
+``` + +## Incident Response Commands + +```bash +# 프로세스 확인 +ps -ef | grep xpchaind | grep -v grep +pgrep -a xpchaind + +# 서비스 사용 시 상태/로그 +sudo systemctl status xpchaind --no-pager +journalctl -u xpchaind -n 100 --no-pager +journalctl -u xpchaind -f + +# 데몬 직접 실행 시 로그 +tail -n 100 ~/.xpchain/debug.log +tail -f ~/.xpchain/debug.log + +# 피어/네트워크 진단 +./xpchain-cli getpeerinfo | grep -E '"addr"|"inbound"' +./xpchain-cli getconnectioncount +ss -lntp | grep 8798 +sudo ufw status verbose + +# 블록 동기화 진단 +./xpchain-cli getblockchaininfo +./xpchain-cli getchaintips + +# 정지/시작 +./xpchain-cli stop +./xpchaind -daemon +``` From 8d84a3b8d6f0191b78151d6100f7bddf5755cce2 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Tue, 24 Feb 2026 23:12:40 +0900 Subject: [PATCH 42/45] release: finalize 0.17.0-4 metadata and release docs - bump build metadata to 0.17.0.4 and update COPYRIGHT_YEAR to 2026 - switch project metadata links to xpchain-community-core and xpchain.co.kr - refresh About/Splash license text to reflect XPChain Community maintenance context - add 0.17.0-4 release notes document - include release validation notes for v0.17.0-4 --- configure.ac | 8 +- doc/release-validation-v0.17.0-4.md | 44 +++++++++++ .../xpchain-release-notes-0.17.0-4.md | 78 +++++++++++++++++++ src/init.cpp | 8 +- src/qt/splashscreen.cpp | 5 +- 5 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 doc/release-validation-v0.17.0-4.md create mode 100644 doc/xpchain-release-notes/xpchain-release-notes-0.17.0-4.md diff --git a/configure.ac b/configure.ac index 884030b6bd3f..082bd4420130 100644 --- a/configure.ac +++ b/configure.ac @@ -3,12 +3,12 @@ AC_PREREQ([2.60]) define(_CLIENT_VERSION_MAJOR, 0) define(_CLIENT_VERSION_MINOR, 17) define(_CLIENT_VERSION_REVISION, 0) -define(_CLIENT_VERSION_BUILD, 3) +define(_CLIENT_VERSION_BUILD, 4) define(_CLIENT_VERSION_IS_RELEASE, true) -define(_COPYRIGHT_YEAR, 2019) +define(_COPYRIGHT_YEAR, 2026) define(_COPYRIGHT_HOLDERS,[The %s developers]) -define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[XPChain Core]]) -AC_INIT([XPChain Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/xpchain/xpchain/issues],[xpchain],[https://xpchaincore.org/]) +define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[XPChain Community]]) +AC_INIT([XPChain Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/arnoldcho/xpchain-community-core/issues],[xpchain],[https://www.xpchain.co.kr/]) AC_CONFIG_SRCDIR([src/validation.cpp]) AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) AC_CONFIG_AUX_DIR([build-aux]) diff --git a/doc/release-validation-v0.17.0-4.md b/doc/release-validation-v0.17.0-4.md new file mode 100644 index 000000000000..9d80a94482e6 --- /dev/null +++ b/doc/release-validation-v0.17.0-4.md @@ -0,0 +1,44 @@ +# XPChain Core v0.17.0-4 Release Validation + +## Scope +- Release tag: `v0.17.0-4` +- Repository: `arnoldcho/xpchain-community-core` +- Validation type: runtime smoke + wallet functional test + +## macOS Validation (PASS) + +### Environment +- Platform: macOS (Apple Silicon) +- App: `XPChain-Qt.app` +- Build: `0.17.0` + +### Checks +1. App launch +- Result: `PASS` +- Notes: App launches and console/debug window is accessible. + +2. Sync state +- Result: `PASS` +- Notes: Node sync completed and wallet entered normal operating state. + +3. Wallet info RPC +- Command: `getwalletinfo` +- Result: `PASS` +- Notes: wallet fields returned normally (`walletversion`, `balance`, keypool, hdseed). + +4. Receive transaction flow +- Command: `listtransactions` +- Result: `PASS` +- Notes: `category: "receive"` entry confirmed with confirmations increasing. + +5. Send transaction flow +- Command: `listtransactions` +- Result: `PASS` +- Notes: `category: "send"` entry confirmed with fee applied and confirmation progress. + +### Conclusion +- macOS runtime and wallet send/receive behavior validated for `v0.17.0-4`. +- Current status: **usable for practical wallet operation** under tested environment. + +## Follow-up +- Keep using `rc` tags for pre-release validation and only finalize stable version tags after runtime checks on all target OS. diff --git a/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-4.md b/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-4.md new file mode 100644 index 000000000000..029e2434163c --- /dev/null +++ b/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-4.md @@ -0,0 +1,78 @@ +XPChain Core version 0.17.0-4 is now available: + + + +This is a maintenance and packaging release focused on build reliability, +multi-OS distribution, and operational documentation updates. + +This release does not include any consensus or protocol changes. +It is fully compatible with the current mainnet. + +Please report bugs using the issue tracker: + + + +How to Upgrade +============== + +If you are running an older version, shut it down and wait until it has +completely exited. Then install the binaries from this release and restart. + +Compatibility +============= + +XPChain Core 0.17.0-4 provides release artifacts for: + +- Linux x86_64 (tar.gz) +- macOS (dmg, tar.gz) +- Windows x86 / x64 (zip) + +Notable changes +=============== + +Release build and packaging +--------------------------- + +- Stabilized multi-OS GitHub Actions release workflow. +- Improved packaging outputs for Linux, Windows, and macOS. +- Added SHA-256 checksums for release integrity verification. + +macOS build and app packaging improvements +------------------------------------------ + +- Resolved modern toolchain compatibility issues. +- Improved DMG/app bundle creation flow. +- Enhanced macOS runtime dependency packaging. + +Windows/Linux compatibility fixes +--------------------------------- + +- Applied compatibility fixes for modern compilers and dependencies. +- Improved CI build reliability across platforms. + +Project metadata updates +------------------------ + +- Updated project links and metadata. +- Refreshed About/Splash text to reflect current community maintenance context. + +Operational documentation +------------------------- + +- Added Linux node setup guide and troubleshooting notes. +- Added practical CLI command examples and incident-response references. + +XPChain 0.17.0-4 change log +--------------------------- + +- Multi-OS release automation improvements +- Packaging and runtime dependency fixes +- macOS DMG/app bundle generation improvements +- Windows/Linux compatibility fixes +- About/Splash metadata update +- Linux node setup documentation + +Credits +======= + +Thanks to everyone who contributed to this release and verification process. diff --git a/src/init.cpp b/src/init.cpp index c0376561434d..9d8c566abaec 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -531,11 +531,13 @@ std::string LicenseInfo() { const std::string URL_SOURCE_CODE = ""; const std::string URL_WEBSITE = ""; + const std::string COPYRIGHT_XPCHAIN_COMMUNITY = "Copyright (C) 2019-2026 The XPChain Community developers"; + const std::string COPYRIGHT_XPCHAIN_CORE = "Copyright (C) 2018-2019 The XPChain Core developers"; - return CopyrightHolders(strprintf(_("Copyright (C) %i-%i"), 2018, COPYRIGHT_YEAR) + " ") + "\n" + + return COPYRIGHT_XPCHAIN_COMMUNITY + "\n" + + COPYRIGHT_XPCHAIN_CORE + "\n" + "\n" + - strprintf(_("Please contribute if you find %s useful. " - "Visit %s for further information about the software."), + strprintf(_("For the latest information about %s, visit %s."), PACKAGE_NAME, URL_WEBSITE) + "\n" + strprintf(_("The source code is available from %s."), diff --git a/src/qt/splashscreen.cpp b/src/qt/splashscreen.cpp index d6d3aeb3713d..31bd77f3b85d 100644 --- a/src/qt/splashscreen.cpp +++ b/src/qt/splashscreen.cpp @@ -42,7 +42,10 @@ SplashScreen::SplashScreen(interfaces::Node& node, Qt::WindowFlags f, const Netw // define text to place QString titleText = tr(PACKAGE_NAME); QString versionText = QString("Version %1").arg(QString::fromStdString(FormatFullVersion())); - QString copyrightText = QString::fromUtf8(CopyrightHolders(strprintf("\xc2\xA9 %u-%u ", 2018, COPYRIGHT_YEAR)).c_str()); + QString copyrightText = QString::fromUtf8( + "Copyright (C) 2019-2026 The XPChain Community developers\n" + "Copyright (C) 2018-2019 The XPChain Core developers" + ); QString titleAddText = networkStyle->getTitleAddText(); QString font = QApplication::font().toString(); From 1a1f456c2ca9e881e063aa89a4e6444b4344c2a9 Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Wed, 25 Feb 2026 01:31:13 +0900 Subject: [PATCH 43/45] doc: add linux validation results for v0.17.0-4 --- doc/release-validation-v0.17.0-4.md | 42 +++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/doc/release-validation-v0.17.0-4.md b/doc/release-validation-v0.17.0-4.md index 9d80a94482e6..5d0021cfa8c4 100644 --- a/doc/release-validation-v0.17.0-4.md +++ b/doc/release-validation-v0.17.0-4.md @@ -42,3 +42,45 @@ ## Follow-up - Keep using `rc` tags for pre-release validation and only finalize stable version tags after runtime checks on all target OS. + +## Linux Validation (PASS) + +### Environment +- Platform: Ubuntu 24.04 (Vultr, XFCE) +- Binary package: `xpchain-v0.17.0-4-linux-x86_64.tar.gz` +- Runtime files: `xpchaind`, `xpchain-cli`, `xpchain-tx`, `xpchain-qt` + +### Checks +1. Node start and chain progress +- Command: `./xpchain-cli getblockchaininfo` +- Result: `PASS` +- Notes: node started normally, chain sync progressed from low height and continued. + +2. P2P connectivity +- Command: `./xpchain-cli getnetworkinfo`, `./xpchain-cli getconnectioncount` +- Result: `PASS` +- Notes: active peers observed (`connections` in normal range, e.g. 7~9). + +3. Wallet status RPC +- Command: `./xpchain-cli getwalletinfo` +- Result: `PASS` +- Notes: wallet metadata and keypool fields returned normally. + +4. Receive transaction flow +- Command: `listtransactions` (Qt debug console) +- Result: `PASS` +- Notes: `category: "receive"` transaction confirmed, confirmations increased over time. + +5. Send transaction flow +- Command: `listtransactions` (Qt debug console) +- Result: `PASS` +- Notes: `category: "send"` transaction confirmed with fee and block inclusion. + +6. Restart resilience +- Action: `xpchaind` / `xpchain-qt` stop-start cycle +- Result: `PASS` +- Notes: wallet and node resumed normally after restart. + +### Conclusion +- Linux runtime and wallet receive/send/restart behavior validated for `v0.17.0-4`. +- Current status: **usable for practical wallet operation** under tested Ubuntu 24.04 environment. From d5f23c75736f831dacfa7632a623e801b0501b8e Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Thu, 26 Feb 2026 12:42:27 +0900 Subject: [PATCH 44/45] docs: update v0.17.0-4 validation and release notes --- doc/release-validation-v0.17.0-4.md | 92 +++++++++++++++++++ .../xpchain-release-notes-0.17.0-4.md | 10 ++ 2 files changed, 102 insertions(+) diff --git a/doc/release-validation-v0.17.0-4.md b/doc/release-validation-v0.17.0-4.md index 5d0021cfa8c4..0a0f22f53b90 100644 --- a/doc/release-validation-v0.17.0-4.md +++ b/doc/release-validation-v0.17.0-4.md @@ -84,3 +84,95 @@ ### Conclusion - Linux runtime and wallet receive/send/restart behavior validated for `v0.17.0-4`. - Current status: **usable for practical wallet operation** under tested Ubuntu 24.04 environment. + +## Windows Validation (PASS) + +### Environment +- Platform: Windows 64-bit +- Runtime binary: `xpchain-qt.exe` +- Build: `0.17.0` + +### Checks +1. App launch +- Result: `PASS` +- Notes: `xpchain-qt.exe` launched normally on Windows 64-bit environment. + +2. Node start and chain progress +- Command: `./xpchain-cli getblockchaininfo` +- Result: `PASS` +- Notes: node started normally, chain sync progressed from low height and continued. + +3. P2P connectivity +- Command: `./xpchain-cli getnetworkinfo`, `./xpchain-cli getconnectioncount` +- Result: `PASS` +- Notes: active peers observed (`connections` in normal range, e.g. 7~9). + +4. Wallet status RPC +- Command: `./xpchain-cli getwalletinfo` +- Result: `PASS` +- Notes: wallet metadata and keypool fields returned normally. + +5. Receive transaction flow +- Command: `listtransactions` (Qt debug console) +- Result: `PASS` +- Notes: `category: "receive"` transaction confirmed, confirmations increased over time. + +6. Send transaction flow +- Command: `listtransactions` (Qt debug console) +- Result: `PASS` +- Notes: `category: "send"` transaction confirmed with fee and block inclusion. + +7. Restart resilience +- Action: close and relaunch wallet (`xpchain-qt.exe`) +- Result: `PASS` +- Notes: wallet restarted cleanly and returned to normal state after relaunch. + +### Conclusion +- Windows 64-bit runtime and wallet receive/send/restart behavior validated for `v0.17.0-4`. +- Current status: **usable for practical wallet operation** under tested Windows 64-bit environment. + +## Windows 32-bit Validation (PASS) + +### Environment +- Platform: Windows 32-bit +- Runtime binary: `xpchain-qt.exe` +- Build: `0.17.0` + +### Checks +1. App launch +- Result: `PASS` +- Notes: `xpchain-qt.exe` launched normally on Windows 32-bit environment. + +2. Node start and chain progress +- Command: `./xpchain-cli getblockchaininfo` +- Result: `PASS` +- Notes: node started normally, chain sync progressed from low height and continued. + +3. P2P connectivity +- Command: `./xpchain-cli getnetworkinfo`, `./xpchain-cli getconnectioncount` +- Result: `PASS` +- Notes: active peers observed (`connections` in normal range, e.g. 7~9). + +4. Wallet status RPC +- Command: `./xpchain-cli getwalletinfo` +- Result: `PASS` +- Notes: wallet metadata and keypool fields returned normally. + +5. Receive transaction flow +- Command: `listtransactions` (Qt debug console) +- Result: `PASS` +- Notes: `category: "receive"` transaction confirmed, confirmations increased over time. + +6. Send transaction flow +- Command: `listtransactions` (Qt debug console) +- Result: `PASS` +- Notes: `category: "send"` transaction confirmed with fee and block inclusion. + +7. Restart resilience +- Action: close and relaunch wallet (`xpchain-qt.exe`) +- Result: `PASS` +- Notes: wallet restarted cleanly and returned to normal state after relaunch. + +### Conclusion +- Windows 32-bit runtime and wallet receive/send/restart behavior validated for `v0.17.0-4`. +- Current status: **usable for practical wallet operation** under tested Windows 32-bit environment. diff --git a/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-4.md b/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-4.md index 029e2434163c..fdb7a67485e6 100644 --- a/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-4.md +++ b/doc/xpchain-release-notes/xpchain-release-notes-0.17.0-4.md @@ -56,6 +56,15 @@ Project metadata updates - Updated project links and metadata. - Refreshed About/Splash text to reflect current community maintenance context. +UI text and localization updates +-------------------------------- + +- Updated About dialog wording to: "This software is under active community + maintenance and may change between releases." +- Aligned Korean/Japanese translation keys with updated About text. +- Improved Korean wording quality for fee, pruning/reindex, and wallet error + messages to reduce ambiguity in user-facing dialogs. + Operational documentation ------------------------- @@ -70,6 +79,7 @@ XPChain 0.17.0-4 change log - macOS DMG/app bundle generation improvements - Windows/Linux compatibility fixes - About/Splash metadata update +- About wording and localization update (ko/ja) - Linux node setup documentation Credits From e207dd067fc51811440d0f42de1382c0c59f7e8f Mon Sep 17 00:00:00 2001 From: arnoldcho Date: Thu, 26 Feb 2026 12:43:43 +0900 Subject: [PATCH 45/45] core: apply chain params, init, and locale updates --- src/chainparams.cpp | 4 ++++ src/init.cpp | 2 +- src/qt/locale/bitcoin_ja.ts | 4 ++-- src/qt/locale/bitcoin_ko_KR.ts | 30 +++++++++++++++--------------- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 47203b088883..eccf05db123c 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -144,6 +144,8 @@ class CMainParams : public CChainParams { // service bits we want, but we should get them updated to support all service bits wanted by any // release ASAP to avoid it where possible. vSeeds.emplace_back("seed1.xpchain.co.kr"); + vSeeds.emplace_back("seed2.xpchain.co.kr"); + vSeeds.emplace_back("seed3.xpchain.co.kr"); base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,76); base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,28); @@ -248,6 +250,8 @@ class CTestNetParams : public CChainParams { vSeeds.clear(); // nodes with support for servicebits filtering should be at the top vSeeds.emplace_back("seed1.xpchain.co.kr"); + vSeeds.emplace_back("seed2.xpchain.co.kr"); + vSeeds.emplace_back("seed3.xpchain.co.kr"); base58Prefixes[PUBKEY_ADDRESS] = std::vector(1,138); base58Prefixes[SCRIPT_ADDRESS] = std::vector(1,88); diff --git a/src/init.cpp b/src/init.cpp index 9d8c566abaec..0000da7dab25 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -544,7 +544,7 @@ std::string LicenseInfo() URL_SOURCE_CODE) + "\n" + "\n" + - _("This is experimental software.") + "\n" + + _("This software is under active community maintenance and may change between releases.") + "\n" + strprintf(_("Distributed under the MIT software license, see the accompanying file %s or %s"), "COPYING", "") + "\n" + "\n" + strprintf(_("This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit %s and cryptographic software written by Eric Young and UPnP software written by Thomas Bernard."), "") + diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts index ba2a9cf66901..2a49d6d1e072 100644 --- a/src/qt/locale/bitcoin_ja.ts +++ b/src/qt/locale/bitcoin_ja.ts @@ -3839,8 +3839,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha 取引の金額が小さすぎて手数料を支払えません - This is experimental software. - これは実験用のソフトウェアです。 + This software is under active community maintenance and may change between releases. + このソフトウェアはコミュニティによって継続的に保守されており、リリース間で変更される場合があります。 Transaction amount too small diff --git a/src/qt/locale/bitcoin_ko_KR.ts b/src/qt/locale/bitcoin_ko_KR.ts index f89cd5eb946f..9e54ffce0213 100644 --- a/src/qt/locale/bitcoin_ko_KR.ts +++ b/src/qt/locale/bitcoin_ko_KR.ts @@ -2377,7 +2377,7 @@ Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain. - Fallbackfee를 사용하게 될 경우 보낸 거래가 승인이 완료 될 때까지 몇 시간 혹은 몇 일 (혹은 영원히) 이 걸릴 수 있습니다. 수동으로 수수료를 선택하거나 전체 체인의 유효성이 검증될 때까지 기다리십시오. + -fallbackfee 사용 시 거래 확인이 수시간~수일 지연되거나 확인되지 않을 수 있습니다. 수수료를 수동으로 지정하거나 체인 검증이 완료될 때까지 기다리십시오. Warning: Fee estimation is currently not possible. @@ -2421,7 +2421,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha (Smart fee not initialized yet. This usually takes a few blocks...) - (Smart fee가 아직 초기화 되지 않았습니다. 블록 분석이 완전하게 끝날 때 까지 기다려주십시오...) + (스마트 수수료가 아직 초기화되지 않았습니다. 보통 몇 개 블록이 더 필요합니다...) Send to multiple recipients at once @@ -3508,11 +3508,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node) - 블록 축소: 마지막 지갑 동기화 지점이 축소된 데이터보다 과거의 것 입니다. -reindex가 필요합니다 (정지된 노드의 경우 모든 블록체인을 재다운로드합니다) + 프루닝: 마지막 지갑 동기화 지점이 프루닝된 데이터 범위를 벗어났습니다. -reindex가 필요합니다 (프루닝 노드에서는 전체 블록체인을 다시 다운로드합니다) Rescans are not possible in pruned mode. You will need to use -reindex which will download the whole blockchain again. - 블록 축소 모드에서는 재검색이 불가능 합니다. -reindex 명령을 사용해서 모든 블록체인을 다시 다운로드 해야 합니다. + 프루닝 모드에서는 재검색이 지원되지 않습니다. -reindex를 사용해 전체 블록체인을 다시 다운로드해야 합니다. Error: A fatal internal error occurred, see debug.log for details @@ -3551,8 +3551,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha 컴퓨터의 날짜와 시간이 올바른지 확인하십시오! 시간이 잘못되면 %s은 제대로 동작하지 않습니다. - Please contribute if you find %s useful. Visit %s for further information about the software. - %s가 유용하다고 생각한다면 프로젝트에 공헌해주세요. 이 소프트웨어에 대한 보다 자세한 정보는 %s를 방문해주십시오. + For the latest information about %s, visit %s. + %s의 최신 정보는 %s에서 확인하십시오. The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct @@ -3680,7 +3680,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha Invalid amount for -discardfee=<amount>: '%s' - -discardfee=<amount>에 대한 양이 잘못되었습니다: '%s' + -discardfee=<amount> 값이 올바르지 않습니다: '%s' Invalid amount for -fallbackfee=<amount>: '%s' @@ -3776,7 +3776,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha Invalid amount for -maxtxfee=<amount>: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions) - 유효하지 않은 금액 -maxtxfee=<amount>: '%s' (거래가 막히는 상황을 방지하게 위해 적어도 %s 의 중계 수수료를 지정해야 합니다) + 유효하지 않은 금액 -maxtxfee=<amount>: '%s' (거래가 멈추는 상황을 방지하기 위해 최소 %s의 중계 수수료를 지정해야 합니다) The transaction amount is too small to send after the fee has been deducted @@ -3784,7 +3784,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain - 축소 모드를 해제하고 데이터베이스를 재구성 하기 위해 -reindex를 사용해야 합니다. 이 명령은 모든 블록체인을 다시 다운로드 할 것 입니다. + 프루닝 해제 모드로 되돌리려면 -reindex로 데이터베이스를 재구성해야 합니다. 이 과정에서 전체 블록체인을 다시 다운로드합니다. Error loading %s: You can't disable HD on an already existing HD wallet @@ -3812,7 +3812,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha Invalid amount for -paytxfee=<amount>: '%s' (must be at least %s) - 유효하지 않은 금액 -paytxfee=<amount>: "%s" (최소 %s 이상이어야 됨) + 유효하지 않은 금액 -paytxfee=<amount>: "%s" (최소 %s 이상이어야 합니다) Invalid netmask specified in -whitelist: '%s' @@ -3835,8 +3835,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha 거래액이 수수료를 지불하기엔 너무 작습니다 - This is experimental software. - 이 소프트웨어는 시험적입니다. + This software is under active community maintenance and may change between releases. + 이 소프트웨어는 커뮤니티가 활발히 유지보수 중이며 릴리즈 간 변경될 수 있습니다. Transaction amount too small @@ -3880,7 +3880,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha -maxtxfee is set very high! Fees this large could be paid on a single transaction. - -maxtxfee값이 너무 큽니다! 하나의 거래에 너무 큰 수수료가 지불 됩니다. + -maxtxfee 값이 너무 큽니다. 단일 거래에 과도한 수수료가 지불될 수 있습니다. Error loading %s: You can't enable HD on an already existing non-HD wallet @@ -3920,7 +3920,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha Error loading wallet %s. Duplicate -wallet filename specified. - 지갑 %s 로딩 에러, 중복된 -wallet 파일이름을 입력했습니다. + 지갑 %s 로드 오류: 중복된 -wallet 파일 이름이 지정되었습니다. Keypool ran out, please call keypoolrefill first @@ -3972,7 +3972,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee of "100 mocha Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable -fallbackfee. - 수수료 견적 실패. Fallbackfee 비활성화 상태. 몇 블록을 기다리거나 -fallbackfee를 활성화 시키십시오. + 수수료 추정에 실패했습니다. -fallbackfee가 비활성화되어 있습니다. 몇 개 블록을 더 기다리거나 -fallbackfee를 활성화하십시오. Warning: Private keys detected in wallet {%s} with disabled private keys