From bcc652e1d6ca1a559b49e63cb1d33bd8d997de0b Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 6 May 2026 13:07:42 -0400 Subject: [PATCH 01/18] Partial: CMakeLists.txt and phmap.h from 1c5f598 --- CMakeLists.txt | 3 ++- external/parallel_hashmap/phmap.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ac2b6ed..753c037f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -112,7 +112,8 @@ else() endif() if(MINGW) set(WARNINGS "${WARNINGS} -Wno-error=unused-value") - set(MINGW_FLAG "-DWIN32_LEAN_AND_MEAN") + # Boost.Bind: avoid deprecated global placeholders (_1, _2) pragma on newer Boost + set(MINGW_FLAG "-DWIN32_LEAN_AND_MEAN -DBOOST_BIND_GLOBAL_PLACEHOLDERS") include_directories(SYSTEM src/platform/mingw) else() set(MINGW_FLAG "") diff --git a/external/parallel_hashmap/phmap.h b/external/parallel_hashmap/phmap.h index 37f0f7c1..194e4f60 100644 --- a/external/parallel_hashmap/phmap.h +++ b/external/parallel_hashmap/phmap.h @@ -2753,7 +2753,7 @@ class parallel_hash_set std::is_nothrow_default_constructible::value&& std::is_nothrow_default_constructible::value) {} -#if (__cplusplus >= 201703L || _MSVC_LANG >= 201402) && (defined(_MSC_VER) || defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 6)) +#if (__cplusplus >= 201703L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402)) && (defined(_MSC_VER) || defined(__clang__) || (defined(__GNUC__) && __GNUC__ > 6)) explicit parallel_hash_set(size_t bucket_cnt, const hasher& hash_param = hasher(), const key_equal& eq = key_equal(), From 53aabca8def88cfbf827614032c2fec14851dbf5 Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 29 Apr 2026 12:56:03 -0400 Subject: [PATCH 02/18] fix build errors: Mutable buffer: SERVICE_TABLE_ENTRY expects LPSTR in main.cpp * windows: undef ERROR in CheckpointList.h * MinGW: main.cpp, use static char[] for service name --- src/PaymentGateService/main.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/PaymentGateService/main.cpp b/src/PaymentGateService/main.cpp index 6307e6fc..e0bd308c 100644 --- a/src/PaymentGateService/main.cpp +++ b/src/PaymentGateService/main.cpp @@ -123,8 +123,10 @@ int daemonize() { int runDaemon() { #ifdef _WIN32 + // Mutable buffer: SERVICE_TABLE_ENTRY expects LPSTR (non-const); string literals are const. + static char serviceDisplayName[] = "Payment Gate"; SERVICE_TABLE_ENTRY serviceTable[] { - { "Payment Gate", serviceMain }, + { serviceDisplayName, serviceMain }, { NULL, NULL } }; From aaecd40324da87e73b23e8373b6afcab108564f4 Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 29 Apr 2026 16:38:32 -0400 Subject: [PATCH 03/18] attempt to fix macOs boost warning. * new boost version, probably 1.90.0 and base on our use should not break...TBC --- .github/workflows/check.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 94eb5f4a..f777efb5 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -406,14 +406,15 @@ jobs: - name: Install dependencies run: | - brew install boost@1.85 + brew install boost + brew list --versions boost - name: Build id: build run: | mkdir build cd build - cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DSTATIC=ON -DBOOST_ROOT=/usr/local/opt/boost@1.85 + cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DSTATIC=ON -DBOOST_ROOT="$(brew --prefix boost) make -j2 - name: Prepare release From 13ab6938c53be48022a3ca147c3eb40be97f974f Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 29 Apr 2026 16:55:16 -0400 Subject: [PATCH 04/18] address nodejs 20 -> 24 warnings --- .github/workflows/check.yml | 16 ++++++++-------- .github/workflows/windows.yml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index f777efb5..b728bb54 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -27,10 +27,10 @@ jobs: echo "release_name=${release_name}" >> $env:GITHUB_OUTPUT - name: Install msbuild - uses: microsoft/setup-msbuild@v2 + uses: microsoft/setup-msbuild@v3 - name: Restore Boost - uses: actions/cache@v4 + uses: actions/cache@v5 id: restore-boost with: path: ${{env.BOOST_ROOT}} @@ -64,7 +64,7 @@ jobs: cp build/tests/Release/*_tests.exe build/conceal - name: Upload To GH Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ${{ steps.setup.outputs.release_name }} path: build/conceal @@ -148,7 +148,7 @@ jobs: cp build/tests/*_tests.exe build/conceal - name: Upload To GH Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ${{ steps.setup.outputs.release_name }} path: build/conceal @@ -217,7 +217,7 @@ jobs: cp build/tests/*_tests build/conceal - name: Upload To GH Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ${{ steps.setup.outputs.release_name }} path: build/conceal @@ -287,7 +287,7 @@ jobs: cp build/tests/*_tests build/conceal - name: Upload To GH Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ${{ steps.setup.outputs.release_name }} path: build/conceal @@ -357,7 +357,7 @@ jobs: cp build/tests/*_tests build/conceal - name: Upload To GH Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ${{ steps.setup.outputs.release_name }} path: build/conceal @@ -427,7 +427,7 @@ jobs: cp build/tests/*_tests build/conceal - name: Upload To GH Artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v6 with: name: ${{ steps.setup.outputs.release_name }} path: build/conceal diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 38b3522a..9807a1cc 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@master - name: Setup msbuild - uses: microsoft/setup-msbuild@v2 + uses: microsoft/setup-msbuild@v3 - name: Restore Boost uses: actions/cache@v4 From cc852276388155611004f955725a00003f6dd89b Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 29 Apr 2026 17:15:34 -0400 Subject: [PATCH 05/18] fix typo in macOs cmake command --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b728bb54..ffe8d7eb 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -414,7 +414,7 @@ jobs: run: | mkdir build cd build - cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DSTATIC=ON -DBOOST_ROOT="$(brew --prefix boost) + cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=ON -DSTATIC=ON -DBOOST_ROOT="$(brew --prefix boost)" make -j2 - name: Prepare release From 1290239931c8c525788d9606b59e8502ba4e189a Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 29 Apr 2026 17:26:38 -0400 Subject: [PATCH 06/18] tweak CMakeLists for macOS , boost configuration. --- CMakeLists.txt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 753c037f..abaa02ab 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,6 +145,10 @@ if(APPLE) add_definitions(/DHAVE_ROTR) endif() +if(POLICY CMP0167) + cmake_policy(SET CMP0167 OLD) +endif() + if(STATIC) set(Boost_NO_BOOST_CMAKE ON) set(Boost_USE_STATIC_LIBS ON) @@ -152,7 +156,17 @@ if(STATIC) endif() #set(Boost_DEBUG on) -find_package(Boost 1.55 REQUIRED COMPONENTS system filesystem thread date_time chrono regex serialization program_options) +set(BOOST_COMPONENTS filesystem thread date_time chrono regex serialization program_options) + +if(APPLE) + find_package(Boost 1.55 COMPONENTS system ${BOOST_COMPONENTS}) + if(NOT Boost_FOUND) + message(STATUS "Boost.System library not found; retrying without system component") + find_package(Boost 1.55 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) + endif() +else() + find_package(Boost 1.55 REQUIRED COMPONENTS system ${BOOST_COMPONENTS}) +endif() include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) if(MINGW) From ca91637f55fbf84ddf0bacc88b07f4ada802c381 Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 29 Apr 2026 17:41:03 -0400 Subject: [PATCH 07/18] tweak InProcessNode.h, InProcessNode.cpp for compatibility with boost 1.90.0 for macOS build --- src/InProcessNode/InProcessNode.cpp | 6 +++++- src/InProcessNode/InProcessNode.h | 13 +++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/InProcessNode/InProcessNode.cpp b/src/InProcessNode/InProcessNode.cpp index e72be273..a955868d 100644 --- a/src/InProcessNode/InProcessNode.cpp +++ b/src/InProcessNode/InProcessNode.cpp @@ -63,7 +63,11 @@ void InProcessNode::init(const Callback& callback) { protocol.addObserver(this); core.addObserver(this); - work.reset(new boost::asio::io_service::work(ioService)); +#if BOOST_VERSION >= 106600 + work.reset(new InProcessNodeWork(ioService.get_executor())); +#else + work.reset(new InProcessNodeWork(ioService)); +#endif workerThread.reset(new std::thread(&InProcessNode::workerFunc, this)); state = INITIALIZED; diff --git a/src/InProcessNode/InProcessNode.h b/src/InProcessNode/InProcessNode.h index a9b92687..1c7bd6ab 100644 --- a/src/InProcessNode/InProcessNode.h +++ b/src/InProcessNode/InProcessNode.h @@ -18,11 +18,20 @@ #include #include +#include namespace cn { class core; +#if BOOST_VERSION >= 106600 +using InProcessNodeIoContext = boost::asio::io_context; +using InProcessNodeWork = boost::asio::executor_work_guard; +#else +using InProcessNodeIoContext = boost::asio::io_service; +using InProcessNodeWork = boost::asio::io_service::work; +#endif + class InProcessNode : public INode, public cn::ICryptoNoteProtocolObserver, public cn::ICoreObserver { public: InProcessNode(cn::ICore& core, cn::ICryptoNoteProtocolQuery& protocol); @@ -135,9 +144,9 @@ class InProcessNode : public INode, public cn::ICryptoNoteProtocolObserver, publ cn::ICryptoNoteProtocolQuery& protocol; tools::ObserverManager observerManager; - boost::asio::io_service ioService; + InProcessNodeIoContext ioService; std::unique_ptr workerThread; - std::unique_ptr work; + std::unique_ptr work; BlockchainExplorerDataBuilder blockchainExplorerDataBuilder; From 9f069f211514fa84a2250853675540162e6c921c Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 29 Apr 2026 18:19:05 -0400 Subject: [PATCH 08/18] address boost io_context per version --- src/InProcessNode/InProcessNode.cpp | 44 +++++++++++++++++------------ src/InProcessNode/InProcessNode.h | 12 +++++++- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/InProcessNode/InProcessNode.cpp b/src/InProcessNode/InProcessNode.cpp index a955868d..f1de3590 100644 --- a/src/InProcessNode/InProcessNode.cpp +++ b/src/InProcessNode/InProcessNode.cpp @@ -63,7 +63,7 @@ void InProcessNode::init(const Callback& callback) { protocol.addObserver(this); core.addObserver(this); -#if BOOST_VERSION >= 106600 +#if BOOST_VERSION >= 109000 work.reset(new InProcessNodeWork(ioService.get_executor())); #else work.reset(new InProcessNodeWork(ioService)); @@ -73,7 +73,7 @@ void InProcessNode::init(const Callback& callback) { state = INITIALIZED; } - ioService.post(std::bind(callback, ec)); + postIoService(std::bind(callback, ec)); } bool InProcessNode::shutdown() { @@ -93,10 +93,18 @@ bool InProcessNode::doShutdown() { work.reset(); ioService.stop(); workerThread->join(); - ioService.reset(); + resetIoService(); return true; } +void InProcessNode::resetIoService() { +#if BOOST_VERSION >= 109000 + ioService.restart(); +#else + ioService.reset(); +#endif +} + void InProcessNode::workerFunc() { ioService.run(); } @@ -111,7 +119,7 @@ void InProcessNode::getNewBlocks(std::vector&& knownBlockIds, std: return; } - ioService.post( + postIoService( std::bind(&InProcessNode::getNewBlocksAsync, this, std::move(knownBlockIds), @@ -185,7 +193,7 @@ void InProcessNode::getTransactionOutsGlobalIndices(const crypto::Hash& transact return; } - ioService.post( + postIoService( std::bind(&InProcessNode::getTransactionOutsGlobalIndicesAsync, this, std::cref(transactionHash), @@ -235,7 +243,7 @@ void InProcessNode::getRandomOutsByAmounts(std::vector&& amounts, uint return; } - ioService.post( + postIoService( std::bind(&InProcessNode::getRandomOutsByAmountsAsync, this, std::move(amounts), @@ -292,7 +300,7 @@ void InProcessNode::relayTransaction(const cn::Transaction& transaction, const C return; } - ioService.post( + postIoService( std::bind(&InProcessNode::relayTransactionAsync, this, transaction, @@ -461,7 +469,7 @@ void InProcessNode::queryBlocks(std::vector&& knownBlockIds, uint6 return; } - ioService.post( + postIoService( std::bind(&InProcessNode::queryBlocksLiteAsync, this, std::move(knownBlockIds), @@ -523,7 +531,7 @@ void InProcessNode::getPoolSymmetricDifference(std::vector&& known return; } - ioService.post([this, knownPoolTxIds, knownBlockId, &isBcActual, &newTxs, &deletedTxIds, callback] () mutable { + postIoService([this, knownPoolTxIds, knownBlockId, &isBcActual, &newTxs, &deletedTxIds, callback] () mutable { this->getPoolSymmetricDifferenceAsync(std::move(knownPoolTxIds), knownBlockId, isBcActual, newTxs, deletedTxIds, callback); }); } @@ -556,7 +564,7 @@ void InProcessNode::getMultisignatureOutputByGlobalIndex(uint64_t amount, uint32 return; } - ioService.post([this, amount, gindex, &out, callback]() mutable { + postIoService([this, amount, gindex, &out, callback]() mutable { this->getOutByMSigGIndexAsync(amount, gindex, out, callback); }); } @@ -581,7 +589,7 @@ void InProcessNode::getBlocks(const std::vector& blockHeights, std::ve return; } - ioService.post( + postIoService( std::bind( static_cast< void(InProcessNode::*)( @@ -665,7 +673,7 @@ void InProcessNode::getBlocks(const std::vector& blockHashes, std: return; } - ioService.post( + postIoService( std::bind( static_cast< void(InProcessNode::*)( @@ -728,7 +736,7 @@ void InProcessNode::getBlocks(uint64_t timestampBegin, uint64_t timestampEnd, ui return; } - ioService.post( + postIoService( std::bind( static_cast< void(InProcessNode::*)( @@ -804,7 +812,7 @@ void InProcessNode::getTransactions(const std::vector& transaction return; } - ioService.post( + postIoService( std::bind( static_cast< void(InProcessNode::*)( @@ -869,7 +877,7 @@ void InProcessNode::getPoolTransactions(uint64_t timestampBegin, uint64_t timest return; } - ioService.post( + postIoService( std::bind( &InProcessNode::getPoolTransactionsAsync, this, @@ -928,7 +936,7 @@ void InProcessNode::getTransactionsByPaymentId(const crypto::Hash& paymentId, st return; } - ioService.post( + postIoService( std::bind( &InProcessNode::getTransactionsByPaymentIdAsync, this, @@ -949,7 +957,7 @@ void InProcessNode::getTransaction(const crypto::Hash &transactionHash, cn::Tran return; } - ioService.post( + postIoService( std::bind( static_cast< void (InProcessNode::*)( @@ -1044,7 +1052,7 @@ void InProcessNode::isSynchronized(bool& syncStatus, const Callback& callback) { return; } - ioService.post( + postIoService( std::bind( &InProcessNode::isSynchronizedAsync, this, diff --git a/src/InProcessNode/InProcessNode.h b/src/InProcessNode/InProcessNode.h index 1c7bd6ab..e8abb6b6 100644 --- a/src/InProcessNode/InProcessNode.h +++ b/src/InProcessNode/InProcessNode.h @@ -24,7 +24,7 @@ namespace cn { class core; -#if BOOST_VERSION >= 106600 +#if BOOST_VERSION >= 109000 using InProcessNodeIoContext = boost::asio::io_context; using InProcessNodeWork = boost::asio::executor_work_guard; #else @@ -133,6 +133,16 @@ class InProcessNode : public INode, public cn::ICryptoNoteProtocolObserver, publ std::error_code doGetTransaction(const crypto::Hash &transactionHash, cn::Transaction &transaction); void workerFunc(); bool doShutdown(); + void resetIoService(); + + template + void postIoService(Handler handler) { +#if BOOST_VERSION >= 109000 + boost::asio::post(ioService, handler); +#else + ioService.post(handler); +#endif + } enum State { NOT_INITIALIZED, From e6d7aa216d097c12370c3f7349d3c9854f74c7c2 Mon Sep 17 00:00:00 2001 From: acktarius Date: Thu, 30 Apr 2026 13:08:34 -0400 Subject: [PATCH 09/18] version bump beta * bump to 6.7.4-beta.1 in order to propose on upstream/development * update contributing flow --- CMakeLists.txt | 2 +- CONTRIBUTING.md | 8 +++++--- src/CryptoNoteConfig.h | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index abaa02ab..6b195f9f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.5) include(CheckCXXCompilerFlag) -set(VERSION "6.7.3") +set(VERSION "6.7.4-beta.1") set(VERSION_BUILD_NO "Trebopala") # Packaged from main commits set(COMMIT 1db6e66) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ab99bfa9..300b2bc7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,12 +1,14 @@ Development Process -Developers work in their own trees, then submit pull requests when they think their feature or bug fix is ready. +Contributors should work from their own fork of the repository (not push branches directly to the upstream repo unless they are maintainers with that workflow). When you start a change, create a branch named `/`: use a three-letter identifier derived from your name or handle, then a short topic (often kebab-case words). Examples for someone named John Doe: `jdo/fix`, `doe/dependencies`. + +Open pull requests against the upstream **`development`** branch when you consider your feature or bug fix ready. The patch will be accepted if there is broad consensus that it is a good thing. Developers should expect to rework and resubmit patches if they don't match the project's coding conventions or are controversial. -The master branch is regularly built and tested, but is not guaranteed to be completely stable. Tags are regularly created to indicate new official, stable release versions of Conceal. +The `development` branch is regularly built and tested, but is not guaranteed to be completely stable. Tags are regularly created to indicate new official, stable release versions of Conceal. -Feature branches are created when there are major new features being worked on by several people. +Feature branches on upstream may be created when there are major new features being worked on by several people. From time to time a pull request will become outdated. If this occurs, and the pull is no longer automatically mergeable; a comment on the pull will be used to issue a warning of closure. The pull will be closed 15 days after the warning if action is not taken by the author. Pull requests closed in this manner will have their corresponding issue labeled 'stagnant'. diff --git a/src/CryptoNoteConfig.h b/src/CryptoNoteConfig.h index 4bde41c3..c9384fea 100644 --- a/src/CryptoNoteConfig.h +++ b/src/CryptoNoteConfig.h @@ -1,6 +1,6 @@ // Copyright (c) 2012-2017 The Cryptonote developers // Copyright (c) 2017-2018 The Circle Foundation & Conceal Devs -// Copyright (c) 2018-2023 Conceal Network & Conceal Devs +// Copyright (c) 2018-2026 Conceal Network & Conceal Devs // // // Distributed under the MIT/X11 software license, see the accompanying From 2f32453fc916dbdd65f9203539fb35fc52d2bb82 Mon Sep 17 00:00:00 2001 From: acktarius Date: Tue, 5 May 2026 16:15:37 -0400 Subject: [PATCH 10/18] add permissions to workflows --- .github/workflows/check.yml | 14 +++++++++++++- .github/workflows/macOS.yml | 6 ++++-- .github/workflows/ubuntu22.yml | 2 ++ .github/workflows/ubuntu24.yml | 4 +++- .github/workflows/windows.yml | 2 ++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index ffe8d7eb..5604b8c9 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -12,6 +12,8 @@ jobs: build-windows: name: Windows runs-on: windows-2022 + permissions: + contents: write env: BOOST_ROOT: C:/local/boost_1_83_0 steps: @@ -99,6 +101,8 @@ jobs: build-mingw: name: MinGW runs-on: windows-2022 + permissions: + contents: write defaults: run: shell: msys2 {0} @@ -183,6 +187,8 @@ jobs: build-ubuntu22: name: Ubuntu 22.04 runs-on: ubuntu-22.04 + permissions: + contents: write steps: - uses: actions/checkout@master @@ -253,6 +259,8 @@ jobs: build-ubuntu24: name: Ubuntu 24.04 runs-on: ubuntu-24.04 + permissions: + contents: write steps: - uses: actions/checkout@master @@ -323,6 +331,8 @@ jobs: build-ubuntu22-clang: name: Ubuntu 22.04 clang runs-on: ubuntu-22.04 + permissions: + contents: write steps: - uses: actions/checkout@master @@ -392,7 +402,9 @@ jobs: build-macos: name: macOS - runs-on: macos-13 + runs-on: macos-15-intel + permissions: + contents: write steps: - uses: actions/checkout@master diff --git a/.github/workflows/macOS.yml b/.github/workflows/macOS.yml index 03aab0c2..63ca808d 100644 --- a/.github/workflows/macOS.yml +++ b/.github/workflows/macOS.yml @@ -4,11 +4,13 @@ on: push: tags: - "*" - + jobs: build-macos: name: macOS - runs-on: macos-13 + runs-on: macos-15-intel + permissions: + contents: write steps: - uses: actions/checkout@master diff --git a/.github/workflows/ubuntu22.yml b/.github/workflows/ubuntu22.yml index e82b4d8b..f841ee39 100644 --- a/.github/workflows/ubuntu22.yml +++ b/.github/workflows/ubuntu22.yml @@ -9,6 +9,8 @@ jobs: build-ubuntu22: name: Ubuntu 22.04 runs-on: ubuntu-22.04 + permissions: + contents: write steps: - uses: actions/checkout@master diff --git a/.github/workflows/ubuntu24.yml b/.github/workflows/ubuntu24.yml index 2e2e338f..ce5c12dc 100644 --- a/.github/workflows/ubuntu24.yml +++ b/.github/workflows/ubuntu24.yml @@ -4,11 +4,13 @@ on: push: tags: - "*" - + jobs: build-ubuntu24: name: Ubuntu 24.04 runs-on: ubuntu-24.04 + permissions: + contents: write steps: - uses: actions/checkout@master diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 9807a1cc..c147ce0c 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -9,6 +9,8 @@ jobs: build-windows: name: Windows runs-on: windows-2022 + permissions: + contents: write env: BOOST_ROOT: C:/local/boost_1_83_0 steps: From be4e1026f3f933ad3fa0566f10b588fda3cd4e0e Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 6 May 2026 13:39:57 -0400 Subject: [PATCH 11/18] add definition BOOST_ASIO_HAS_IO_CONTEXT * using CMake macro instead of Boost version check --- CMakeLists.txt | 4 ++++ src/InProcessNode/InProcessNode.cpp | 4 ++-- src/InProcessNode/InProcessNode.h | 5 ++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6b195f9f..24355518 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -169,6 +169,10 @@ else() endif() include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) +if(Boost_VERSION AND NOT Boost_VERSION VERSION_LESS 1.90.0) + add_definitions(-DBOOST_ASIO_HAS_IO_CONTEXT) +endif() + if(MINGW) set(Boost_LIBRARIES "${Boost_LIBRARIES};ws2_32;mswsock;bcrypt") elseif(APPLE) diff --git a/src/InProcessNode/InProcessNode.cpp b/src/InProcessNode/InProcessNode.cpp index f1de3590..59ff2658 100644 --- a/src/InProcessNode/InProcessNode.cpp +++ b/src/InProcessNode/InProcessNode.cpp @@ -63,7 +63,7 @@ void InProcessNode::init(const Callback& callback) { protocol.addObserver(this); core.addObserver(this); -#if BOOST_VERSION >= 109000 +#if defined(BOOST_ASIO_HAS_IO_CONTEXT) work.reset(new InProcessNodeWork(ioService.get_executor())); #else work.reset(new InProcessNodeWork(ioService)); @@ -98,7 +98,7 @@ bool InProcessNode::doShutdown() { } void InProcessNode::resetIoService() { -#if BOOST_VERSION >= 109000 +#if defined(BOOST_ASIO_HAS_IO_CONTEXT) ioService.restart(); #else ioService.reset(); diff --git a/src/InProcessNode/InProcessNode.h b/src/InProcessNode/InProcessNode.h index e8abb6b6..c4cdf5d5 100644 --- a/src/InProcessNode/InProcessNode.h +++ b/src/InProcessNode/InProcessNode.h @@ -18,13 +18,12 @@ #include #include -#include namespace cn { class core; -#if BOOST_VERSION >= 109000 +#if defined(BOOST_ASIO_HAS_IO_CONTEXT) using InProcessNodeIoContext = boost::asio::io_context; using InProcessNodeWork = boost::asio::executor_work_guard; #else @@ -137,7 +136,7 @@ class InProcessNode : public INode, public cn::ICryptoNoteProtocolObserver, publ template void postIoService(Handler handler) { -#if BOOST_VERSION >= 109000 +#if defined(BOOST_ASIO_HAS_IO_CONTEXT) boost::asio::post(ioService, handler); #else ioService.post(handler); From f713c8563597452e4c0d77312d27c3254ea021e4 Mon Sep 17 00:00:00 2001 From: acktarius Date: Wed, 29 Apr 2026 21:40:23 -0400 Subject: [PATCH 12/18] address memory leak --- src/CryptoNoteCore/Currency.cpp | 24 +++++++++++++++++++--- src/Logging/FileLogger.cpp | 8 ++++++++ src/Logging/FileLogger.h | 1 + src/Logging/LoggerManager.cpp | 6 ++++++ src/Logging/LoggerManager.h | 1 + src/Platform/Linux/System/Dispatcher.cpp | 2 ++ src/Platform/OSX/System/Dispatcher.cpp | 2 ++ src/Platform/Windows/System/Dispatcher.cpp | 2 ++ src/System/ContextGroup.cpp | 5 +++++ 9 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/CryptoNoteCore/Currency.cpp b/src/CryptoNoteCore/Currency.cpp index b493e982..d9ce49d5 100644 --- a/src/CryptoNoteCore/Currency.cpp +++ b/src/CryptoNoteCore/Currency.cpp @@ -482,14 +482,32 @@ namespace cn if (amount_out > amount_in) { - // interest shows up in the output of the W/D transactions and W/Ds always have min fee - if (tx.inputs.size() > 0 && !tx.outputs.empty() && amount_out > amount_in + parameters::MINIMUM_FEE) + // Check if this is actually a deposit multisig spend (withdrawal) + bool isDepositWithdrawal = false; + for (const auto &in : tx.inputs) { + if (in.type() == typeid(MultisignatureInput)) + { + const auto &msig = boost::get(in); + if (msig.term != 0) + { + isDepositWithdrawal = true; + break; + } + } + } + + if (isDepositWithdrawal) + { + // Interest shows up in the output of withdrawal transactions + // W/Ds always have min fee fee = parameters::MINIMUM_FEE; - logger(INFO) << "TRIGGERED: Currency.cpp getTransactionFee"; + return true; } else { + // Not a withdrawal — overspend is invalid + logger(ERROR) << "Transaction has outputs > inputs but is not a deposit withdrawal"; return false; } } diff --git a/src/Logging/FileLogger.cpp b/src/Logging/FileLogger.cpp index 8c8a3945..0727937d 100644 --- a/src/Logging/FileLogger.cpp +++ b/src/Logging/FileLogger.cpp @@ -12,6 +12,14 @@ namespace logging { FileLogger::FileLogger(Level level) : StreamLogger(level) { } +FileLogger::~FileLogger() { + if (fileStream.is_open()) { + stream = nullptr; + fileStream.flush(); + fileStream.close(); + } +} + void FileLogger::init(const std::string& fileName) { fileStream.open(fileName, std::ios::app); StreamLogger::attachToStream(fileStream); diff --git a/src/Logging/FileLogger.h b/src/Logging/FileLogger.h index ec948a94..6e25e649 100644 --- a/src/Logging/FileLogger.h +++ b/src/Logging/FileLogger.h @@ -15,6 +15,7 @@ namespace logging { class FileLogger : public StreamLogger { public: FileLogger(Level level = DEBUGGING); + ~FileLogger(); void init(const std::string& filename); private: diff --git a/src/Logging/LoggerManager.cpp b/src/Logging/LoggerManager.cpp index 256a142e..14324391 100644 --- a/src/Logging/LoggerManager.cpp +++ b/src/Logging/LoggerManager.cpp @@ -17,6 +17,12 @@ using common::JsonValue; LoggerManager::LoggerManager() { } +LoggerManager::~LoggerManager() { + std::unique_lock lock(reconfigureLock); + LoggerGroup::loggers.clear(); + loggers.clear(); +} + void LoggerManager::operator()(const std::string& category, Level level, boost::posix_time::ptime time, const std::string& body) { std::unique_lock lock(reconfigureLock); LoggerGroup::operator()(category, level, time, body); diff --git a/src/Logging/LoggerManager.h b/src/Logging/LoggerManager.h index c8655604..3d612250 100644 --- a/src/Logging/LoggerManager.h +++ b/src/Logging/LoggerManager.h @@ -18,6 +18,7 @@ namespace logging { class LoggerManager : public LoggerGroup { public: LoggerManager(); + ~LoggerManager(); void configure(const common::JsonValue& val); virtual void operator()(const std::string& category, Level level, boost::posix_time::ptime time, const std::string& body) override; diff --git a/src/Platform/Linux/System/Dispatcher.cpp b/src/Platform/Linux/System/Dispatcher.cpp index 76241e0b..83de9cc6 100644 --- a/src/Platform/Linux/System/Dispatcher.cpp +++ b/src/Platform/Linux/System/Dispatcher.cpp @@ -439,6 +439,8 @@ void Dispatcher::contextProcedure(void* ucontext) { context.procedure(); } catch(std::exception&) { } + context.procedure = nullptr; + context.interruptProcedure = nullptr; if (context.group != nullptr) { if (context.groupPrev != nullptr) { diff --git a/src/Platform/OSX/System/Dispatcher.cpp b/src/Platform/OSX/System/Dispatcher.cpp index c3a1e619..10eee980 100644 --- a/src/Platform/OSX/System/Dispatcher.cpp +++ b/src/Platform/OSX/System/Dispatcher.cpp @@ -406,6 +406,8 @@ void Dispatcher::contextProcedure(void* ucontext) { context.procedure(); } catch(std::exception&) { } + context.procedure = nullptr; + context.interruptProcedure = nullptr; if (context.group != nullptr) { if (context.groupPrev != nullptr) { diff --git a/src/Platform/Windows/System/Dispatcher.cpp b/src/Platform/Windows/System/Dispatcher.cpp index 9fdb2d4b..daea8d99 100644 --- a/src/Platform/Windows/System/Dispatcher.cpp +++ b/src/Platform/Windows/System/Dispatcher.cpp @@ -390,6 +390,8 @@ void Dispatcher::contextProcedure() { context.procedure(); } catch (std::exception&) { } + context.procedure = nullptr; + context.interruptProcedure = nullptr; if (context.group != nullptr) { if (context.groupPrev != nullptr) { diff --git a/src/System/ContextGroup.cpp b/src/System/ContextGroup.cpp index 116a4dac..0154ea66 100644 --- a/src/System/ContextGroup.cpp +++ b/src/System/ContextGroup.cpp @@ -84,6 +84,11 @@ void ContextGroup::wait() { dispatcher->dispatch(); assert(context == dispatcher->getCurrentContext()); } + + for (NativeContext* context = contextGroup.firstContext; context != nullptr; context = context->groupNext) { + context->procedure = nullptr; + context->interruptProcedure = nullptr; + } } } From edcf11bde1bdfc308481d89332dc90d493376485 Mon Sep 17 00:00:00 2001 From: acktarius Date: Thu, 30 Apr 2026 09:40:14 -0400 Subject: [PATCH 13/18] update checkpoints mainnet + testnet --- src/CryptoNoteConfig.h | 61 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/src/CryptoNoteConfig.h b/src/CryptoNoteConfig.h index c9384fea..fb6b10ca 100644 --- a/src/CryptoNoteConfig.h +++ b/src/CryptoNoteConfig.h @@ -1,6 +1,6 @@ // Copyright (c) 2012-2017 The Cryptonote developers // Copyright (c) 2017-2018 The Circle Foundation & Conceal Devs -// Copyright (c) 2018-2026 Conceal Network & Conceal Devs +// Copyright (c) 2018-2023 Conceal Network & Conceal Devs // // // Distributed under the MIT/X11 software license, see the accompanying @@ -141,7 +141,8 @@ namespace cn const char P2P_NET_DATA_FILENAME[] = "p2pstate.bin"; const char CRYPTONOTE_BLOCKCHAIN_INDICES_FILENAME[] = "blockchainindices.dat"; const char MINER_CONFIG_FILE_NAME[] = "miner_conf.json"; - + const char CRYPTONOTE_CHECKPOINT_FILENAME[] = "checkpoint.dat"; + } // namespace parameters const uint64_t START_BLOCK_REWARD = (UINT64_C(5000) * parameters::POINT); // start reward (Consensus I) @@ -185,13 +186,15 @@ namespace cn and the minimum version for communication between nodes */ const uint8_t P2P_VERSION_1 = 1; const uint8_t P2P_VERSION_2 = 2; - const uint8_t P2P_CURRENT_VERSION = 1; + const uint8_t P2P_CURRENT_VERSION = 2; // Incremented to support checkpoint list propagation const uint8_t P2P_MINIMUM_VERSION = 1; const uint8_t P2P_UPGRADE_WINDOW = 2; // This defines the minimum P2P version required for lite blocks propogation const uint8_t P2P_LITE_BLOCKS_PROPOGATION_VERSION = 3; + const uint8_t P2P_CHECKPOINT_LIST_VERSION = 2; + const size_t P2P_LOCAL_WHITE_PEERLIST_LIMIT = 1000; const size_t P2P_LOCAL_GRAY_PEERLIST_LIMIT = 5000; @@ -206,6 +209,23 @@ namespace cn const uint32_t P2P_DEFAULT_PING_CONNECTION_TIMEOUT = 2000; // 2 seconds const uint64_t P2P_DEFAULT_INVOKE_TIMEOUT = 60 * 2 * 1000; // 2 minutes const size_t P2P_DEFAULT_HANDSHAKE_INVOKE_TIMEOUT = 5000; // 5 seconds + const size_t P2P_CHECKPOINT_LIST_RE_REQUEST = 300; // 5 minutes + const uint32_t P2P_CHECKPOINT_PEER_MIN_UPTIME_BLOCKS = 12000; // Minimum peer uptime for checkpoint verification (mainnet: 12000 blocks × 2 min = 24000 min ≈ 16.7 days) + const uint32_t P2P_CHECKPOINT_PEER_MIN_UPTIME_BLOCKS_TESTNET = 2; // Minimum peer uptime for checkpoint verification (testnet: 6000 blocks × 2 min = 12000 min ≈ 8.3 days, relaxed for smaller network) + + // Checkpoint consensus configuration (Mainnet) + // M = minimum agreements required (all M peers must agree) + // K = total peers to sample + // n = minimum distinct /16 networks required + const uint32_t CKPT_MIN_CONSENSUS_PEERS = 6; // M: minimum agreements required + const uint32_t CKPT_CONSENSUS_PEERS = 6; // K: minimun total peers to sample + const uint32_t CKPT_MIN_DIVERSE_NETWORKS = 3; // n: minimum distinct /16 networks required + + // Checkpoint consensus configuration (Testnet - relaxed for smaller network) + const uint32_t CKPT_MIN_CONSENSUS_PEERS_TESTNET = 2; // M: minimum agreements required (testnet) + const uint32_t CKPT_CONSENSUS_PEERS_TESTNET = 2; // K: minimum total peers to sample (testnet) - increased to ask multiple peers + const uint32_t CKPT_MIN_DIVERSE_NETWORKS_TESTNET = 2; // n: minimum distinct /16 networks required (testnet) + const char P2P_STAT_TRUSTED_PUB_KEY[] = "f7061e9a5f0d30549afde49c9bfbaa52ac60afdc46304642b460a9ea34bf7a4e"; // Seed Nodes @@ -220,8 +240,7 @@ namespace cn }; const std::initializer_list TESTNET_SEED_NODES = { - "161.97.145.65:15500", - "161.97.145.65:15501" + "5.189.177.60:15500" }; struct CheckpointData @@ -234,6 +253,9 @@ namespace cn __attribute__((unused)) #endif + const char DNS_CHECKPOINT_DOMAIN[] = "checkpoints.conceal.id"; + const char TESTNET_DNS_CHECKPOINT_DOMAIN[] = "testpoints.conceal.id"; + // Blockchain Checkpoints: // {, ""}, const std::initializer_list @@ -425,7 +447,25 @@ namespace cn {1840000, "b3a95fbf906555264a31906678b299c0851d09628b8d37969a285cb54a614c31"}, {1850000, "041d84a8c1fb68d24e6a9d8fe5aab27c6db654ecaad3b2d541c40d6e9df53feb"}, {1860000, "63642037f4d5d82150c120e776a3b2d2a80f725b4759ffda12c94bd45499fb25"}, - {1870000, "159fa13f6f9f48e2d8344e76ebdfe2ea986b9a72e94325dacbbd3bd73cbdbb41"} + {1870000, "159fa13f6f9f48e2d8344e76ebdfe2ea986b9a72e94325dacbbd3bd73cbdbb41"}, + {1880000, "7e5dd6c104989975b482d7bf277934d8f9252e81f5bc996ed7c54ee95542ade6"}, + {1890000, "c2ded97cfaefc52aa1de9f6ca8f04d2f3c2ab3b48bf572801555e9fa7934f954"}, + {1900000, "50f2fc1af569f1ebb6567b915e2ee1bf72c585f544725e952a303b447faab909"}, + {1910000, "e2f3e1560369c4e457fdeffbe2ca2fbf9db7aa89a5cd6d9d2e96f7ef826690eb"}, + {1920000, "ba318eb902d6a3f7dd4e7116b13c6b1f2cb4e8c9e70acbde3b6a28a1374c6243"}, + {1930000, "6f39f0888c14808710e909fb45c864fdf738cf644e432486d8e01b65dbbc2862"}, + {1940000, "fe774dd97a5b975c02abb18ca48bf6fd3a8048b597520befe1f261855a7ccf3f"}, + {1950000, "6147f276271c55319cf6fc03e86bcaa75ea0a2aab126095a9a9f8a811eb229e1"}, + {1960000, "e5b31d500706cbca7e7eaca4b5762413533c826692c632a1c0a1a0df6771f42d"}, + {1970000, "5b8da5814d2d82bd21db65b2b3c78b0f2038deab2ae16eee721193713c9e2e27"}, + {1980000, "a69211b77326d9ff74fe8be81c281e0a44b0c8bbee643cd6d736e186362fd7f5"}, + {1990000, "fe9b87f2e98f544af8b7ac950b7b5a1eebf0a9508ea613c74bd3304433726b30"}, + {2000000, "bf1e1396f4ee1c21a2d574035c6b422d62b8aa3d4b3268111b1b73357ad49740"}, + {2010000, "c4806687630ae3fc1c371889617f0659f2622ba9bcdcee1a0c349dea87ed4f84"}, + {2020000, "ab632a9b914875a2b30bbf5946859c352801450df35e1fdaee8107da3d1df64e"}, + {2030000, "c0b03673083146e028c609498a95e0f22ae61f06f7c961cd1ac5d8ba99c8e3c6"}, + {2040000, "f6abea5fb93bb391f24599252656d40c1d716cb18a245b200f6b70d962bf2bdf"}, + {2050000, "ab2df8795e771bb9b74e8a893f91673f9f44321844ed11d31e11270c09c6e6ae"} }; const std::initializer_list TESTNET_CHECKPOINTS = { @@ -467,7 +507,14 @@ namespace cn {875000, "91eac54f608c1d0e43111c107a2f5caf259bcbbd66714b6591cedbc64f9c4cdf"}, {900000, "a70b6df1794a6d91071cd5fc87719769bf09610d520c2c2134f53908d1e3de40"}, {925000, "a00b47f3610cfd5c509183322fca89e388c0427601ce4db7e397acbcab5a3ee6"}, - {950000, "387573b7b9bdbc1d79c28156cf15d7e08ddf248a0257b0ee7ef2731c5c7a0534"} + {950000, "387573b7b9bdbc1d79c28156cf15d7e08ddf248a0257b0ee7ef2731c5c7a0534"}, + {975000, "2bbf6d2fecb329d9c34968e60b0d2814a2d5a2f69ee872b77d152ba795e881ae"}, + {1000000, "c2627d61bd357fe38398e6fbc14c5c8510aac12934fc696bf7d7935a762f03a1"}, + {1025000, "325a7b27a91d221c58597e17a913b5bf6c79704c1b45a7849ba5d745c6f82e04"}, + {1050000, "ed30311a19f916184da2e961b7cf527114954dc954817804cc49c5f010632dea"}, + {1075000, "0da0f9185f7f32e9ef29eaebe290e1614cb85987e4fb6ba027570be3d2cc33ac"}, + {1100000, "cd87368b14488a85c2a1064ccf61855db4664919c8c2ddef1c6f088951700f19"}, + {1125000, "04c19d19ed31300a088b9485ddea0a2738821a7ea7da42f8324c8144f4e8c9c3"} }; } // namespace cn From 6bc6c7d868378ee39d20b7c2d2102c050ea21ba3 Mon Sep 17 00:00:00 2001 From: acktarius Date: Thu, 7 May 2026 14:07:21 -0400 Subject: [PATCH 14/18] update Checkpoints * Checkpoints * testnet seed node IP --- src/CryptoNoteConfig.h | 29 +++-------------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/src/CryptoNoteConfig.h b/src/CryptoNoteConfig.h index fb6b10ca..14bf63ad 100644 --- a/src/CryptoNoteConfig.h +++ b/src/CryptoNoteConfig.h @@ -1,6 +1,6 @@ // Copyright (c) 2012-2017 The Cryptonote developers // Copyright (c) 2017-2018 The Circle Foundation & Conceal Devs -// Copyright (c) 2018-2023 Conceal Network & Conceal Devs +// Copyright (c) 2018-2026 Conceal Network & Conceal Devs // // // Distributed under the MIT/X11 software license, see the accompanying @@ -141,8 +141,7 @@ namespace cn const char P2P_NET_DATA_FILENAME[] = "p2pstate.bin"; const char CRYPTONOTE_BLOCKCHAIN_INDICES_FILENAME[] = "blockchainindices.dat"; const char MINER_CONFIG_FILE_NAME[] = "miner_conf.json"; - const char CRYPTONOTE_CHECKPOINT_FILENAME[] = "checkpoint.dat"; - + } // namespace parameters const uint64_t START_BLOCK_REWARD = (UINT64_C(5000) * parameters::POINT); // start reward (Consensus I) @@ -186,15 +185,13 @@ namespace cn and the minimum version for communication between nodes */ const uint8_t P2P_VERSION_1 = 1; const uint8_t P2P_VERSION_2 = 2; - const uint8_t P2P_CURRENT_VERSION = 2; // Incremented to support checkpoint list propagation + const uint8_t P2P_CURRENT_VERSION = 1; const uint8_t P2P_MINIMUM_VERSION = 1; const uint8_t P2P_UPGRADE_WINDOW = 2; // This defines the minimum P2P version required for lite blocks propogation const uint8_t P2P_LITE_BLOCKS_PROPOGATION_VERSION = 3; - const uint8_t P2P_CHECKPOINT_LIST_VERSION = 2; - const size_t P2P_LOCAL_WHITE_PEERLIST_LIMIT = 1000; const size_t P2P_LOCAL_GRAY_PEERLIST_LIMIT = 5000; @@ -209,23 +206,6 @@ namespace cn const uint32_t P2P_DEFAULT_PING_CONNECTION_TIMEOUT = 2000; // 2 seconds const uint64_t P2P_DEFAULT_INVOKE_TIMEOUT = 60 * 2 * 1000; // 2 minutes const size_t P2P_DEFAULT_HANDSHAKE_INVOKE_TIMEOUT = 5000; // 5 seconds - const size_t P2P_CHECKPOINT_LIST_RE_REQUEST = 300; // 5 minutes - const uint32_t P2P_CHECKPOINT_PEER_MIN_UPTIME_BLOCKS = 12000; // Minimum peer uptime for checkpoint verification (mainnet: 12000 blocks × 2 min = 24000 min ≈ 16.7 days) - const uint32_t P2P_CHECKPOINT_PEER_MIN_UPTIME_BLOCKS_TESTNET = 2; // Minimum peer uptime for checkpoint verification (testnet: 6000 blocks × 2 min = 12000 min ≈ 8.3 days, relaxed for smaller network) - - // Checkpoint consensus configuration (Mainnet) - // M = minimum agreements required (all M peers must agree) - // K = total peers to sample - // n = minimum distinct /16 networks required - const uint32_t CKPT_MIN_CONSENSUS_PEERS = 6; // M: minimum agreements required - const uint32_t CKPT_CONSENSUS_PEERS = 6; // K: minimun total peers to sample - const uint32_t CKPT_MIN_DIVERSE_NETWORKS = 3; // n: minimum distinct /16 networks required - - // Checkpoint consensus configuration (Testnet - relaxed for smaller network) - const uint32_t CKPT_MIN_CONSENSUS_PEERS_TESTNET = 2; // M: minimum agreements required (testnet) - const uint32_t CKPT_CONSENSUS_PEERS_TESTNET = 2; // K: minimum total peers to sample (testnet) - increased to ask multiple peers - const uint32_t CKPT_MIN_DIVERSE_NETWORKS_TESTNET = 2; // n: minimum distinct /16 networks required (testnet) - const char P2P_STAT_TRUSTED_PUB_KEY[] = "f7061e9a5f0d30549afde49c9bfbaa52ac60afdc46304642b460a9ea34bf7a4e"; // Seed Nodes @@ -253,9 +233,6 @@ namespace cn __attribute__((unused)) #endif - const char DNS_CHECKPOINT_DOMAIN[] = "checkpoints.conceal.id"; - const char TESTNET_DNS_CHECKPOINT_DOMAIN[] = "testpoints.conceal.id"; - // Blockchain Checkpoints: // {, ""}, const std::initializer_list From 61fac4c753ad3204b4097daf963c47a87cdb1f06 Mon Sep 17 00:00:00 2001 From: "nullcrypto (Jay)" <155117721+nullcryptodev@users.noreply.github.com> Date: Tue, 28 Apr 2026 04:31:23 +0100 Subject: [PATCH 15/18] Improve wallet reset success messaging Update success message for wallet reset process. --- src/ConcealWallet/ConcealWallet.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ConcealWallet/ConcealWallet.cpp b/src/ConcealWallet/ConcealWallet.cpp index 7e0fec32..4378031c 100644 --- a/src/ConcealWallet/ConcealWallet.cpp +++ b/src/ConcealWallet/ConcealWallet.cpp @@ -770,12 +770,16 @@ bool conceal_wallet::reset(const std::vector &) m_wallet->reset(0); m_wallet->addObserver(this); - success_msg_writer(true) << "Reset completed successfully."; + success_msg_writer(true) << "Attempting wallet reset... this could take some time."; std::unique_lock lock(m_walletSynchronizedMutex); m_walletSynchronizedCV.wait(lock, [this] { return m_walletSynchronized; }); + if (m_walletSynchronized) { + success_msg_writer(true) << "Wallet reset was successful"; + } + std::cout << std::endl; return true; @@ -1833,4 +1837,4 @@ void conceal_wallet::depositUpdated(DepositId depositId) void conceal_wallet::depositsUpdated(const std::vector &depositIds) { // Nothing to do here -} \ No newline at end of file +} From 48c450145e8f1dbcc47f1b3fa47a89efe3a22235 Mon Sep 17 00:00:00 2001 From: acktarius Date: Thu, 7 May 2026 15:59:49 -0400 Subject: [PATCH 16/18] bump version to 6.7.4 and update docs --- CMakeLists.txt | 2 +- docs/rpc/check_reserve_proof.html | 4 ++-- docs/rpc/check_tx_proof.html | 4 ++-- docs/rpc/f_block_json.html | 4 ++-- docs/rpc/f_blocks_list_json.html | 4 ++-- docs/rpc/f_on_transactions_pool.html | 4 ++-- docs/rpc/f_transaction_json.html | 4 ++-- docs/rpc/getalblockslist.html | 4 ++-- docs/rpc/getblockbyheight.html | 4 ++-- docs/rpc/getblockcount.html | 4 ++-- docs/rpc/getblockhash.html | 4 ++-- docs/rpc/getblockheaderbyhash.html | 4 ++-- docs/rpc/getblockheaderbyheight.html | 4 ++-- docs/rpc/getblocktemplate.html | 4 ++-- docs/rpc/getblocktimestamp.html | 4 ++-- docs/rpc/getcurrencyid.html | 4 ++-- docs/rpc/getlastblockheader.html | 4 ++-- docs/rpc/getrawtransactionpool.html | 4 ++-- docs/rpc/getrawtransactionsbyheight.html | 4 ++-- docs/rpc/json_methods.html | 4 ++-- docs/rpc/openapi/check_reserve_proof.yaml | 2 +- docs/rpc/openapi/check_tx_proof.yaml | 2 +- docs/rpc/openapi/f_block_json.yaml | 2 +- docs/rpc/openapi/f_blocks_list_json.yaml | 2 +- docs/rpc/openapi/f_on_transactions_pool.yaml | 2 +- docs/rpc/openapi/f_transaction_json.yaml | 2 +- docs/rpc/openapi/getalblockslist.yaml | 2 +- docs/rpc/openapi/getblockbyheight.yaml | 2 +- docs/rpc/openapi/getblockcount.yaml | 2 +- docs/rpc/openapi/getblockhash.yaml | 2 +- docs/rpc/openapi/getblockheaderbyhash.yaml | 2 +- docs/rpc/openapi/getblockheaderbyheight.yaml | 2 +- docs/rpc/openapi/getblocktemplate.yaml | 2 +- docs/rpc/openapi/getblocktimestamp.yaml | 2 +- docs/rpc/openapi/getcurrencyid.yaml | 2 +- docs/rpc/openapi/getlastblockheader.yaml | 2 +- docs/rpc/openapi/getrawtransactionpool.yaml | 2 +- docs/rpc/openapi/getrawtransactionsbyheight.yaml | 2 +- docs/rpc/openapi/json_methods.yaml | 2 +- docs/rpc/openapi/submitblock.yaml | 2 +- docs/rpc/submitblock.html | 4 ++-- 41 files changed, 61 insertions(+), 61 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 24355518..014accf3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.5) include(CheckCXXCompilerFlag) -set(VERSION "6.7.4-beta.1") +set(VERSION "6.7.4") set(VERSION_BUILD_NO "Trebopala") # Packaged from main commits set(COMMIT 1db6e66) diff --git a/docs/rpc/check_reserve_proof.html b/docs/rpc/check_reserve_proof.html index 26c147b8..87078808 100644 --- a/docs/rpc/check_reserve_proof.html +++ b/docs/rpc/check_reserve_proof.html @@ -357,7 +357,7 @@ 55.627 l 55.6165,55.627 -231.245496,231.24803 c -127.185,127.1864 -231.5279,231.248 -231.873,231.248 -0.3451,0 -104.688, -104.0616 -231.873,-231.248 z - " fill="currentColor">

Conceal Core API Documentation (6.7.3)

Download OpenAPI specification:Download

Conceal Core API Documentation (6.7.4)

Download OpenAPI specification:Download

API documentation for Conceal Core

JSON-RPC

Check Reserve Proof

Check the reserve proof using JSON-RPC.

@@ -369,7 +369,7 @@ " class="sc-iJCSeZ sc-cBornZ gJcGEt hchhAE">

Testnet local node

http://localhost:16600/json_rpc

Request samples

Content type
application/json
{
  • "jsonrpc": "2.0",
  • "method": "check_reserve_proof",
  • "params": {
    },
  • "id": "1"
}

Response samples

Content type
application/json
{
  • "jsonrpc": "2.0",
  • "result": {
    },
  • "id": "1"
}