From 3d7e7166f24810806c68f76046490a07dbe73e3b Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 17:54:52 +0100 Subject: [PATCH 01/66] Add TESTNET flag to build workflows and Makefile Introduces a TESTNET variable to the Makefile and passes it from GitHub Actions workflows based on the chain-network input. Updates CMake build commands to include the TESTNET flag, improves help output formatting, and comments out unused genesis targets for clarity. --- .github/workflows/build-linux.yml | 2 +- .github/workflows/build-macos-arm64.yml | 2 +- .github/workflows/build-macos-intel.yml | 2 +- Makefile | 53 ++++++++++++++----------- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index cbf8df4f..358c8819 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -31,7 +31,7 @@ jobs: cache_packages: true - name: Compile Release - run: make gcc-linux-amd64-release + run: make gcc-linux-amd64-release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index a5f3cde0..15d75b10 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -29,7 +29,7 @@ jobs: cache_packages: true - name: Compile Release - run: make apple-clang-arm64-release + run: make apple-clang-arm64-release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index c81ee9a6..6151daab 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -28,7 +28,7 @@ jobs: cache_packages: true - name: Compile Release - run: make apple-clang-arm64-release + run: make apple-clang-arm64-release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts diff --git a/Makefile b/Makefile index 589a5afb..d8651f48 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,7 @@ # Default to “unknown” – will be overwritten below. CPU_CORES := 1 +TESTNET ?= 0 # ----------------------------------------------------------------- # Unix‑like systems (Linux, macOS, *BSD, etc.) @@ -47,19 +48,19 @@ ifeq ($(OS),Windows_NT) endif endif -testnet-genesis-new: - $(eval command += $(cmake_release) $(testnet)) - $(call CMAKE,$(dir_release),$(command) -DGENERATE_PREMINE_WALLET=1 -DPREMINE_WALLET_PASSWORD=12345678) && cmake --build ./src --target premine_wallet || true - $(eval command += $(cmake_release) $(testnet)) - $(call CMAKE,$(dir_release),$(command) -DGENERATE_FRESH_GENESIS=1) && cmake --build ./src --target genesis_generator - $(eval command += $(cmake_release) $(testnet)) - $(call CMAKE,$(dir_release),$(command)) && $(MAKE) - -genesis-new: - $(eval command += $(cmake_release)) - $(call CMAKE,$(dir_release),$(command) -DGENERATE_FRESH_GENESIS=1) && cmake --build ./src --target genesis_generator - $(eval command += $(cmake_release)) - $(call CMAKE,$(dir_release),$(command)) && $(MAKE) +#testnet-genesis-new: +# $(eval command += $(cmake_release) $(testnet)) +# $(call CMAKE,$(dir_release),$(command) -DGENERATE_PREMINE_WALLET=1 -DPREMINE_WALLET_PASSWORD=12345678) && cmake --build ./src --target premine_wallet || true +# $(eval command += $(cmake_release) $(testnet)) +# $(call CMAKE,$(dir_release),$(command) -DGENERATE_FRESH_GENESIS=1) && cmake --build ./src --target genesis_generator +# $(eval command += $(cmake_release) $(testnet)) +# $(call CMAKE,$(dir_release),$(command)) && $(MAKE) +# +#genesis-new: +# $(eval command += $(cmake_release)) +# $(call CMAKE,$(dir_release),$(command) -DGENERATE_FRESH_GENESIS=1) && cmake --build ./src --target genesis_generator +# $(eval command += $(cmake_release)) +# $(call CMAKE,$(dir_release),$(command)) && $(MAKE) # ----------------------------------------------------------------- # Safety net – ensure we always have a positive integer. @@ -79,20 +80,20 @@ all: help release: conan-profile-detect @echo "Building profile: release" CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release --build=missing -s build_type=Release - cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release + cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DTESTNET=$(TESTNET) cmake --build build/release --config=Release --parallel=$(CPU_CORES) debug: conan-profile-detect @echo "Building profile: debug" CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/debug --build=missing -s build_type=Debug - cmake -S . -B build/debug -DCMAKE_TOOLCHAIN_FILE=build/debug/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug + cmake -S . -B build/debug -DCMAKE_TOOLCHAIN_FILE=build/debug/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug -DTESTNET=$(TESTNET) cmake --build build/debug --config=Debug --parallel=$(CPU_CORES) static: static-release static-release: conan-profile-detect @echo "Building profile: release-static" CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release-static --build=missing - cmake -S . -B build/release-static -DCMAKE_TOOLCHAIN_FILE=build/release-static/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -D STATIC=ON + cmake -S . -B build/release-static -DCMAKE_TOOLCHAIN_FILE=build/release-static/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -D STATIC=ON -DTESTNET=$(TESTNET) cmake --build build/release-static --config=Release --parallel=$(CPU_CORES) conan-profile-detect: @@ -106,18 +107,22 @@ conan-profile-detect: $(PROFILES): conan-profile-detect @echo "Building profile: $@" CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/$@ --profile=cmake/profiles/$@ --build=missing - cmake -S . -B build/$@ -DCMAKE_TOOLCHAIN_FILE=build/$@/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release + cmake -S . -B build/$@ -DCMAKE_TOOLCHAIN_FILE=build/$@/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DTESTNET=$(TESTNET) cmake --build build/$@ --config=Release --parallel=$(CPU_CORES) help: @echo "Available targets:" - @printf " %-22s %s\n" "all:" "Build all profiles" - @printf " %-22s %s\n" "clean:" "Clean all build directories" - @printf " %-22s %s\n" "release:" "Build release" - @printf " %-22s %s\n" "static:" "Build static release" - @printf " %-22s %s\n" "debug:" "Build debug" - @$(foreach profile,$(SORTED_PROFILES),printf " %-22s %s\n" "make $(profile):" "Build the $(profile) profile";) - @printf " %-22s %s\n" "help:" "Show this help message" + @printf " %-42s %s\n" "make clean" "Clean all build directories" + @printf " %-42s %s\n" "make release" "Build release" + @printf " %-42s %s\n" "make static" "Build static release" + @printf " %-42s %s\n" "make debug" "Build debug" + @printf " %-42s %s\n" "make test" "Build & run tests" + @printf " %-42s %s\n" "make docs" "Builds offline documentation website" + @printf " %-42s %s\n" "make docs-dev" "Runs local doc server, for editing/adding docs" + @printf " %-42s %s\n" "make conan-profile-detect" "Creates host config" + @printf " %-42s %s\n" "make configure" "Runs a cmake configure within conan build flow" + @$(foreach profile,$(SORTED_PROFILES),printf " %-42s %s\n" "make $(profile)" "Build the $(profile) profile";) + @printf " %-42s %s\n" "make help" "Show this help message" # # Tests From 007d9fbd49db4f4b70a24a6cdcb4a6473207f466 Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 17:55:07 +0100 Subject: [PATCH 02/66] Update build-windows.yml --- .github/workflows/build-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index a1182673..94514901 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -28,7 +28,7 @@ jobs: cache_packages: true - name: Compile Release - run: make msvc-194-amd64-release + run: make msvc-194-amd64-release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts From 7b18c06d2fbd07b030f2f70c9128dd3e19875b1e Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 17:55:34 +0100 Subject: [PATCH 03/66] Refactor genesis and premine wallet config to separate file Moved genesis block and premine wallet generation logic from src/CMakeLists.txt to a new cmake/ChainConfig.cmake file. This improves modularity and keeps the main CMakeLists.txt cleaner by isolating chain configuration options and related commands. --- cmake/ChainConfig.cmake | 64 +++++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 64 +---------------------------------------- 2 files changed, 65 insertions(+), 63 deletions(-) create mode 100644 cmake/ChainConfig.cmake diff --git a/cmake/ChainConfig.cmake b/cmake/ChainConfig.cmake new file mode 100644 index 00000000..ac24b9c2 --- /dev/null +++ b/cmake/ChainConfig.cmake @@ -0,0 +1,64 @@ + + +include_directories (${CMAKE_BINARY_DIR}/src ${CMAKE_BINARY_DIR}/src/currency_core) +include(${CMAKE_SOURCE_DIR}/cmake/config-vars.cmake) +include(${CMAKE_SOURCE_DIR}/cmake/currency_configs/example.cmake) +include(${CMAKE_SOURCE_DIR}/cmake/check-config-vars.cmake) +configure_file("currency_core/currency_config.h.in" "currency_core/currency_config.h") + +# CAUTION - wallet generation will only work properly in UNIX line environment +set(GENERATE_FRESH_GENESIS OFF CACHE BOOL "Generate new genesis block") + +set(GENESIS_PREMINE_ADDRESS "" CACHE STRING "Premine wallet address") +set(GENESIS_PROOF "" CACHE STRING "Genesis proof string") + +set(GENERATE_PREMINE_WALLET OFF CACHE BOOL "Generate premine wallet") +set(PREMINE_WALLET_PASSWORD "" CACHE STRING "Premine wallet password") + +if (GENERATE_PREMINE_WALLET AND GENERATE_FRESH_GENESIS) + message(FATAL_ERROR "Genesis can be generatet together with premine wallet") +endif() + +if (GENERATE_PREMINE_WALLET) + unset(GENERATE_PREMINE_WALLET CACHE) + message(WARNING "Generating premine wallet") + + if (NOT DEFINED PREMINE_WALLET_PASSWORD OR PREMINE_WALLET_PASSWORD STREQUAL "") + message(FATAL_ERROR "set PREMINE_WALLET_PASSWORD or GENESIS_PREMINE_ADDRESS to generate genesis block") + endif() + + # Make wallet directory + add_custom_target( + premine_wallet + "${CMAKE_COMMAND}" -E make_directory "${CMAKE_SOURCE_DIR}/premine_wallet" + COMMENT "Creating premine wallet directory" + ) + + # Generate wallet + add_custom_command(TARGET premine_wallet POST_BUILD + COMMAND echo ${PREMINE_WALLET_PASSWORD} | ${CMAKE_BINARY_DIR}/src/simplewallet --generate-new-wallet ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet + COMMENT "Generating premine wallet in ${CMAKE_SOURCE_DIR}/premine_wallet" + ) + + add_dependencies(premine_wallet simplewallet) +endif() + +if (GENERATE_FRESH_GENESIS) + unset(GENERATE_FRESH_GENESIS CACHE) + add_executable(genesis_generator ${GENESIS_GENERATOR}) + target_link_libraries(genesis_generator currency_core crypto common zlibstatic ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) + + if (NOT DEFINED GENESIS_PREMINE_ADDRESS OR GENESIS_PREMINE_ADDRESS STREQUAL "") + message(WARNING "GENESIS_PREMINE_ADDRESS not set, loading from ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet.address") + file(READ "${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet.address" GENESIS_PREMINE_ADDRESS) + if (NOT DEFINED GENESIS_PREMINE_ADDRESS OR GENESIS_PREMINE_ADDRESS STREQUAL "") + message(FATAL_ERROR "GENESIS_PREMINE_ADDRESS not set") + endif() + else() + add_custom_command(TARGET genesis_generator POST_BUILD + COMMAND ${CMAKE_BINARY_DIR}/src/genesis_generator --address ${GENESIS_PREMINE_ADDRESS} --proof ${GENESIS_PROOF} --output ${CMAKE_SOURCE_DIR}/src/currency_core/generated/ + COMMENT "Generating genesis data in ${CMAKE_SOURCE_DIR}/src/currency_core/" + ) + endif() + +endif() \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0a55cdf7..9e081b91 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -50,12 +50,7 @@ MACRO(ENABLE_SHARED_PCH_EXECUTABLE target) ENDMACRO(ENABLE_SHARED_PCH_EXECUTABLE) ##### End of Precompiled Headers macros ###### -include_directories (${CMAKE_BINARY_DIR}/src ${CMAKE_BINARY_DIR}/src/currency_core) -include(../cmake/config-vars.cmake) -include(../cmake/currency_configs/example.cmake) -include(../cmake/check-config-vars.cmake) -configure_file("currency_core/currency_config.h.in" "currency_core/currency_config.h") - +include(ChainConfig) file(GLOB_RECURSE PCH pch/*) file(GLOB_RECURSE COMMON common/*) @@ -162,63 +157,6 @@ ENABLE_SHARED_PCH(stratum STRATUM) target_link_libraries(currency_core lmdb mdbx) -# CAUTION - wallet generation will only work properly in UNIX line environment -set(GENERATE_FRESH_GENESIS OFF CACHE BOOL "Generate new genesis block") - -set(GENESIS_PREMINE_ADDRESS "" CACHE STRING "Premine wallet address") -set(GENESIS_PROOF "" CACHE STRING "Genesis proof string") - -set(GENERATE_PREMINE_WALLET OFF CACHE BOOL "Generate premine wallet") -set(PREMINE_WALLET_PASSWORD "" CACHE STRING "Premine wallet password") - -if (GENERATE_PREMINE_WALLET AND GENERATE_FRESH_GENESIS) - message(FATAL_ERROR "Genesis can be generatet together with premine wallet") -endif() - -if (GENERATE_PREMINE_WALLET) - unset(GENERATE_PREMINE_WALLET CACHE) - message(WARNING "Generating premine wallet") - - if (NOT DEFINED PREMINE_WALLET_PASSWORD OR PREMINE_WALLET_PASSWORD STREQUAL "") - message(FATAL_ERROR "set PREMINE_WALLET_PASSWORD or GENESIS_PREMINE_ADDRESS to generate genesis block") - endif() - - # Make wallet directory - add_custom_target( - premine_wallet - "${CMAKE_COMMAND}" -E make_directory "${CMAKE_SOURCE_DIR}/premine_wallet" - COMMENT "Creating premine wallet directory" - ) - - # Generate wallet - add_custom_command(TARGET premine_wallet POST_BUILD - COMMAND echo ${PREMINE_WALLET_PASSWORD} | ${CMAKE_BINARY_DIR}/src/simplewallet --generate-new-wallet ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet - COMMENT "Generating premine wallet in ${CMAKE_SOURCE_DIR}/premine_wallet" - ) - - add_dependencies(premine_wallet simplewallet) -endif() - -if (GENERATE_FRESH_GENESIS) - unset(GENERATE_FRESH_GENESIS CACHE) - add_executable(genesis_generator ${GENESIS_GENERATOR}) - target_link_libraries(genesis_generator currency_core crypto common zlibstatic ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) - - if (NOT DEFINED GENESIS_PREMINE_ADDRESS OR GENESIS_PREMINE_ADDRESS STREQUAL "") - message(WARNING "GENESIS_PREMINE_ADDRESS not set, loading from ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet.address") - file(READ "${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet.address" GENESIS_PREMINE_ADDRESS) - if (NOT DEFINED GENESIS_PREMINE_ADDRESS OR GENESIS_PREMINE_ADDRESS STREQUAL "") - message(FATAL_ERROR "GENESIS_PREMINE_ADDRESS not set") - endif() - else() - add_custom_command(TARGET genesis_generator POST_BUILD - COMMAND ${CMAKE_BINARY_DIR}/src/genesis_generator --address ${GENESIS_PREMINE_ADDRESS} --proof ${GENESIS_PROOF} --output ${CMAKE_SOURCE_DIR}/src/currency_core/generated/ - COMMENT "Generating genesis data in ${CMAKE_SOURCE_DIR}/src/currency_core/" - ) - endif() - -endif() - add_executable(daemon ${DAEMON} ${P2P} ${CURRENCY_PROTOCOL}) add_dependencies(daemon version) target_link_libraries(daemon rpc stratum currency_core crypto common miniupnpc::miniupnpc ZLIB::ZLIB ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) From ac6778dc3458de4b111983c89d1a475255ce73a1 Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 17:55:51 +0100 Subject: [PATCH 04/66] Remove qt-daemon GUI source files Deleted all files related to the qt-daemon GUI, including source code, resources, and configuration files. This removes the Qt-based GUI application from the project. --- src/gui/qt-daemon/.gitignore | 1 - src/gui/qt-daemon/Info.plist.in | 63 - src/gui/qt-daemon/app.icns | Bin 89211 -> 0 bytes src/gui/qt-daemon/app.ico | Bin 111606 -> 0 bytes src/gui/qt-daemon/app.qrc | 5 - src/gui/qt-daemon/app.rc | 2 - src/gui/qt-daemon/application/gui_utils.cpp | 320 --- src/gui/qt-daemon/application/gui_utils.h | 14 - src/gui/qt-daemon/application/mainwindow.cpp | 2509 ----------------- src/gui/qt-daemon/application/mainwindow.h | 363 --- .../application/notification_helper.h | 21 - .../application/notification_helper.mm | 14 - .../qt-daemon/application/urleventfilter.cpp | 21 - .../qt-daemon/application/urleventfilter.h | 17 - src/gui/qt-daemon/main.cpp | 77 - src/gui/qt-daemon/qtlogger.h | 133 - 16 files changed, 3560 deletions(-) delete mode 100644 src/gui/qt-daemon/.gitignore delete mode 100644 src/gui/qt-daemon/Info.plist.in delete mode 100644 src/gui/qt-daemon/app.icns delete mode 100644 src/gui/qt-daemon/app.ico delete mode 100644 src/gui/qt-daemon/app.qrc delete mode 100644 src/gui/qt-daemon/app.rc delete mode 100644 src/gui/qt-daemon/application/gui_utils.cpp delete mode 100644 src/gui/qt-daemon/application/gui_utils.h delete mode 100644 src/gui/qt-daemon/application/mainwindow.cpp delete mode 100644 src/gui/qt-daemon/application/mainwindow.h delete mode 100644 src/gui/qt-daemon/application/notification_helper.h delete mode 100644 src/gui/qt-daemon/application/notification_helper.mm delete mode 100644 src/gui/qt-daemon/application/urleventfilter.cpp delete mode 100644 src/gui/qt-daemon/application/urleventfilter.h delete mode 100644 src/gui/qt-daemon/main.cpp delete mode 100644 src/gui/qt-daemon/qtlogger.h diff --git a/src/gui/qt-daemon/.gitignore b/src/gui/qt-daemon/.gitignore deleted file mode 100644 index 8a9d35c8..00000000 --- a/src/gui/qt-daemon/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.user diff --git a/src/gui/qt-daemon/Info.plist.in b/src/gui/qt-daemon/Info.plist.in deleted file mode 100644 index 8b33aed9..00000000 --- a/src/gui/qt-daemon/Info.plist.in +++ /dev/null @@ -1,63 +0,0 @@ - - - - - LSEnvironment - - - BuildMachineOSBuild - 14E46 - CFBundleDevelopmentRegion - English - CFBundleExecutable - Zano - CFBundleIconFile - app.icns - CFBundleInfoDictionaryVersion - 6.0 - CFBundleLongVersionString - - CFBundlePackageType - APPL - CFBundleSignature - ???? - CFBundleVersion - - CFBundleIdentifier - Zano - CSResourcesFileMapped - - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 6E35b - DTPlatformVersion - GM - DTSDKBuild - 14D125 - DTSDKName - macosx10.10 - DTXcode - 0640 - DTXcodeBuild - 6E35b - LSRequiresCarbon - - NSHumanReadableCopyright - - NSHighResolutionCapable - True - CFBundleURLTypes - - - CFBundleURLName - ZanoApp - CFBundleURLSchemes - - zano - - - - - - diff --git a/src/gui/qt-daemon/app.icns b/src/gui/qt-daemon/app.icns deleted file mode 100644 index 50e0fad5ce9a7d429e6ecacfd5dde34033e2cbe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89211 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�ZNBIeijYhp_bRpQ|mv?{vWwIeS;79xo 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

rQmYP#m8;nJ&9s{|A8U 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 diff --git a/src/gui/qt-daemon/app.qrc b/src/gui/qt-daemon/app.qrc deleted file mode 100644 index b828a450..00000000 --- a/src/gui/qt-daemon/app.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - app.ico - - \ No newline at end of file diff --git a/src/gui/qt-daemon/app.rc b/src/gui/qt-daemon/app.rc deleted file mode 100644 index 05c8afbc..00000000 --- a/src/gui/qt-daemon/app.rc +++ /dev/null @@ -1,2 +0,0 @@ - -IDI_ICON1 ICON DISCARDABLE "app.ico" \ No newline at end of file diff --git a/src/gui/qt-daemon/application/gui_utils.cpp b/src/gui/qt-daemon/application/gui_utils.cpp deleted file mode 100644 index 1a7b66bc..00000000 --- a/src/gui/qt-daemon/application/gui_utils.cpp +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright (c) 2011-2013 The Bitcoin Core developers -// Copyright (c) 2015 Boolberry developers -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include "gui_utils.h" - -// #include -#include -// #include -// #include -// #include -// #include -// #include -// #include -// #include -// #include -#include -// #include // for Qt::mightBeRichText -// #include - -// #if QT_VERSION < 0x050000 -// #include -// #else -// #include -// #endif -#include -#include -#include "currency_core/currency_config.h" -#define GUI_LINK_NAME "Zano" - -#ifdef WIN32 -#ifdef _WIN32_WINNT -#undef _WIN32_WINNT -#endif -#define _WIN32_WINNT 0x0501 -#ifdef _WIN32_IE -#undef _WIN32_IE -#endif -#define _WIN32_IE 0x0501 -#define WIN32_LEAN_AND_MEAN 1 -#ifndef NOMINMAX -#define NOMINMAX -#endif -#include -#include -#include -#include -#endif - -#include -#include -#if BOOST_FILESYSTEM_VERSION >= 3 -#include -#endif -#include - -#ifndef MAX_PATH -#define MAX_PATH 1000 -#endif - -#if BOOST_FILESYSTEM_VERSION >= 3 -static boost::filesystem::detail::utf8_codecvt_facet utf8; -#endif - - - -namespace gui_tools -{ - -#ifdef WIN32 - boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate = true) - { - namespace fs = boost::filesystem; - - wchar_t pszPath[MAX_PATH] = L""; - - if (SHGetSpecialFolderPathW(NULL, pszPath, nFolder, fCreate)) - { - return fs::path(pszPath); - } - - //LogPrintf("SHGetSpecialFolderPathW() failed, could not obtain requested path.\n"); - return fs::path(""); - } -#endif -#ifdef WIN32 - boost::filesystem::path static StartupShortcutPath() - { - return GetSpecialFolderPath(CSIDL_STARTUP) / GUI_LINK_NAME ".lnk"; - } - - bool GetStartOnSystemStartup() - { - // check for Bitcoin*.lnk - return boost::filesystem::exists(StartupShortcutPath()); - } - - bool SetStartOnSystemStartup(bool fAutoStart) - { - // If the shortcut exists already, remove it for updating - boost::system::error_code ec; - std::wstring shrtcut_path = StartupShortcutPath().c_str(); - boost::filesystem::remove(shrtcut_path.c_str(), ec); - if (ec) - { - //LOG_ERROR("Autostart disable failed: " << ec.message()); - } - - if (fAutoStart) - { - CoInitialize(NULL); - - // Get a pointer to the IShellLink interface. - IShellLink* psl = NULL; - HRESULT hres = CoCreateInstance(CLSID_ShellLink, NULL, - CLSCTX_INPROC_SERVER, IID_IShellLink, - reinterpret_cast(&psl)); - - if (SUCCEEDED(hres)) - { - // Get the current executable path - TCHAR pszExePath[MAX_PATH]; - GetModuleFileName(NULL, pszExePath, sizeof(pszExePath)); - - // Start client minimized - //QString strArgs = "-min"; - // Set -testnet /-regtest options - //strArgs += QString::fromStdString(strprintf(" -testnet=%d -regtest=%d", GetBoolArg("-testnet", false), GetBoolArg("-regtest", false))); - -//#ifdef UNICODE -// boost::scoped_array args(new TCHAR[strArgs.length() + 1]); - // Convert the QString to TCHAR* -// strArgs.toWCharArray(args.get()); - // Add missing '\0'-termination to string -// args[strArgs.length()] = '\0'; -//#endif - - // Set the path to the shortcut target - psl->SetPath(pszExePath); - PathRemoveFileSpec(pszExePath); - psl->SetWorkingDirectory(pszExePath); - psl->SetShowCmd(SW_SHOWMINNOACTIVE); -//#ifndef UNICODE -// psl->SetArguments(strArgs.toStdString().c_str()); -//#else -// psl->SetArguments(args.get()); -//#endif - - // Query IShellLink for the IPersistFile interface for - // saving the shortcut in persistent storage. - IPersistFile* ppf = NULL; - hres = psl->QueryInterface(IID_IPersistFile, reinterpret_cast(&ppf)); - if (SUCCEEDED(hres)) - { - WCHAR pwsz[MAX_PATH]; - // Ensure that the string is ANSI. - MultiByteToWideChar(CP_ACP, 0, StartupShortcutPath().string().c_str(), -1, pwsz, MAX_PATH); - // Save the link by calling IPersistFile::Save. - hres = ppf->Save(pwsz, TRUE); - ppf->Release(); - psl->Release(); - CoUninitialize(); - return true; - } - psl->Release(); - } - CoUninitialize(); - return false; - } - return true; - } -#elif defined(Q_OS_LINUX) - - // Follow the Desktop Application Autostart Spec: - // http://standards.freedesktop.org/autostart-spec/autostart-spec-latest.html - - boost::filesystem::path static GetAutostartDir() - { - namespace fs = boost::filesystem; - - char* pszConfigHome = getenv("XDG_CONFIG_HOME"); - if (pszConfigHome) return fs::path(pszConfigHome) / "autostart"; - char* pszHome = getenv("HOME"); - if (pszHome) return fs::path(pszHome) / ".config" / "autostart"; - return fs::path(); - } - - boost::filesystem::path static GetAutostartFilePath() - { - return GetAutostartDir() / GUI_LINK_NAME ".desktop"; - } - - bool GetStartOnSystemStartup() - { - boost::filesystem::ifstream optionFile(GetAutostartFilePath()); - if (!optionFile.good()) - return false; - // Scan through file for "Hidden=true": - std::string line; - while (!optionFile.eof()) - { - getline(optionFile, line); - if (line.find("Hidden") != std::string::npos && - line.find("true") != std::string::npos) - return false; - } - optionFile.close(); - - return true; - } - - bool SetStartOnSystemStartup(bool fAutoStart) - { - if (!fAutoStart) - boost::filesystem::remove(GetAutostartFilePath()); - else - { - char pszExePath[MAX_PATH + 1]; - memset(pszExePath, 0, sizeof(pszExePath)); - if (readlink("/proc/self/exe", pszExePath, sizeof(pszExePath)-1) == -1) - return false; - - boost::filesystem::create_directories(GetAutostartDir()); - - boost::filesystem::ofstream optionFile(GetAutostartFilePath(), std::ios_base::out | std::ios_base::trunc); - if (!optionFile.good()) - return false; - // Write a bitcoin.desktop file to the autostart directory: - optionFile << "[Desktop Entry]\n"; - optionFile << "Type=Application\n"; - optionFile << "Name=" << CURRENCY_NAME_BASE << "\n"; - optionFile << "Exec=" << pszExePath << "\n"; - optionFile << "Terminal=false\n"; - optionFile << "Hidden=false\n"; - optionFile.close(); - } - return true; - } - - -#elif defined(Q_OS_MAC) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" - // based on: https://github.com/Mozketo/LaunchAtLoginController/blob/master/LaunchAtLoginController.m - -#include -#include - - LSSharedFileListItemRef findStartupItemInList(LSSharedFileListRef list, CFURLRef findUrl); - LSSharedFileListItemRef findStartupItemInList(LSSharedFileListRef list, CFURLRef findUrl) - { - SInt32 macos_ver_maj, macos_ver_min; - Gestalt(gestaltSystemVersionMajor, &macos_ver_maj); // very old and deprecated, consider change - Gestalt(gestaltSystemVersionMinor, &macos_ver_min); // very old and deprecated, consider change - - // loop through the list of startup items and try to find the bitcoin app - CFArrayRef listSnapshot = LSSharedFileListCopySnapshot(list, NULL); - for(int i = 0; i < CFArrayGetCount(listSnapshot); i++) { - LSSharedFileListItemRef item = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(listSnapshot, i); - UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes; - CFURLRef currentItemURL = NULL; - -#if defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED >= 10100 - if (&LSSharedFileListItemCopyResolvedURL != NULL && (macos_ver_maj > 10 || (macos_ver_maj == 10 && macos_ver_min >= 10))) - currentItemURL = LSSharedFileListItemCopyResolvedURL(item, resolutionFlags, NULL); // this is available only on macOS 10.10-10.11 (then deprecated) -#if defined(MAC_OS_X_VERSION_MIN_REQUIRED) && MAC_OS_X_VERSION_MIN_REQUIRED < 10100 - else - LSSharedFileListItemResolve(item, resolutionFlags, ¤tItemURL, NULL); -#endif -#else - LSSharedFileListItemResolve(item, resolutionFlags, ¤tItemURL, NULL); -#endif - - if(currentItemURL && CFEqual(currentItemURL, findUrl)) { - // found - CFRelease(currentItemURL); - return item; - } - if(currentItemURL) { - CFRelease(currentItemURL); - } - } - return NULL; - } - - bool GetStartOnSystemStartup() - { - CFURLRef bitcoinAppUrl = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); - LSSharedFileListItemRef foundItem = findStartupItemInList(loginItems, bitcoinAppUrl); - return !!foundItem; // return boolified object - } - - bool SetStartOnSystemStartup(bool fAutoStart) - { - CFURLRef bitcoinAppUrl = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); - LSSharedFileListItemRef foundItem = findStartupItemInList(loginItems, bitcoinAppUrl); - - if(fAutoStart && !foundItem) { - // add bitcoin app to startup item list - LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst, NULL, NULL, bitcoinAppUrl, NULL, NULL); - } - else if(!fAutoStart && foundItem) { - // remove item - LSSharedFileListItemRemove(loginItems, foundItem); - } - return true; - } -#pragma GCC diagnostic pop -#else - - bool GetStartOnSystemStartup() { return false; } - bool SetStartOnSystemStartup(bool fAutoStart) { return false; } - -#endif -} diff --git a/src/gui/qt-daemon/application/gui_utils.h b/src/gui/qt-daemon/application/gui_utils.h deleted file mode 100644 index 0350cb16..00000000 --- a/src/gui/qt-daemon/application/gui_utils.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) 2011-2013 The Bitcoin Core developers -// Copyright (c) 2015 Boolberry developers -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#pragma once - -namespace gui_tools -{ - bool GetStartOnSystemStartup(); - bool SetStartOnSystemStartup(bool fAutoStart); -} \ No newline at end of file diff --git a/src/gui/qt-daemon/application/mainwindow.cpp b/src/gui/qt-daemon/application/mainwindow.cpp deleted file mode 100644 index 97bf0397..00000000 --- a/src/gui/qt-daemon/application/mainwindow.cpp +++ /dev/null @@ -1,2509 +0,0 @@ -// Copyright (c) 2014-2024 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include -#include -#include -#include -#include - -#include "string_coding.h" -#include "gui_utils.h" -#include "notification_helper.h" -#include "common/config_encrypt_helper.h" -#include "currency_core/basic_kv_structs.h" - -#define PREPARE_ARG_FROM_JSON(arg_type, var_name) \ - arg_type var_name = AUTO_VAL_INIT(var_name); \ - view::api_response default_ar = AUTO_VAL_INIT(default_ar); \ - LOG_PRINT_BLUE("[REQUEST]: " << param.toStdString(), LOG_LEVEL_3); \ -if (!epee::serialization::load_t_from_json(var_name, param.toStdString())) \ -{ \ - default_ar.error_code = API_RETURN_CODE_BAD_ARG; \ - return MAKE_RESPONSE(default_ar); \ -} - -template -QString make_response(const T& r) -{ - std::string str = epee::serialization::store_t_to_json(r); - LOG_PRINT_BLUE("[RESPONSE]: " << str, LOG_LEVEL_3); - return str.c_str(); -} - -template -QString make_response_dbg(const T& r, const std::string& location) -{ - std::string str = epee::serialization::store_t_to_json(r); - LOG_PRINT_YELLOW("***** API RESPONSE from " << location << " : " << ENDL << str, LOG_LEVEL_0); - return str.c_str(); -} - -#define PREPARE_RESPONSE(rsp_type, var_name) view::api_response_t var_name = AUTO_VAL_INIT(var_name) -#define MAKE_RESPONSE(r) (r.error_code == API_RETURN_CODE_OK || r.error_code == API_RETURN_CODE_TRUE) ? make_response(r) : make_response_dbg(r, LOCATION_STR) - -#define LOG_API_TIMING() const char* pfunc_call_name = LOCAL_FUNCTION_DEF__; LOG_PRINT_BLUE("[API:" << pfunc_call_name << "]-->>", LOG_LEVEL_0); uint64_t ticks_before_start = epee::misc_utils::get_tick_count(); \ - auto cb_leave = epee::misc_utils::create_scope_leave_handler([&ticks_before_start, &pfunc_call_name](){ \ - LOG_PRINT_BLUE("[API:" << pfunc_call_name << "]<<-- (" << epee::misc_utils::get_tick_count() - ticks_before_start << "ms)" << (epee::misc_utils::get_tick_count() - ticks_before_start > 1000 ? "[!!!LONG CALL!!!]":""), LOG_LEVEL_0); \ - }); - -#define LOG_API_PARAMS(log_level) LOG_PRINT_BLUE(LOCAL_FUNCTION_DEF__ << "(" << param.toStdString() << ")", log_level) - -#define CATCH_ENTRY_FAIL_API_RESPONCE() } \ - catch (const std::exception& ex) \ - { \ - LOG_ERROR("Exception catched, ERROR:" << ex.what()); \ - PREPARE_RESPONSE(view::api_void, err_resp); \ - err_resp.error_code = API_RETURN_CODE_INTERNAL_ERROR; \ - return MAKE_RESPONSE(err_resp); \ - } \ - catch(...) \ - { \ - PREPARE_RESPONSE(view::api_void, err_resp); \ - err_resp.error_code = API_RETURN_CODE_INTERNAL_ERROR; \ - return MAKE_RESPONSE(err_resp); \ - } - -#include "mainwindow.h" -// -// void MediatorObject::from_html_to_c(const QString &text) -// { -// from_c_to_html(text); -// } -// -// template -// struct InvokeWrapper { -// R *receiver; -// void (C::*memberFun)(Arg); -// void operator()(Arg result) { -// (receiver->*memberFun)(result); -// } -// }; -// -// template -// InvokeWrapper invoke(R *receiver, void (C::*memberFun)(Arg)) -// { -// InvokeWrapper wrapper = { receiver, memberFun }; -// return wrapper; -// } - - -std::wstring convert_to_lower_via_qt(const std::wstring& w) -{ - std::wstring r; - return QString().fromStdWString(w).toLower().toStdWString(); -} - -MainWindow::MainWindow() - : m_gui_deinitialize_done_1(false) - , m_backend_stopped_2(false) - , m_system_shutdown(false) - , m_view(nullptr) - , m_channel(nullptr) - , m_ui_dispatch_id_counter(0) -{ -#ifndef _MSC_VER - //workaround for macos broken tolower from std, very dirty hack - bc_services::set_external_to_low_converter(convert_to_lower_via_qt); -#endif -} - -MainWindow::~MainWindow() -{ - m_backend.subscribe_to_core_events(nullptr); - if (m_view) - { - m_view->page()->setWebChannel(nullptr); - m_view = nullptr; - } - if (m_channel) - { - m_channel->deregisterObject(this); - delete m_channel; - m_channel = nullptr; - } - if (m_ipc_worker.joinable()) - { - m_ipc_worker.join(); - } -} - -void MainWindow::on_load_finished(bool ok) -{ - TRY_ENTRY(); - LOG_PRINT("MainWindow::on_load_finished(ok = " << (ok ? "true" : "false") << ")", LOG_LEVEL_0); - CATCH_ENTRY2(void()); -} - -bool MainWindow::init_window() -{ - m_view = new QWebEngineView(this); - m_channel = new QWebChannel(m_view->page()); - m_view->page()->setWebChannel(m_channel); - - QWidget* central_widget_to_be_set = m_view; - double zoom_factor_test = 0.75; - m_view->setZoomFactor(zoom_factor_test); - - std::string qt_dev_tools_option = m_backend.get_qt_dev_tools_option(); - if (!qt_dev_tools_option.empty()) - { -#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0) - std::vector qt_dev_tools_option_parts; - boost::split(qt_dev_tools_option_parts, qt_dev_tools_option, [](char c) { return c == ','; }); - - Qt::Orientation orientation = Qt::Vertical; - if (qt_dev_tools_option_parts.size() >= 1 && qt_dev_tools_option_parts[0] == "horizontal") - orientation = Qt::Horizontal; - - double zoom_factor = 1.3; - if (qt_dev_tools_option_parts.size() >= 2) - epee::string_tools::get_xtype_from_string(zoom_factor, qt_dev_tools_option_parts[1]); - - QSplitter* spliter = new QSplitter(orientation); - spliter->addWidget(m_view); - QWebEngineView* inspector = new QWebEngineView(); - spliter->addWidget(inspector); - m_view->page()->setDevToolsPage(inspector->page()); - inspector->setZoomFactor(zoom_factor); - - spliter->setCollapsible(0, false); - spliter->setCollapsible(1, false); - - QList Sizes; - Sizes.append(0.5 * m_view->sizeHint().height()); - Sizes.append(0.5 * m_view->sizeHint().height()); - spliter->setSizes(Sizes); - - central_widget_to_be_set = spliter; -#else - LOG_ERROR("Qt Dev Tool is not available for this Qt version, try building with Qt 5.11.0 or higher"); -#endif - } - - // register QObjects to be exposed to JavaScript - m_channel->registerObject(QStringLiteral("mediator_object"), this); - - connect(m_view, SIGNAL(loadFinished(bool)), SLOT(on_load_finished(bool))); - - setCentralWidget(central_widget_to_be_set); - //this->setMouseTracking(true); - - m_view->page()->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true); - m_view->page()->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true); - m_view->page()->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true); - - m_view->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessFileUrls, true); - m_view->settings()->setAttribute(QWebEngineSettings::LocalContentCanAccessRemoteUrls, true); - m_view->settings()->setAttribute(QWebEngineSettings::LocalStorageEnabled, true); - - m_localization.resize(localization_id_couter); - m_localization[localization_id_quit] = "Quit"; - m_localization[localization_id_is_received] = " is received"; - m_localization[localization_id_is_confirmed] = " is confirmed"; - m_localization[localization_id_income_transfer_unconfirmed] = "Income transfer (unconfirmed)"; - m_localization[localization_id_income_transfer_confirmed] = "Income transfer confirmed"; - m_localization[localization_id_locked] = "(locked)"; - m_localization[localization_id_mined] = "(mined)"; - m_localization[localization_id_minimized_title] = "Zano app is minimized to tray"; - m_localization[localization_id_minimized_text] = "You can restore it with double-click or context menu"; - m_localization[localization_id_tray_menu_show] = "localization_id_tray_menu_show"; - m_localization[localization_id_tray_menu_minimize] = "localization_id_tray_menu_minimize"; - - return true; -} - -QString MainWindow::get_default_user_dir(const QString& param) -{ - TRY_ENTRY(); - return tools::get_default_user_dir().c_str(); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - - -bool MainWindow::toggle_mining(const QString& param) -{ - TRY_ENTRY(); - m_backend.toggle_pos_mining(); - return true; - CATCH_ENTRY2(false); -} - -QString MainWindow::get_exchange_last_top(const QString& params) -{ - TRY_ENTRY(); - return QString(); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_tx_pool_info(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_RESPONSE(currency::COMMAND_RPC_GET_POOL_INFO::response, ar); - ar.error_code = m_backend.get_tx_pool_info(ar.response_data); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::request_dummy(const QString& param) -{ - static int code_ = 0; - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_RESPONSE(currency::COMMAND_RPC_GET_POOL_INFO::response, ar); - if (code_ == 2) - { - code_ = -1; - ar.error_code = API_RETURN_CODE_CORE_BUSY; - } - else - { - ar.error_code = API_RETURN_CODE_OK; - } - - ++code_; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::call_rpc(const QString& params) -{ - TRY_ENTRY(); - - if (!m_backend.is_core_initialized()) - { - epee::json_rpc::error_response rsp; - rsp.jsonrpc = "2.0"; - rsp.error.code = -1; - rsp.error.message = API_RETURN_CODE_CORE_BUSY; - return QString::fromStdString(epee::serialization::store_t_to_json(static_cast(rsp))); - } - - epee::net_utils::http::http_request_info query_info = AUTO_VAL_INIT(query_info); - epee::net_utils::http::http_response_info response_info = AUTO_VAL_INIT(response_info); - currency::core_rpc_server::connection_context dummy_context(RPC_INTERNAL_UI_CONTEXT, 0, 0, true); - - query_info.m_URI = "/json_rpc"; - query_info.m_body = params.toStdString(); - - m_backend.get_rpc_server().handle_http_request(query_info, response_info, dummy_context); - if (response_info.m_response_code != 200) - { - epee::json_rpc::error_response rsp; - rsp.jsonrpc = "2.0"; - rsp.error.code = response_info.m_response_code; - rsp.error.message = response_info.m_response_comment; - return QString::fromStdString(epee::serialization::store_t_to_json(static_cast(rsp))); - } - return QString::fromStdString(response_info.m_body); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::call_wallet_rpc(const QString& wallet_id_str, const QString& params) -{ - TRY_ENTRY(); - - if (!m_backend.is_core_initialized()) - { - epee::json_rpc::error_response rsp; - rsp.jsonrpc = "2.0"; - rsp.error.code = -1; - rsp.error.message = API_RETURN_CODE_CORE_BUSY; - return QString::fromStdString(epee::serialization::store_t_to_json(static_cast(rsp))); - } - - uint64_t wallet_id = std::stoull(wallet_id_str.toStdString()); - - return QString::fromStdString(m_backend.invoke(wallet_id, params.toStdString())); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_default_fee(const QString& param) -{ - TRY_ENTRY(); - return QString(std::to_string(m_backend.get_default_fee()).c_str()); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_options(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_RESPONSE(view::gui_options, ar); - m_backend.get_gui_options(ar.response_data); - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -void MainWindow::tray_quit_requested(const QString& param) -{ - TRY_ENTRY(); - LOG_PRINT_MAGENTA("[GUI]->[HTML] tray_quit_requested", LOG_LEVEL_0); - emit quit_requested("{}"); - CATCH_ENTRY2(void()); -} - -void MainWindow::closeEvent(QCloseEvent *event) -{ - TRY_ENTRY(); - LOG_PRINT_L0("[GUI] CLOSE EVENT"); - CHECK_AND_ASSERT_MES(m_gui_deinitialize_done_1 == m_backend_stopped_2, void(), "m_gui_deinitialize_done_1 != m_backend_stopped_2, m_gui_deinitialize_done_1 = " << m_gui_deinitialize_done_1 - << "m_backend_stopped_2 = " << m_backend_stopped_2); - - - if (m_system_shutdown && !m_gui_deinitialize_done_1) - { - LOG_PRINT_MAGENTA("Shutting down without waiting response from html", LOG_LEVEL_0); - //Usually QtWebEngineProcess.exe already killed at this moment, so we won't get response from html. - m_gui_deinitialize_done_1 = true; - m_backend.send_stop_signal(); - } - else if (m_gui_deinitialize_done_1 && m_backend_stopped_2) - { - store_pos(true); - store_app_config(); - event->accept(); - } - else - { - event->ignore(); - //m_quit_requested = true; - LOG_PRINT_L0("[GUI]->[HTML] quit_requested"); - emit quit_requested("{}"); - } - CATCH_ENTRY2(void()); -} - -std::string state_to_text(int s) -{ - TRY_ENTRY(); - std::string res = epee::string_tools::int_to_hex(s); - res += "("; - if (s & Qt::WindowMinimized) - res += " WindowMinimized"; - if (s & Qt::WindowMaximized) - res += " WindowMaximized"; - if (s & Qt::WindowFullScreen) - res += " WindowFullScreen"; - if (s & Qt::WindowActive) - res += " WindowActive"; - res += ")"; - - return res; - CATCH_ENTRY2(""); -} - -void MainWindow::changeEvent(QEvent *e) -{ - TRY_ENTRY(); - switch (e->type()) - { - case QEvent::WindowStateChange: - { - QWindowStateChangeEvent* event = static_cast< QWindowStateChangeEvent* >(e); - qDebug() << "Old state: " << state_to_text(event->oldState()).c_str() << ", new state: " << state_to_text(this->windowState()).c_str(); - - if (event->oldState() & Qt::WindowMinimized && !(this->windowState() & Qt::WindowMinimized)) - { - qDebug() << "Window restored (to normal or maximized state)!"; - if (m_tray_icon) - { - //QTimer::singleShot(250, this, SLOT(show())); - } - restore_pos(); - } - else if (!(event->oldState() & Qt::WindowMinimized) && (this->windowState() & Qt::WindowMinimized)) - { - store_pos(); - qDebug() << "Window minimized"; - show_notification(m_localization[localization_id_minimized_title], m_localization[localization_id_minimized_text]); - } - else if (!(event->oldState() & Qt::WindowFullScreen) && (this->windowState() & Qt::WindowFullScreen)) - { - //maximize - store_window_pos(); - this->update(); - } - else if ((event->oldState() & Qt::WindowFullScreen) && !(this->windowState() & Qt::WindowFullScreen)) - { - //restore - this->update(); - } - - break; - } - default: - break; - } - - QWidget::changeEvent(e); - CATCH_ENTRY2(void()); -} - -bool MainWindow::store_app_config() -{ - TRY_ENTRY(); - std::string conf_path = m_backend.get_config_folder() + "/" + GUI_INTERNAL_CONFIG2; - LOG_PRINT_L0("storing gui internal config to " << conf_path); - CHECK_AND_ASSERT_MES(epee::serialization::store_t_to_json_file(m_config, conf_path), false, "failed to store gui internal config"); - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::load_app_config() -{ - TRY_ENTRY(); - std::string conf_path = m_backend.get_config_folder() + "/" + GUI_INTERNAL_CONFIG2; - LOG_PRINT_L0("loading gui internal config from " << conf_path); - bool r = epee::serialization::load_t_from_json_file(m_config, conf_path); - LOG_PRINT_L0("gui internal config " << (r ? "loaded ok" : "was not loaded")); - return r; - CATCH_ENTRY2(false); -} - -bool MainWindow::init(const std::string& html_path) -{ - TRY_ENTRY(); - //QtWebEngine::initialize(); - init_tray_icon(html_path); - set_html_path(html_path); - m_threads_pool.init(2); - m_backend.subscribe_to_core_events(this); - - bool r = QSslSocket::supportsSsl(); - if (r) - { - LOG_PRINT_GREEN("[Support SSL]: YES", LOG_LEVEL_0); - } - else - { -// QMessageBox::question(this, "OpenSSL support disabled.", "OpenSSL support disabled.", -// QMessageBox::Ok); - LOG_PRINT_RED("[Support SSL]: NO", LOG_LEVEL_0); - } - - //---- - this->setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu); - m_view->setContextMenuPolicy(Qt::ContextMenuPolicy::NoContextMenu); - - return true; - CATCH_ENTRY2(false); -} - -void MainWindow::on_menu_show(const QString& param) -{ - TRY_ENTRY(); - qDebug() << "Context menu: show()"; - this->show(); - this->activateWindow(); - CATCH_ENTRY2(void()); -} - -void MainWindow::init_tray_icon(const std::string& html_path) -{ - TRY_ENTRY(); - if (!QSystemTrayIcon::isSystemTrayAvailable()) - { - LOG_PRINT_L0("System tray is unavailable"); - return; - } - - - m_restore_action = std::unique_ptr(new QAction(tr("&Restore"), this)); - connect(m_restore_action.get(), SIGNAL(triggered()), this, SLOT(on_menu_show())); - - m_quit_action = std::unique_ptr(new QAction(tr("&Quit"), this)); - connect(m_quit_action.get(), SIGNAL(triggered()), this, SLOT(tray_quit_requested())); - - m_minimize_action = std::unique_ptr(new QAction(tr("minimizeAction"), this)); - connect(m_minimize_action.get(), SIGNAL(triggered()), this, SLOT(showMinimized())); - - m_tray_icon_menu = std::unique_ptr(new QMenu(this)); - m_tray_icon_menu->addAction(m_minimize_action.get()); - //m_tray_icon_menu->addAction(m_restore_action.get()); - m_tray_icon_menu->addSeparator(); - m_tray_icon_menu->addAction(m_quit_action.get()); - - m_tray_icon = std::unique_ptr(new QSystemTrayIcon(this)); - m_tray_icon->setContextMenu(m_tray_icon_menu.get()); - - //setup icon -#ifdef TARGET_OS_MAC - m_normal_icon_path = html_path + "/files/app22macos.png"; // X11 tray icon size is 22x22 - m_blocked_icon_path = html_path + "/files/app22macos_blocked.png"; // X11 tray icon size is 22x22 -#else - m_normal_icon_path = html_path + "/files/app22windows.png"; // X11 tray icon size is 22x22 - m_blocked_icon_path = html_path + "/files/app22windows_blocked.png"; // X11 tray icon size -#endif - //setWindowIcon(QIcon(iconPath.c_str())); - QIcon qi( QString::fromWCharArray(epee::string_encoding::utf8_to_wstring(m_normal_icon_path).c_str()) ); - qi.setIsMask(true); - m_tray_icon->setIcon(qi); - m_tray_icon->setToolTip(CURRENCY_NAME_BASE); - connect(m_tray_icon.get(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)), - this, SLOT(trayIconActivated(QSystemTrayIcon::ActivationReason))); - m_tray_icon->show(); - CATCH_ENTRY2(void()); -} - -void MainWindow::bool_toggle_icon(const QString& param) -{ - TRY_ENTRY(); - std::string path; - - if (param == "blocked") - path = m_blocked_icon_path; - else - path = m_normal_icon_path; - - QIcon qi( QString::fromWCharArray(epee::string_encoding::utf8_to_wstring(path).c_str()) ); - qi.setIsMask(true); - m_tray_icon->setIcon(qi); - CATCH_ENTRY2(void()); -} - -QString MainWindow::get_log_file(const QString& param) -{ - TRY_ENTRY(); - std::string buff; - epee::file_io_utils::load_last_n_from_file_to_string(log_space::log_singletone::get_actual_log_file_path(), 1000000, buff); - return QString::fromStdString(buff); - CATCH_ENTRY2(""); -} - -void MainWindow::store_window_pos() -{ - TRY_ENTRY(); - QPoint pos = this->pos(); - QSize sz = this->size(); - m_config.m_window_position.first = pos.x(); - m_config.m_window_position.second = pos.y(); - m_config.m_window_size.first = sz.height(); - m_config.m_window_size.second = sz.width(); - - CATCH_ENTRY2(void()); -} -void MainWindow::store_pos(bool consider_showed) -{ - TRY_ENTRY(); - m_config.is_maximazed = this->isMaximized(); - //here position supposed to be filled from last unserialize or filled on maximize handler - if (!m_config.is_maximazed) - store_window_pos(); - if (consider_showed) - m_config.is_showed = this->isVisible(); - - CATCH_ENTRY2(void()); -} -void MainWindow::restore_pos(bool consider_showed) -{ - TRY_ENTRY(); - if (consider_showed) - { - if (m_config.is_showed) - this->showNormal(); - else - this->showMinimized(); - } - - if (m_config.is_maximazed) - { - this->setWindowState(windowState() | Qt::WindowMaximized); - } - else - { - QScreen* screen = QGuiApplication::primaryScreen(); - if (!screen) - { - LOG_ERROR("No primary screen found, cannot restore window position."); - return; - } - QPoint point = screen->geometry().bottomRight(); - if (m_config.m_window_position.first + m_config.m_window_size.second > point.x() || - m_config.m_window_position.second + m_config.m_window_size.first > point.y() - ) - { - QSize sz = AUTO_VAL_INIT(sz); - sz.setHeight(770); - sz.setWidth(1200); - this->resize(sz); - store_window_pos(); - //reset position(screen changed or other reason) - } - else - { - QPoint pos = AUTO_VAL_INIT(pos); - QSize sz = AUTO_VAL_INIT(sz); - pos.setX(m_config.m_window_position.first); - pos.setY(m_config.m_window_position.second); - sz.setHeight(m_config.m_window_size.first); - sz.setWidth(m_config.m_window_size.second); - this->move(pos); - this->resize(sz); - } - } - - CATCH_ENTRY2(void()); -} -void MainWindow::trayIconActivated(QSystemTrayIcon::ActivationReason reason) -{ - TRY_ENTRY(); - if (reason == QSystemTrayIcon::ActivationReason::Trigger) - { - if ( !(this->windowState() & Qt::WindowMinimized)) - { - showMinimized(); - } - else - { - showNormal(); - activateWindow(); - } - - - } - CATCH_ENTRY2(void()); -} - -void MainWindow::load_file(const QString &fileName) -{ - TRY_ENTRY(); - LOG_PRINT_L0("Loading html from path: " << fileName.toStdString()); - QUrl url = QUrl::fromLocalFile(QFileInfo(fileName).absoluteFilePath()); - m_view->load(url); - CATCH_ENTRY2(void()); -} - -QString MainWindow::set_clipboard(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - QClipboard *clipboard = QApplication::clipboard(); - clipboard->setText(param); - return API_RETURN_CODE_OK; - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::get_clipboard(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - QClipboard *clipboard = QApplication::clipboard(); - return clipboard->text(); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::on_request_quit(const QString& param) -{ - TRY_ENTRY(); - LOG_PRINT_MAGENTA("[HTML]->[GUI] on_request_quit", LOG_LEVEL_0); - m_gui_deinitialize_done_1 = true; - m_backend.send_stop_signal(); - - return API_RETURN_CODE_OK; - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -bool MainWindow::do_close() -{ - TRY_ENTRY(); - this->close(); - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::show_inital() -{ - TRY_ENTRY(); - if (load_app_config()) - { - restore_pos(true); - } - else - { - LOG_PRINT_L1("set defaults values to config"); - m_config = AUTO_VAL_INIT(m_config); - this->show(); - QSize sz = AUTO_VAL_INIT(sz); - sz.setHeight(770); - sz.setWidth(1200); - this->resize(sz); - store_window_pos(); - m_config.is_maximazed = false; - m_config.is_showed = true; - m_config.disable_notifications = false; - } - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::on_backend_stopped() -{ - TRY_ENTRY(); - LOG_PRINT_L0("[BACKEND]->[GUI] on_backend_stopped"); - m_backend_stopped_2 = true; - //m_deinitialize_done = true; -// if (m_quit_requested) -// { - - /*bool r = */QMetaObject::invokeMethod(this, "do_close", Qt::QueuedConnection); -// } - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::update_daemon_status(const view::daemon_status_info& info) -{ - TRY_ENTRY(); - //this->update_daemon_state(info); - std::string json_str; - epee::serialization::store_t_to_json(info, json_str); - - //lifehack - if (m_last_update_daemon_status_json == json_str) - return true; - - LOG_PRINT_L0("SENDING SIGNAL -> [update_daemon_state] " << info.daemon_network_state); - //this->update_daemon_state(json_str.c_str()); - QMetaObject::invokeMethod(this, "update_daemon_state", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); - m_last_update_daemon_status_json = json_str; - return true; - CATCH_ENTRY2(false); -} - - -bool MainWindow::show_msg_box(const std::string& message) -{ - TRY_ENTRY(); - QMessageBox::information(this, "Error", message.c_str(), QMessageBox::Ok); - return true; - CATCH_ENTRY2(false); -} - -void qt_log_message_handler(QtMsgType type, const QMessageLogContext &context, const QString &msg) -{ - QByteArray local_msg = msg.toLocal8Bit(); - const char* msg_type = ""; - switch (type) - { - case QtDebugMsg: msg_type = "DEBG "; break; - case QtInfoMsg: msg_type = "INFO "; break; - case QtWarningMsg: msg_type = "WARN "; break; - case QtCriticalMsg: msg_type = "CRIT "; break; - case QtFatalMsg: msg_type = "FATAL "; break; - } - - if (context.file == nullptr && context.function == nullptr) - { - // no debug info - LOG_PRINT("[QT] " << msg_type << local_msg.constData(), LOG_LEVEL_0); - } - else - { - // some debug info - LOG_PRINT("[QT] " << msg_type << local_msg.constData() << " @ " << (context.file ? context.file : "") << ":" << context.line << ", " << (context.function ? context.function : ""), LOG_LEVEL_0); - } -} - -bool MainWindow::remove_ipc() -{ - try { - boost::interprocess::message_queue::remove(GUI_IPC_MESSAGE_CHANNEL_NAME); - } - catch (...) - { - } - return true; -} - - -bool MainWindow::init_ipc_server() -{ - - //in case previous instance wasn't close graceful, ipc channel will remain open and new creation will fail, so we - //trying to close it anyway before open, to make sure there are no dead channels. If there are another running instance, it wom't - //let channel to close, so it will fail later on creating channel - remove_ipc(); -#define GUI_IPC_BUFFER_SIZE 10000 - try { - //Create a message queue. - std::shared_ptr pmq(new boost::interprocess::message_queue(boost::interprocess::create_only //only create - , GUI_IPC_MESSAGE_CHANNEL_NAME //name - , 100 //max message number - , GUI_IPC_BUFFER_SIZE //max message size - )); - - m_ipc_worker = std::thread([this, pmq]() - { - //m_ipc_worker; - try - { - unsigned int priority = 0; - boost::interprocess::message_queue::size_type recvd_size = 0; - - while (m_gui_deinitialize_done_1 == false) - { - std::string buff(GUI_IPC_BUFFER_SIZE, ' '); - bool data_received = pmq->timed_receive((void*)buff.data(), GUI_IPC_BUFFER_SIZE, recvd_size, priority, boost::posix_time::ptime(boost::posix_time::microsec_clock::universal_time()) + boost::posix_time::milliseconds(1000)); - if (data_received && recvd_size != 0) - { - buff.resize(recvd_size, '*'); - handle_ipc_event(buff);//todo process token - } - } - remove_ipc(); - LOG_PRINT_L0("IPC Handling thread finished"); - } - catch (const std::exception& ex) - { - remove_ipc(); - boost::interprocess::message_queue::remove(GUI_IPC_MESSAGE_CHANNEL_NAME); - LOG_ERROR("Failed to receive IPC que: " << ex.what()); - } - - catch (...) - { - remove_ipc(); - LOG_ERROR("Failed to receive IPC que: unknown exception"); - } - }); - } - catch(const std::exception& ex) - { - boost::interprocess::message_queue::remove(GUI_IPC_MESSAGE_CHANNEL_NAME); - LOG_ERROR("Failed to initialize IPC que: " << ex.what()); - return false; - } - - catch (...) - { - boost::interprocess::message_queue::remove(GUI_IPC_MESSAGE_CHANNEL_NAME); - LOG_ERROR("Failed to initialize IPC que: unknown exception"); - return false; - } - return true; -} - - -bool MainWindow::handle_ipc_event(const std::string& arguments) -{ - std::string zzz = std::string("Received IPC: ") + arguments.c_str(); - std::cout << zzz;//message_box(zzz.c_str()); - - handle_deeplink_click(arguments.c_str()); - - return true; -} - -bool MainWindow::handle_deeplink_params_in_commandline() -{ - std::string deep_link_params = command_line::get_arg(m_backend.get_arguments(), command_line::arg_deeplink); - - try { - boost::interprocess::message_queue mq(boost::interprocess::open_only, GUI_IPC_MESSAGE_CHANNEL_NAME); - mq.send(deep_link_params.data(), deep_link_params.size(), 0); - return false; - } - catch (...) - { - //ui not launched yet - return true; - } -} - -bool MainWindow::init_backend(int argc, char* argv[]) -{ - - TRY_ENTRY(); - std::string command_line_fail_details; - if (!m_backend.init_command_line(argc, argv, command_line_fail_details)) - { - this->show_msg_box(command_line_fail_details); - return false; - } - - if (command_line::has_arg(m_backend.get_arguments(), command_line::arg_deeplink)) - { - if (!handle_deeplink_params_in_commandline()) - return false; - } - - if (!init_window()) - { - this->show_msg_box("Failed to main screen launch, check logs for the more detais."); - return false; - } - - if (!m_backend.init(this)) - { - this->show_msg_box("Failed to initialize backend, check debug logs for more details."); - return false; - } - - - - if (m_backend.is_qt_logs_enabled()) - { - qInstallMessageHandler(qt_log_message_handler); - QLoggingCategory::setFilterRules("*=true"); // enable all logs - } - - if (!init_ipc_server()) - { - this->show_msg_box("Failed to initialize IPC server, check debug logs for more details."); - return false; - } - - return true; - CATCH_ENTRY2(false); -} - -QString MainWindow::is_remnotenode_mode_preconfigured(const QString& param) -{ - TRY_ENTRY(); - view::api_response ar{}; - if (m_backend.is_remote_node_mode()) - ar.error_code = API_RETURN_CODE_TRUE; - else - ar.error_code = API_RETURN_CODE_FALSE; - return MAKE_RESPONSE(ar); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::start_backend(const QString& params) -{ - TRY_ENTRY(); - view::api_response ar = AUTO_VAL_INIT(ar); - - bool r = m_backend.start(); - if (!r) - { - ar.error_code = API_RETURN_CODE_INTERNAL_ERROR; - return MAKE_RESPONSE(ar); - } - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -void MainWindow::show_notification(const QString& title, const QString& message) -{ - show_notification(title.toStdString(), message.toStdString()); -} - -QString MainWindow::sync_call(const QString& func_name, const QString& params) -{ - if (func_name == "test_call") - { - return params; - } - std::string fuc_name_std = func_name.toStdString(); - QString response_str; - bool r = QMetaObject::invokeMethod(this, fuc_name_std.c_str(), Qt::DirectConnection, Q_RETURN_ARG(QString, response_str), Q_ARG(QString, params)); - //bool r = this->invokeMethod(fuc_name_std.c_str(), Q_RETURN_ARG(QString, response_str), Q_ARG(QString, params)); - if (r) - return response_str; - else - { - return QString(QString() + "{ \"status\": \"Method '" + func_name + "' not found\"}"); - } - -} - -QString MainWindow::sync_call_2a(const QString& func_name, const QString& params1, const QString& params2) -{ - std::string fuc_name_std = func_name.toStdString(); - QString response_str; - bool r = QMetaObject::invokeMethod(this, fuc_name_std.c_str(), Qt::DirectConnection, Q_RETURN_ARG(QString, response_str), Q_ARG(QString, params1), Q_ARG(QString, params2)); - //bool r = this->invokeMethod(fuc_name_std.c_str(), Q_RETURN_ARG(QString, response_str), Q_ARG(QString, params)); - if (r) - return response_str; - else - { - return QString(QString() + "{ \"status\": \"Method '" + func_name + "' not found\"}"); - } - -} - -QString MainWindow::async_call(const QString& func_name, const QString& params) -{ - - uint64_t job_id = m_ui_dispatch_id_counter++; - QString method_name = func_name; - QString argements = params; - - auto async_callback = [this, method_name, argements, job_id]() - { - QString res_str = this->sync_call(method_name, argements); - this->dispatch_async_call_result(std::to_string(job_id).c_str(), res_str); //general function - }; - - m_threads_pool.add_job(async_callback); - LOG_PRINT_L2("[UI_ASYNC_CALL]: started " << method_name.toStdString() << ", job id: " << job_id); - return QString::fromStdString(std::string("{ \"job_id\": ") + std::to_string(job_id) + "}"); -} - -QString MainWindow::async_call_2a(const QString& func_name, const QString& params1, const QString& params2) -{ - - uint64_t job_id = m_ui_dispatch_id_counter++; - QString method_name = func_name; - QString argements1 = params1; - QString argements2 = params2; - - - auto async_callback = [this, method_name, argements1, argements2, job_id]() - { - QString res_str = this->sync_call_2a(method_name, argements1, argements2); - this->dispatch_async_call_result(std::to_string(job_id).c_str(), res_str); //general function - }; - - m_threads_pool.add_job(async_callback); - LOG_PRINT_L2("[UI_ASYNC_CALL]: started " << method_name.toStdString() << ", job id: " << job_id); - return QString::fromStdString(std::string("{ \"job_id\": ") + std::to_string(job_id) + "}"); -} - -bool MainWindow::update_wallet_status(const view::wallet_status_info& wsi) -{ - TRY_ENTRY(); - m_wallet_states->operator [](wsi.wallet_id) = wsi.wallet_state; - - std::string json_str_pub; - epee::serialization::store_t_to_json(static_cast(wsi), json_str_pub, 0); - LOG_PRINT_L0(get_wallet_log_prefix(wsi.wallet_id) + "SENDING SIGNAL -> [update_wallet_status]:" << std::endl << json_str_pub); - - std::string json_str; - epee::serialization::store_t_to_json(wsi, json_str, 0); - QMetaObject::invokeMethod(this, "update_wallet_status", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::set_options(const view::gui_options& opt) -{ - TRY_ENTRY(); - std::string json_str; - epee::serialization::store_t_to_json(opt, json_str, 0); - LOG_PRINT_L0("SENDING SIGNAL -> [set_options]:" << std::endl << json_str); - QMetaObject::invokeMethod(this, "set_options", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::update_tor_status(const view::current_action_status& opt) -{ - TRY_ENTRY(); - std::string json_str; - epee::serialization::store_t_to_json(opt, json_str, 0); - LOG_PRINT_L0("SENDING SIGNAL -> [HANDLE_CURRENT_ACTION_STATE]:" << std::endl << json_str); - QMetaObject::invokeMethod(this, "handle_current_action_state", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) -{ - TRY_ENTRY(); -#ifdef WIN32 - MSG *msg = static_cast< MSG * >(message); - if (msg->message == WM_QUERYENDSESSION) - { - m_system_shutdown = true; - LOG_PRINT_MAGENTA("SYSTEM SHUTDOWN", LOG_LEVEL_0); - } -#endif - return false; - CATCH_ENTRY2(false); -} - -bool MainWindow::get_is_disabled_notifications(const QString& param) -{ - return m_config.disable_notifications; -} -bool MainWindow::set_is_disabled_notifications(const bool& param) -{ - LOG_PRINT_L1("set_is_disabled_notifications: notifications were " << (m_config.disable_notifications ? "DISABLED" : "ENABLED") << " -> now " << (param ? "DISABLED" : "ENABLED")); - m_config.disable_notifications = param; - return m_config.disable_notifications; -} -QString MainWindow::export_wallet_history(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::export_wallet_info, ewi); - PREPARE_RESPONSE(view::api_response, ar); - ar.error_code = m_backend.export_wallet_history(ewi); - return MAKE_RESPONSE(ar); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} -bool MainWindow::update_wallets_info(const view::wallets_summary_info& wsi) -{ - TRY_ENTRY(); - std::string json_str; - epee::serialization::store_t_to_json(wsi, json_str, 0); - LOG_PRINT_L0("SENDING SIGNAL -> [update_wallets_info]"<< std::endl << json_str ); - - QMetaObject::invokeMethod(this, "update_wallets_info", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::money_transfer(const view::transfer_event_info& tei) -{ - TRY_ENTRY(); - std::string json_str; - epee::serialization::store_t_to_json(tei, json_str, 0); - - LOG_PRINT_L0(get_wallet_log_prefix(tei.wallet_id) + "SENDING SIGNAL -> [money_transfer]" << std::endl << json_str); - //this->money_transfer(json_str.c_str()); - QMetaObject::invokeMethod(this, "money_transfer", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); - if (m_config.disable_notifications) - return true; - - - if (!m_tray_icon) - return true; - if (tei.ti.has_outgoing_entries()) - return true; - if (!tei.ti.get_native_amount()) - return true; -// if (tei.ti.is_mining && m_wallet_states->operator [](tei.wallet_id) != view::wallet_status_info::wallet_state_ready) -// return true; - -//don't show unconfirmed tx - if (tei.ti.height == 0) - return true; - if (tei.is_wallet_in_sync_process) - { - //don't show notification if it long sync process(mmight cause system freeze) - return true; - } - - auto amount_str = currency::print_money_brief(tei.ti.get_native_amount()); //@#@ add handling of assets - std::string title, msg; - if (tei.ti.height == 0) // unconfirmed tx - { - msg = amount_str + " " + CURRENCY_NAME_ABR + " " + m_localization[localization_id_is_received]; - title = m_localization[localization_id_income_transfer_unconfirmed]; - } - else - { - msg = amount_str + " " + CURRENCY_NAME_ABR + " " + m_localization[localization_id_is_confirmed]; - title = m_localization[localization_id_income_transfer_confirmed]; - } - if (tei.ti.is_mining) - msg += m_localization[localization_id_mined]; - else if (tei.ti.unlock_time) - msg += m_localization[localization_id_locked]; - - - show_notification(title, msg); - - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::money_transfer_cancel(const view::transfer_event_info& tei) -{ - TRY_ENTRY(); - std::string json_str; - epee::serialization::store_t_to_json(tei, json_str, 0); - - LOG_PRINT_L0(get_wallet_log_prefix(tei.wallet_id) + "SENDING SIGNAL -> [money_transfer_cancel]"); - //this->money_transfer_cancel(json_str.c_str()); - QMetaObject::invokeMethod(this, "money_transfer_cancel", Qt::QueuedConnection, Q_ARG(QString, json_str.c_str())); - - return true; - - CATCH_ENTRY2(false); -} -bool MainWindow::wallet_sync_progress(const view::wallet_sync_progres_param& p) -{ - TRY_ENTRY(); - LOG_PRINT_L2(get_wallet_log_prefix(p.wallet_id) + "SENDING SIGNAL -> [wallet_sync_progress]" << " wallet_id: " << p.wallet_id << ": " << p.progress << "%"); - //this->wallet_sync_progress(epee::serialization::store_t_to_json(p).c_str()); - QMetaObject::invokeMethod(this, "wallet_sync_progress", Qt::QueuedConnection, Q_ARG(QString, epee::serialization::store_t_to_json(p, 0).c_str())); - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::set_html_path(const std::string& path) -{ - TRY_ENTRY(); - //init_tray_icon(path); -#ifdef _MSC_VER - QString url = QString::fromUtf8(path.c_str()) + "/index.html"; - load_file(url); -#else -// load_file(QString((std::string("file://") + path + "/index.html").c_str())); - load_file(QString((std::string("") + path + "/index.html").c_str())); -#endif - return true; - CATCH_ENTRY2(false); -} - -bool MainWindow::pos_block_found(const currency::block& block_found) -{ - TRY_ENTRY(); - std::stringstream ss; - ss << "Found Block h = " << currency::get_block_height(block_found); - LOG_PRINT_L0("SENDING SIGNAL -> [update_pos_mining_text]"); - //this->update_pos_mining_text(ss.str().c_str()); - QMetaObject::invokeMethod(this, "update_pos_mining_text", Qt::QueuedConnection, Q_ARG(QString, ss.str().c_str())); - return true; - CATCH_ENTRY2(false); -} - -QString MainWindow::get_version(const QString& param) -{ - TRY_ENTRY(); - return PROJECT_VERSION_LONG; - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_os_version(const QString& param) -{ - TRY_ENTRY(); - return tools::get_os_version_string().c_str(); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::get_network_type(const QString& param) -{ -#if defined(TESTNET) - return "testnet"; -#else - return "mainnet"; -#endif -} - -QString MainWindow::get_alias_coast(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(currency::struct_with_one_t_type, lvl); - view::get_alias_coast_response resp; - resp.error_code = m_backend.get_alias_coast(lvl.v, resp.coast); - return epee::serialization::store_t_to_json(resp, 0).c_str(); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::set_localization_strings(const QString param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::set_localization_request, lr); - view::api_response resp; - - if (lr.strings.size() < localization_id_couter) - { - LOG_ERROR("Wrong localization size: " << lr.strings.size() << ", expected size at least " << localization_id_couter); - resp.error_code = API_RETURN_CODE_FAIL; - } - else - { - m_localization = lr.strings; - if(m_quit_action) - m_quit_action->setText(QString::fromStdString(m_localization[localization_id_quit])); - if(m_restore_action) - m_restore_action->setText(QString::fromStdString(m_localization[localization_id_tray_menu_show])); - if(m_minimize_action) - m_minimize_action->setText(QString::fromStdString(m_localization[localization_id_tray_menu_minimize])); - resp.error_code = API_RETURN_CODE_OK; - LOG_PRINT_L0("New localization set, language title: " << lr.language_title << ", strings " << lr.strings.size()); - } - return epee::serialization::store_t_to_json(resp, 0).c_str(); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::request_alias_registration(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("request_alias_registration", param, [this](const view::request_alias_param& tp, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::request_alias_param, tp); - PREPARE_RESPONSE(view::transfer_response, ar); - - // view::transfer_response tr = AUTO_VAL_INIT(tr); - currency::transaction res_tx = AUTO_VAL_INIT(res_tx); - ar.error_code = m_backend.request_alias_registration(tp.alias, tp.wallet_id, tp.fee, res_tx, tp.reward); - if (ar.error_code != API_RETURN_CODE_OK) - return MAKE_RESPONSE(ar); - - - ar.response_data.success = true; - ar.response_data.tx_hash = string_tools::pod_to_hex(currency::get_transaction_hash(res_tx)); - ar.response_data.tx_blob_size = currency::get_object_blobsize(res_tx); - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::request_alias_update(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::request_alias_param, tp); - PREPARE_RESPONSE(view::transfer_response, ar); - - // view::transfer_response tr = AUTO_VAL_INIT(tr); - currency::transaction res_tx = AUTO_VAL_INIT(res_tx); - ar.error_code = m_backend.request_alias_update(tp.alias, tp.wallet_id, tp.fee, res_tx); - if (ar.error_code != API_RETURN_CODE_OK) - return MAKE_RESPONSE(ar); - - - ar.response_data.success = true; - ar.response_data.tx_hash = string_tools::pod_to_hex(currency::get_transaction_hash(res_tx)); - ar.response_data.tx_blob_size = currency::get_object_blobsize(res_tx); - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::transfer(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("transfer", json_transfer_object, [this](const view::transfer_params& tp, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::transfer_params, tp); - PREPARE_RESPONSE(view::transfer_response, ar); - - if (!tp.destinations.size()) - { - ar.error_code = API_RETURN_CODE_BAD_ARG; - return MAKE_RESPONSE(ar); - } - - currency::transaction res_tx = AUTO_VAL_INIT(res_tx); - ar.error_code = m_backend.transfer(tp.wallet_id, tp, res_tx); - if (ar.error_code != API_RETURN_CODE_OK) - return MAKE_RESPONSE(ar); - - ar.response_data.success = true; - ar.response_data.tx_hash = string_tools::pod_to_hex(currency::get_transaction_hash(res_tx)); - ar.response_data.tx_blob_size = currency::get_object_blobsize(res_tx); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -void MainWindow::message_box(const QString& msg) -{ - TRY_ENTRY(); - show_msg_box(msg.toStdString()); - CATCH_ENTRY2(void()); -} - -struct serialize_variant_visitor : public boost::static_visitor -{ - template - std::string operator()(const t_type& v) const - { - return epee::serialization::store_t_to_json(v); - } -}; - -template -std::string serialize_variant(const t_variant& v) -{ - TRY_ENTRY(); - return boost::apply_visitor(serialize_variant_visitor(), v); - CATCH_ENTRY2(""); -} - - -void MainWindow::on_core_event(const std::string event_name, const currency::core_event_v& e) -{ - TRY_ENTRY(); - //at the moment we don't forward CORE_EVENT_BLOCK_ADDEDevent to GUI - if (CORE_EVENT_BLOCK_ADDED == event_name) - return; - - m_events.m_que.push_back(currency::core_event()); - m_events.m_que.back().details = currency::core_event_v(e); - m_events.m_que.back().method = event_name; - CATCH_ENTRY2(void()); -} - -std::string get_events_que_json_string(const std::list& eq, std::string& methods_list) -{ - TRY_ENTRY(); - //t the moment portable_storage is not supporting polymorphic objects lists, so - //there is no hope to make serialization with variant list, lets handle it manual - std::stringstream ss; - ss << "{ \"events\" : ["; - uint64_t need_coma = false; - for (const auto& e : eq) - { - if (need_coma) - { - ss << ","; - methods_list += "|"; - } - methods_list += e.method; - ss << "{ \"method\": \"" << e.method << "\"," << ENDL; - ss << "\"details\": " << serialize_variant(e.details) << ENDL << "}"; - need_coma = true; - } - ss << "]}"; - return ss.str(); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -void MainWindow::on_complete_events() -{ - TRY_ENTRY(); - if (m_events.m_que.size()) - { - std::string methods_list; - TIME_MEASURE_START_MS(core_events_handl_time); - TIME_MEASURE_START_MS(json_buff_generate_time); - std::string json_buff = get_events_que_json_string(m_events.m_que, methods_list); - TIME_MEASURE_FINISH_MS(json_buff_generate_time); - - - QMetaObject::invokeMethod(this, "on_core_event", - Qt::QueuedConnection, - Q_ARG(QString, QString(json_buff.c_str()))); - TIME_MEASURE_FINISH_MS(core_events_handl_time); - LOG_PRINT_L0("SENT SIGNAL -> [CORE_EVENTS]: " << m_events.m_que.size() - << ", handle_time: " << core_events_handl_time << "(json: " << json_buff_generate_time << ")ms, json_buff size = " << json_buff.size() << ", methods: " << methods_list); - LOG_PRINT_L2("CORE_EVENTS sent signal details: " << ENDL << json_buff); - m_events.m_que.clear(); - - } - CATCH_ENTRY2(void()); -} - -void MainWindow::on_clear_events() -{ - TRY_ENTRY(); - m_events.m_que.clear(); - CATCH_ENTRY2(void()); -} - - -QString MainWindow::store_secure_app_data(const QString& param, const QString& password) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - if (!tools::create_directories_if_necessary(m_backend.get_config_folder())) - { - view::api_response ar; - LOG_PRINT_L0("Failed to create data directory: " << m_backend.get_config_folder()); - ar.error_code = API_RETURN_CODE_FAIL; - return MAKE_RESPONSE(ar); - } - - view::api_response ar = AUTO_VAL_INIT(ar); - ar.error_code = tools::store_encrypted_file(m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME, - m_master_password, param.toStdString(), APP_DATA_FILE_BINARY_SIGNATURE); - if (ar.error_code != API_RETURN_CODE_OK) - { - return MAKE_RESPONSE(ar); - } - - crypto::hash master_password_pre_hash = crypto::cn_fast_hash(m_master_password.c_str(), m_master_password.length()); - crypto::hash master_password_hash = crypto::cn_fast_hash(&master_password_pre_hash, sizeof master_password_pre_hash); - LOG_PRINT_L0("store_secure_app_data, r = " << ar.error_code << ", pass hash: " << master_password_hash); - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_secure_app_data(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - view::password_data pwd = AUTO_VAL_INIT(pwd); - - if (!epee::serialization::load_t_from_json(pwd, param.toStdString())) - { - view::api_response ar; - ar.error_code = API_RETURN_CODE_BAD_ARG; - return MAKE_RESPONSE(ar); - } - - std::string filename = m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME; - std::string res_body; - std::string rsp_code = tools::load_encrypted_file(filename, pwd.pass, res_body, APP_DATA_FILE_BINARY_SIGNATURE); - if (rsp_code != API_RETURN_CODE_OK) - { - view::api_response ar; - ar.error_code = rsp_code; - return MAKE_RESPONSE(ar); - } - m_master_password = pwd.pass; - crypto::hash master_password_pre_hash = crypto::cn_fast_hash(m_master_password.c_str(), m_master_password.length()); - crypto::hash master_password_hash = crypto::cn_fast_hash(&master_password_pre_hash, sizeof master_password_pre_hash); - LOG_PRINT_L0("gui secure config loaded ok from " << filename << ", pass hash: " << master_password_hash); - - return res_body.c_str(); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::set_master_password(const QString& param) -{ - view::api_response ar; - - view::password_data pwd = AUTO_VAL_INIT(pwd); - - if (!epee::serialization::load_t_from_json(pwd, param.toStdString())) - { - ar.error_code = API_RETURN_CODE_BAD_ARG; - return MAKE_RESPONSE(ar); - } - - if (!currency::validate_password(pwd.pass)) - { - ar.error_code = API_RETURN_CODE_BAD_ARG; - return MAKE_RESPONSE(ar); - } - - m_master_password = pwd.pass; - - crypto::hash master_password_pre_hash = crypto::cn_fast_hash(m_master_password.c_str(), m_master_password.length()); - crypto::hash master_password_hash = crypto::cn_fast_hash(&master_password_pre_hash, sizeof master_password_pre_hash); - LOG_PRINT_L0("set_master_password, pass hash: " << master_password_hash); - - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); -} - -QString MainWindow::check_master_password(const QString& param) -{ - view::password_data pwd = AUTO_VAL_INIT(pwd); - view::api_response ar = AUTO_VAL_INIT(ar); - - if (!epee::serialization::load_t_from_json(pwd, param.toStdString())) - { - ar.error_code = API_RETURN_CODE_BAD_ARG; - return MAKE_RESPONSE(ar); - } - - crypto::hash master_password_pre_hash = crypto::cn_fast_hash(m_master_password.c_str(), m_master_password.length()); - crypto::hash master_password_hash = crypto::cn_fast_hash(&master_password_pre_hash, sizeof master_password_pre_hash); - crypto::hash pwd_pre_hash = crypto::cn_fast_hash(pwd.pass.c_str(), pwd.pass.length()); - crypto::hash pwd_hash = crypto::cn_fast_hash(&pwd_pre_hash, sizeof pwd_pre_hash); - - if (m_master_password != pwd.pass) - { - ar.error_code = API_RETURN_CODE_WRONG_PASSWORD; - LOG_PRINT_L0("check_master_password: pwd hash: " << pwd_hash << ", expected: " << master_password_hash); - } - else - { - ar.error_code = API_RETURN_CODE_OK; - } - return MAKE_RESPONSE(ar); -} - -QString MainWindow::store_app_data(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - view::api_response ar; - ar.error_code = API_RETURN_CODE_FAIL; - if (!tools::create_directories_if_necessary(m_backend.get_config_folder())) - { - LOG_PRINT_L0("Failed to create data directory: " << m_backend.get_config_folder()); - return MAKE_RESPONSE(ar); - } - - std::string filename = m_backend.get_config_folder() + "/" + GUI_CONFIG_FILENAME; - bool r = file_io_utils::save_string_to_file(filename, param.toStdString()); - if (r) - { - ar.error_code = API_RETURN_CODE_OK; - LOG_PRINT_L1("config saved: " << filename); - } - else - { - ar.error_code = API_RETURN_CODE_FAIL; - LOG_PRINT_L1("config save failed: " << filename); - } - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::is_file_exist(const QString& path) -{ - TRY_ENTRY(); - try{ - bool r = file_io_utils::is_file_exist(path.toStdWString()); - if (r) - return API_RETURN_CODE_ALREADY_EXISTS; - else - return API_RETURN_CODE_FILE_NOT_FOUND; - } - catch (const std::exception& ex) - { - LOG_ERROR("failed to check file existance: " << path.toStdString() << " ERROR:" << ex.what()); - return QString(API_RETURN_CODE_ALREADY_EXISTS) + ": " + ex.what(); - } - - catch (...) - { - return API_RETURN_CODE_ALREADY_EXISTS; - } - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::store_to_file(const QString& path, const QString& buff) -{ - TRY_ENTRY(); - try{ - bool r = file_io_utils::save_string_to_file_throw(path.toStdWString(), buff.toStdString()); - if (r) - return API_RETURN_CODE_OK; - else - return API_RETURN_CODE_ACCESS_DENIED; - } - catch (const std::exception& ex) - { - LOG_ERROR("FILED TO STORE TO FILE: " << path.toStdString() << " ERROR:" << ex.what()); - return QString(API_RETURN_CODE_ACCESS_DENIED) + ": " + ex.what(); - } - - catch (...) - { - return API_RETURN_CODE_ACCESS_DENIED; - } - - - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::load_from_file(const QString& path) -{ - TRY_ENTRY(); - try { - std::string buff; - bool r = epee::file_io_utils::load_file_to_string(path.toStdWString(), buff); - if (r) - return QString::fromStdString(buff); - else - return QString(); - } - catch (const std::exception& ex) - { - LOG_ERROR("FILED TO LOAD FROM FILE: " << path.toStdString() << " ERROR:" << ex.what()); - return QString(API_RETURN_CODE_ACCESS_DENIED) + ": " + ex.what(); - } - - catch (...) - { - return API_RETURN_CODE_ACCESS_DENIED; - } - - - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::get_app_data(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - std::string app_data_buff; - file_io_utils::load_file_to_string(m_backend.get_config_folder() + "/" + GUI_CONFIG_FILENAME, app_data_buff); - return app_data_buff.c_str(); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - - -QString MainWindow::have_secure_app_data(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - view::api_response ar = AUTO_VAL_INIT(ar); - - boost::system::error_code ec; - if (boost::filesystem::exists(epee::string_encoding::utf8_to_wstring(m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME), ec)) - ar.error_code = API_RETURN_CODE_TRUE; - else - ar.error_code = API_RETURN_CODE_FALSE; - - LOG_PRINT_L0("have_secure_app_data, r = " << ar.error_code); - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::drop_secure_app_data() -{ - TRY_ENTRY(); - LOG_API_TIMING(); - view::api_response ar = AUTO_VAL_INIT(ar); - - boost::system::error_code ec; - if (boost::filesystem::remove(epee::string_encoding::utf8_to_wstring(m_backend.get_config_folder() + "/" + GUI_SECURE_CONFIG_FILENAME), ec)) - ar.error_code = API_RETURN_CODE_TRUE; - else - ar.error_code = API_RETURN_CODE_FALSE; - - LOG_PRINT_L0("drop_secure_app_data, r = " << ar.error_code); - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_all_aliases(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //PREPARE_ARG_FROM_JSON(currency::struct_with_one_t_type, param); - PREPARE_RESPONSE(view::alias_set, rsp); - - rsp.error_code = m_backend.get_aliases(rsp.response_data); - QString res = MAKE_RESPONSE(rsp); - LOG_PRINT_GREEN("GET_ALL_ALIASES: res: " << rsp.error_code << ", count: " << rsp.response_data.aliases.size() << ", string buff size: " << res.size(), LOG_LEVEL_1); - return res; - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::get_alias_info_by_address(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_RESPONSE(currency::alias_rpc_details, rsp); - rsp.error_code = m_backend.get_alias_info_by_address(param.toStdString(), rsp.response_data); - return MAKE_RESPONSE(rsp); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::get_alias_info_by_name(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_RESPONSE(currency::alias_rpc_details, rsp); - rsp.error_code = m_backend.get_alias_info_by_name(param.toStdString(), rsp.response_data); - return MAKE_RESPONSE(rsp); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::validate_address(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - view::address_validation_response ar = AUTO_VAL_INIT(ar); - ar.error_code = m_backend.validate_address(param.toStdString(), ar.payment_id); - - //@#@ -//#ifdef _DEBUG -// std::string json_body; -// bool r = epee::file_io_utils::load_file_to_string("C:\\Users\\roky\\home\\temp\\deploy_test.json", json_body); -// async_call_2a("call_wallet_rpc", "0", json_body.c_str()); -//#endif - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::set_log_level(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(currency::struct_with_one_t_type, lvl); - epee::log_space::get_set_log_detalisation_level(true, lvl.v); - default_ar.error_code = API_RETURN_CODE_OK; - LOG_PRINT("[LOG LEVEL]: set to " << lvl.v, LOG_LEVEL_MIN); - - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::get_log_level(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_RESPONSE(currency::struct_with_one_t_type, ar); - ar.response_data.v = epee::log_space::get_set_log_detalisation_level(); - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::set_enable_tor(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(currency::struct_with_one_t_type, enabl_tor); - m_backend.set_use_tor(enabl_tor.v); - //epee::log_space::get_set_log_detalisation_level(true, enabl_tor.v); - default_ar.error_code = API_RETURN_CODE_OK; - LOG_PRINT("[TOR]: Enable TOR set to " << enabl_tor.v, LOG_LEVEL_MIN); - - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -// QString MainWindow::dump_all_offers() -// { -// LOG_API_TIMING(); -// //return que_call2("dump_all_offers", "{}", [this](const view::api_void& owd, view::api_response& ar){ -// PREPARE_RESPONSE(view::api_void, ar); -// //view::api_void av; -// QString path = QFileDialog::getOpenFileName(this, "Select file", -// "", -// ""); -// -// if (!path.length()) -// { -// ar.error_code = API_RETURN_CODE_CANCELED; -// return MAKE_RESPONSE(ar); -// } -// -// currency::COMMAND_RPC_GET_OFFERS_EX::response rp = AUTO_VAL_INIT(rp); -// ar.error_code = m_backend.get_all_offers(rp); -// -// std::string buff = epee::serialization::store_t_to_json(rp); -// bool r = file_io_utils::save_string_to_file(path.toStdString(), buff); -// if (!r) -// ar.error_code = API_RETURN_CODE_FAIL; -// else -// ar.error_code = API_RETURN_CODE_OK; -// -// return MAKE_RESPONSE(ar); -// } - -QString MainWindow::webkit_launched_script(const QString& param) -{ - TRY_ENTRY(); - m_last_update_daemon_status_json.clear(); - return ""; - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} -//////////////////// -QString MainWindow::show_openfile_dialog(const QString& param) -{ - TRY_ENTRY(); - view::system_filedialog_request ofdr = AUTO_VAL_INIT(ofdr); - view::system_filedialog_response ofdres = AUTO_VAL_INIT(ofdres); - if (!epee::serialization::load_t_from_json(ofdr, param.toStdString())) - { - ofdres.error_code = API_RETURN_CODE_BAD_ARG; - return epee::serialization::store_t_to_json(ofdres, 0).c_str(); - } - - QString path = QFileDialog::getOpenFileName(this, ofdr.caption.c_str(), - ofdr.default_dir.c_str(), - ofdr.filemask.c_str()); - - if (!path.length()) - { - ofdres.error_code = API_RETURN_CODE_CANCELED; - return epee::serialization::store_t_to_json(ofdres, 0).c_str(); - } - - ofdres.error_code = API_RETURN_CODE_OK; - ofdres.path = path.toStdString(); - return MAKE_RESPONSE(ofdres); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - - -QString MainWindow::show_savefile_dialog(const QString& param) -{ - TRY_ENTRY(); - PREPARE_ARG_FROM_JSON(view::system_filedialog_request, ofdr); - view::system_filedialog_response ofdres = AUTO_VAL_INIT(ofdres); - - QString path = QFileDialog::getSaveFileName(this, ofdr.caption.c_str(), - ofdr.default_dir.c_str(), - ofdr.filemask.c_str()); - - if (!path.length()) - { - ofdres.error_code = API_RETURN_CODE_CANCELED; - return epee::serialization::store_t_to_json(ofdres, 0).c_str(); - } - - ofdres.error_code = API_RETURN_CODE_OK; - ofdres.path = path.toStdString(); - return MAKE_RESPONSE(ofdres); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::close_wallet(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("close_wallet", param, [this](const view::wallet_id_obj& owd, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::wallet_id_obj, owd); - PREPARE_RESPONSE(view::api_void, ar); - ar.error_code = m_backend.close_wallet(owd.wallet_id); - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_contracts(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_id_obj, owd); - PREPARE_RESPONSE(tools::wallet_public::contracts_array, ar); - ar.error_code = m_backend.get_contracts(owd.wallet_id, ar.response_data.contracts); - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::create_proposal(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::create_proposal_param_gui, cpp); - PREPARE_RESPONSE(tools::wallet_public::contracts_array, ar); - ar.error_code = m_backend.create_proposal(cpp); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - - -QString MainWindow::accept_proposal(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_and_contract_id_param, waip); - PREPARE_RESPONSE(view::api_void, ar); - - ar.error_code = m_backend.accept_proposal(waip.wallet_id, waip.contract_id); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::release_contract(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::release_contract_param, rcp); - PREPARE_RESPONSE(view::api_void, ar); - - ar.error_code = m_backend.release_contract(rcp.wallet_id, rcp.contract_id, rcp.release_type); - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::request_cancel_contract(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::crequest_cancel_contract_param, rcp); - PREPARE_RESPONSE(view::api_void, ar); - - ar.error_code = m_backend.request_cancel_contract(rcp.wallet_id, rcp.contract_id, rcp.fee, rcp.expiration_period); - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::accept_cancel_contract(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_and_contract_id_param, wci); - PREPARE_RESPONSE(view::api_void, ar); - - ar.error_code = m_backend.accept_cancel_contract(wci.wallet_id, wci.contract_id); - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::generate_wallet(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("generate_wallet", param, [this](const view::open_wallet_request& owd, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::open_wallet_request, owd); - PREPARE_RESPONSE(view::open_wallet_response, ar); - ar.error_code = m_backend.generate_wallet(epee::string_encoding::utf8_to_wstring(owd.path), owd.pass, ar.response_data); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - - -QString MainWindow::restore_wallet(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("restore_wallet", param, [this](const view::restore_wallet_request& owd, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::restore_wallet_request, owd); - PREPARE_RESPONSE(view::open_wallet_response, ar); - ar.error_code = m_backend.restore_wallet(epee::string_encoding::utf8_to_wstring(owd.path), owd.pass, owd.seed_phrase, owd.seed_pass, ar.response_data); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::use_whitelisting(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("restore_wallet", param, [this](const view::restore_wallet_request& owd, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::api_request_t, owd); - PREPARE_RESPONSE(view::api_responce_return_code, ar); - ar.error_code = m_backend.use_whitelisting(owd.wallet_id, owd.req_data); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::open_wallet(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - - //return que_call2("open_wallet", param, [this](const view::open_wallet_request& owd, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::open_wallet_request, owd); - PREPARE_RESPONSE(view::open_wallet_response, ar); - ar.error_code = m_backend.open_wallet(epee::string_encoding::utf8_to_wstring(owd.path), owd.pass, owd.txs_to_return, ar.response_data, owd.exclude_mining_txs); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::get_my_offers(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("open_wallet", param, [this](const view::open_wallet_request& owd, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(bc_services::core_offers_filter, f); - PREPARE_RESPONSE(currency::COMMAND_RPC_GET_OFFERS_EX::response, ar); - ar.error_code = m_backend.get_my_offers(f, ar.response_data.offers); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::get_fav_offers(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::get_fav_offers_request, f); - PREPARE_RESPONSE(currency::COMMAND_RPC_GET_OFFERS_EX::response, ar); - ar.error_code = m_backend.get_fav_offers(f.ids, f.filter, ar.response_data.offers); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::is_pos_allowed(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - return m_backend.is_pos_allowed().c_str(); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::run_wallet(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_id_obj, wio); - - default_ar.error_code = m_backend.run_wallet(wio.wallet_id); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::resync_wallet(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("get_wallet_info", param, [this](const view::wallet_id_obj& a, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::wallet_id_obj, a); - PREPARE_RESPONSE(view::api_void, ar); - - ar.error_code = m_backend.resync_wallet(a.wallet_id); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_offers_ex(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return que_call2("get_offers_ex", param, [this](const bc_services::core_offers_filter& f, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(bc_services::core_offers_filter, f); - PREPARE_RESPONSE(currency::COMMAND_RPC_GET_OFFERS_EX::response, ar); - ar.error_code = m_backend.get_offers_ex(f, ar.response_data.offers, ar.response_data.total_offers); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::push_offer(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - LOG_API_PARAMS(LOG_LEVEL_2); - //return que_call2("push_offer", param, [this](const view::push_offer_param& a, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::push_offer_param, a); - PREPARE_RESPONSE(view::transfer_response, ar); - - currency::transaction res_tx = AUTO_VAL_INIT(res_tx); - - ar.error_code = m_backend.push_offer(a.wallet_id, a.od, res_tx); - if (ar.error_code != API_RETURN_CODE_OK) - return MAKE_RESPONSE(ar); - - ar.response_data.success = true; - ar.response_data.tx_hash = string_tools::pod_to_hex(currency::get_transaction_hash(res_tx)); - ar.response_data.tx_blob_size = currency::get_object_blobsize(res_tx); - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::cancel_offer(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - LOG_API_PARAMS(LOG_LEVEL_2); - // return que_call2("cancel_offer", param, [this](const view::cancel_offer_param& a, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(view::cancel_offer_param, a); - PREPARE_RESPONSE(view::transfer_response, ar); - - currency::transaction res_tx = AUTO_VAL_INIT(res_tx); - - ar.error_code = m_backend.cancel_offer(a, res_tx); - if (ar.error_code != API_RETURN_CODE_OK) - return MAKE_RESPONSE(ar); - - ar.response_data.success = true; - ar.response_data.tx_hash = string_tools::pod_to_hex(currency::get_transaction_hash(res_tx)); - ar.response_data.tx_blob_size = currency::get_object_blobsize(res_tx); - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::push_update_offer(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - LOG_API_PARAMS(LOG_LEVEL_2); - //return que_call2("cancel_offer", param, [this](const bc_services::update_offer_details& a, view::api_response& ar){ - PREPARE_ARG_FROM_JSON(bc_services::update_offer_details, a); - PREPARE_RESPONSE(view::transfer_response, ar); - - currency::transaction res_tx = AUTO_VAL_INIT(res_tx); - - ar.error_code = m_backend.push_update_offer(a, res_tx); - if (ar.error_code != API_RETURN_CODE_OK) - return MAKE_RESPONSE(ar); - - ar.response_data.success = true; - ar.response_data.tx_hash = string_tools::pod_to_hex(currency::get_transaction_hash(res_tx)); - ar.response_data.tx_blob_size = currency::get_object_blobsize(res_tx); - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_recent_transfers(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::get_recent_transfers_request, a); - PREPARE_RESPONSE(view::transfers_array, ar); - ar.error_code = m_backend.get_recent_transfers(a.wallet_id, a.offset, a.count, ar.response_data, a.exclude_mining_txs); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - - -QString MainWindow::get_mining_history(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - //return prepare_call("get_mining_history", param, [this](const view::wallet_id_obj& a, view::api_response& ar) { - PREPARE_ARG_FROM_JSON(view::wallet_id_obj, a); - PREPARE_RESPONSE(tools::wallet_public::mining_history, ar); - - ar.error_code = m_backend.get_mining_history(a.wallet_id, ar.response_data); - if (ar.error_code != API_RETURN_CODE_OK) - return MAKE_RESPONSE(ar); - - ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::start_pos_mining(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_id_obj, wo); - default_ar.error_code = m_backend.start_pos_mining(wo.wallet_id); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::stop_pos_mining(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_id_obj, wo); - default_ar.error_code = m_backend.stop_pos_mining(wo.wallet_id); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_smart_wallet_info(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::request_get_smart_wallet_info, wo); - PREPARE_RESPONSE(view::get_restore_info_response, ar); - ar.error_code = m_backend.get_wallet_restore_info(wo.wallet_id, ar.response_data.seed_phrase, wo.seed_password); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::get_mining_estimate(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::request_mining_estimate, me); - PREPARE_RESPONSE(view::response_mining_estimate, ar); - ar.error_code = m_backend.get_mining_estimate(me.amount_coins, me.time, ar.response_data.final_amount, ar.response_data.all_coins_and_pos_diff_rate, ar.response_data.days_estimate); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::add_custom_asset_id(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_and_asset_id, waid); - PREPARE_RESPONSE(currency::COMMAND_RPC_GET_ASSET_INFO::response, ar); - - ar.error_code = m_backend.add_custom_asset_id(waid.wallet_id, waid.asset_id, ar.response_data.asset_descriptor); - ar.response_data.status = ar.error_code; - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::remove_custom_asset_id(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_and_asset_id, waid); - default_ar.error_code = m_backend.delete_custom_asset_id(waid.wallet_id, waid.asset_id); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::get_wallet_info(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::wallet_id_obj, waid); - PREPARE_RESPONSE(view::wallet_info, ar); - ar.error_code = m_backend.get_wallet_info(waid.wallet_id, ar.response_data); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::create_ionic_swap_proposal(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::create_ionic_swap_proposal_request, cispr); - PREPARE_RESPONSE(std::string, ar); - ar.error_code = m_backend.create_ionic_swap_proposal(cispr.wallet_id, cispr, ar.response_data); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::get_ionic_swap_proposal_info(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::api_request_t, tx_raw_hex); - PREPARE_RESPONSE(tools::wallet_public::ionic_swap_proposal_info, ar); - ar.error_code = m_backend.get_ionic_swap_proposal_info(tx_raw_hex.wallet_id, tx_raw_hex.req_data, ar.response_data); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); - -} - -QString MainWindow::accept_ionic_swap_proposal(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::api_request_t, tx_raw_hex); - PREPARE_RESPONSE(std::string, ar); - ar.error_code = m_backend.accept_ionic_swap_proposal(tx_raw_hex.wallet_id, tx_raw_hex.req_data, ar.response_data); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::backup_wallet_keys(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::backup_keys_request, me); - default_ar.error_code = m_backend.backup_wallet(me.wallet_id, epee::string_encoding::utf8_to_wstring(me.path)); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::reset_wallet_password(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::reset_pass_request, me); - default_ar.error_code = m_backend.reset_wallet_password(me.wallet_id, me.pass); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -QString MainWindow::is_wallet_password_valid(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::reset_pass_request, me); - default_ar.error_code = m_backend.is_wallet_password_valid(me.wallet_id, me.pass); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::is_autostart_enabled(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - view::api_response ar; - - if (gui_tools::GetStartOnSystemStartup()) - ar.error_code = API_RETURN_CODE_TRUE; - else - ar.error_code = API_RETURN_CODE_FALSE; - - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::toggle_autostart(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(currency::struct_with_one_t_type, as); - - if (gui_tools::SetStartOnSystemStartup(as.v)) - default_ar.error_code = API_RETURN_CODE_OK; - else - default_ar.error_code = API_RETURN_CODE_FAIL; - - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} -/* -QString MainWindow::check_available_sources(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::api_request_t >, sources); - return m_backend.check_available_sources(sources.wallet_id, sources.req_data).c_str(); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} -*/ - -QString MainWindow::open_url_in_browser(const QString& param) -{ - TRY_ENTRY(); - QString prefix = "https://"; - if (!QDesktopServices::openUrl(QUrl(prefix + param))) - { - LOG_ERROR("Failed top open URL: " << param.toStdString()); - return API_RETURN_CODE_FAIL; - } - LOG_PRINT_L0("[Open URL]: " << param.toStdString()); - return API_RETURN_CODE_OK; - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::setup_jwt_wallet_rpc(const QString& param) -{ - TRY_ENTRY(); - - m_backend.setup_wallet_rpc(param.toStdString()); - - return API_RETURN_CODE_OK; - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::is_valid_restore_wallet_text(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::seed_info_param, rwtp); - return m_backend.is_valid_brain_restore_data(rwtp.seed_phrase, rwtp.seed_password).c_str(); - CATCH_ENTRY2(API_RETURN_CODE_INTERNAL_ERROR); -} - -QString MainWindow::get_seed_phrase_info(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::seed_info_param, rwtp); - PREPARE_RESPONSE(view::seed_phrase_info, ar); - ar.error_code = m_backend.get_seed_phrase_info(rwtp.seed_phrase, rwtp.seed_password, ar.response_data).c_str(); - LOG_PRINT_CYAN("[get_seed_phrase_info]:" << epee::serialization::store_t_to_json(ar), LOG_LEVEL_0); - return MAKE_RESPONSE(ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -void MainWindow::contextMenuEvent(QContextMenuEvent * event) -{ - TRY_ENTRY(); - - CATCH_ENTRY2(void()); -} -QString MainWindow::print_text(const QString& param) -{ - TRY_ENTRY(); - LOG_API_TIMING(); - PREPARE_ARG_FROM_JSON(view::print_text_param, ptp); - - //in >> htmlContent; - - QTextDocument *document = new QTextDocument(); - document->setHtml(ptp.html_text.c_str()); - - QPrinter printer; - default_ar.error_code = API_RETURN_CODE_CANCELED; - - QPrintDialog *dialog = new QPrintDialog(&printer, this); - dialog->setOptions(QAbstractPrintDialog::PrintToFile); - auto res = dialog->exec(); - if (res != QDialog::Accepted) - { - LOG_PRINT_L0("[PRINT_TEXT] exec != QDialog::Accepted, res=" << res); - return MAKE_RESPONSE(default_ar); - } - - document->print(&printer); - - delete document; - default_ar.error_code = API_RETURN_CODE_OK; - LOG_PRINT_L0("[PRINT_TEXT] default_ar.error_code = " << default_ar.error_code); - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -QString MainWindow::print_log(const QString& param) -{ - TRY_ENTRY(); - PREPARE_ARG_FROM_JSON(view::print_log_params, plp); - - LOG_PRINT("[GUI_LOG]" << plp.msg, plp.log_level); - - default_ar.error_code = API_RETURN_CODE_OK; - return MAKE_RESPONSE(default_ar); - CATCH_ENTRY_FAIL_API_RESPONCE(); -} - -void MainWindow::show_notification(const std::string& title, const std::string& message) -{ - TRY_ENTRY(); - - if (m_config.disable_notifications) - return; - - LOG_PRINT_L1("system notification: \"" << title << "\", \"" << message << "\""); - - // it's expected that title and message are utf-8 encoded! - -#if !defined(__APPLE__) - // use Qt tray icon to show messages on Windows and Linux - CHECK_AND_ASSERT_MES(m_tray_icon != nullptr, (void)(0), "m_tray_icon is null!"); - m_tray_icon->showMessage(QString().fromUtf8(title.c_str()), QString().fromUtf8(message.c_str())); -#else - // use native notification system on macOS - notification_helper::show(title, message); -#endif - CATCH_ENTRY2(void()); -} diff --git a/src/gui/qt-daemon/application/mainwindow.h b/src/gui/qt-daemon/application/mainwindow.h deleted file mode 100644 index 9344d65f..00000000 --- a/src/gui/qt-daemon/application/mainwindow.h +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#pragma once -#include -#include -#include - -#include "wallet/view_iface.h" -#include "serialization/keyvalue_helper_structs.h" - - -#ifndef Q_MOC_RUN -#include "wallet/wallets_manager.h" -#include "currency_core/offers_services_helpers.h" -#endif - -#include "common/threads_pool.h" - -QT_BEGIN_NAMESPACE -class QWebEngineView; -class QLineEdit; -QT_END_NAMESPACE - - -#define APP_DATA_FILE_BINARY_SIGNATURE 0x1000111101101021LL - - -// class MediatorObject : public QObject -// { -// Q_OBJECT -// -// public: -// -// signals : -// /*! -// This signal is emitted from the C++ side and the text displayed on the HTML client side. -// */ -// void from_c_to_html(const QString &text); -// -// public slots: -// /*! -// This slot is invoked from the HTML client side and the text displayed on the server side. -// */ -// void from_html_to_c(const QString &text); -// }; - -// -class MainWindow : public QMainWindow, - public currency::i_core_event_handler, - public view::i_view, - public QAbstractNativeEventFilter -{ - Q_OBJECT - -public: - MainWindow(); - ~MainWindow() override; - - bool init_backend(int argc, char* argv[]); - bool show_inital(); - void show_notification(const std::string& title, const std::string& message); - bool handle_ipc_event(const std::string& arguments); - - struct app_config - { - - epee::kvserializable_pair m_window_position; - epee::kvserializable_pair m_window_size; - bool is_maximazed; - bool is_showed; - bool disable_notifications; - - BEGIN_KV_SERIALIZE_MAP() - KV_SERIALIZE(m_window_position) - KV_SERIALIZE(m_window_size) - KV_SERIALIZE(is_maximazed) - KV_SERIALIZE(is_showed) - KV_SERIALIZE(disable_notifications) - END_KV_SERIALIZE_MAP() - }; - - protected slots: - - void on_load_finished(bool ok); - bool do_close(); - - - public slots: - QString show_openfile_dialog(const QString& param); - QString show_savefile_dialog(const QString& param); - QString open_wallet(const QString& param); - QString get_my_offers(const QString& param); - QString get_fav_offers(const QString& param); - QString generate_wallet(const QString& param); - QString run_wallet(const QString& param); - QString close_wallet(const QString& wallet_id); - QString get_contracts(const QString& wallet_id); - QString create_proposal(const QString& param); - QString accept_proposal(const QString& param); - QString release_contract(const QString& param); - QString request_cancel_contract(const QString& param); - QString accept_cancel_contract(const QString& param); - - - QString on_request_quit(const QString& param); - QString get_version(const QString& param); - QString get_os_version(const QString& param); - QString get_network_type(const QString& param); - QString transfer(const QString& param); - QString have_secure_app_data(const QString& param); - QString drop_secure_app_data(); - QString get_secure_app_data(const QString& param); - QString store_secure_app_data(const QString& param, const QString& password); - QString set_master_password(const QString& param); - QString check_master_password(const QString& param); - QString get_app_data(const QString& param); - QString store_app_data(const QString& param); - QString get_default_user_dir(const QString& param); -// QString get_all_offers(const QString& param); - QString get_offers_ex(const QString& param); - QString push_offer(const QString& param); - QString cancel_offer(const QString& param); - QString push_update_offer(const QString& param); - QString get_alias_info_by_address(const QString& param); - QString get_alias_info_by_name(const QString& param); - QString get_all_aliases(const QString& param); - QString request_alias_registration(const QString& param); - QString request_alias_update(const QString& param); - QString get_alias_coast(const QString& param); - QString validate_address(const QString& param); - QString resync_wallet(const QString& param); - QString get_recent_transfers(const QString& param); - QString get_mining_history(const QString& param); - QString start_pos_mining(const QString& param); - QString stop_pos_mining(const QString& param); - QString set_log_level(const QString& param); - QString get_log_level(const QString& param); - QString set_enable_tor(const QString& param); -// QString dump_all_offers(); - QString webkit_launched_script(const QString& param); - QString get_smart_wallet_info(const QString& param); - QString restore_wallet(const QString& param); - QString use_whitelisting(const QString& param); - QString is_pos_allowed(const QString& param); - QString store_to_file(const QString& path, const QString& buff); - QString load_from_file(const QString& path); - QString is_file_exist(const QString& path); - QString get_mining_estimate(const QString& obj); - QString backup_wallet_keys(const QString& obj); - QString reset_wallet_password(const QString& param); - QString is_wallet_password_valid(const QString& param); - QString is_autostart_enabled(const QString& param); - QString toggle_autostart(const QString& param); - QString is_valid_restore_wallet_text(const QString& param); - QString get_seed_phrase_info(const QString& param); - QString print_text(const QString& param); - QString print_log(const QString& param); - QString set_clipboard(const QString& param); - QString set_localization_strings(const QString str); - QString get_clipboard(const QString& param); - void message_box(const QString& msg); - bool toggle_mining(const QString& param); - QString get_exchange_last_top(const QString& params); - QString get_tx_pool_info(const QString& param); - QString get_default_fee(const QString& param); - QString get_options(const QString& param); - void bool_toggle_icon(const QString& param); - QString add_custom_asset_id(const QString& param); - QString remove_custom_asset_id(const QString& param); - QString get_wallet_info(const QString& param); - - QString create_ionic_swap_proposal(const QString& param); - QString get_ionic_swap_proposal_info(const QString& param); - QString accept_ionic_swap_proposal(const QString& param); - - bool get_is_disabled_notifications(const QString& param); - bool set_is_disabled_notifications(const bool& param); - QString export_wallet_history(const QString& param); - QString get_log_file(const QString& param); - //QString check_available_sources(const QString& param); - QString open_url_in_browser(const QString& param); - QString setup_jwt_wallet_rpc(const QString& param); - - void trayIconActivated(QSystemTrayIcon::ActivationReason reason); - void tray_quit_requested(const QString& param); - void on_menu_show(const QString& param); - QString is_remnotenode_mode_preconfigured(const QString& param); - QString start_backend(const QString& params); - void show_notification(const QString& title, const QString& message); - - QString async_call(const QString& func_name, const QString& params); - QString sync_call(const QString& func_name, const QString& params); - - QString async_call_2a(const QString& func_name, const QString& params1, const QString& params2); - QString sync_call_2a(const QString& func_name, const QString& params1, const QString& params2); - - //for test purposes only - QString request_dummy(const QString& param); - - QString call_rpc(const QString& params); - QString call_wallet_rpc(const QString& wallet_id, const QString& params); - -signals: - void quit_requested(const QString str); - void update_daemon_state(const QString str); - void update_wallet_status(const QString str); - void update_wallet_info(const QString str); - void money_transfer(const QString str); - void money_transfer_cancel(const QString str); - void wallet_sync_progress(const QString str); - void handle_internal_callback(const QString str, const QString callback_name); - void update_pos_mining_text(const QString str); - void on_core_event(const QString method_name); //general function - void set_options(const QString str); //general function - void handle_deeplink_click(const QString str); - void handle_current_action_state(const QString str); - void dispatch_async_call_result(const QString id, const QString resp); //general function - -private: - //-------------------- i_core_event_handler -------------------- - virtual void on_core_event(const std::string event_name, const currency::core_event_v& e); - virtual void on_complete_events(); - virtual void on_clear_events(); - - //------- i_view --------- - virtual bool update_daemon_status(const view::daemon_status_info& info); - virtual bool on_backend_stopped(); - virtual bool show_msg_box(const std::string& message); - virtual bool update_wallet_status(const view::wallet_status_info& wsi); - virtual bool update_wallets_info(const view::wallets_summary_info& wsi); - virtual bool money_transfer(const view::transfer_event_info& tei); - virtual bool wallet_sync_progress(const view::wallet_sync_progres_param& p); - virtual bool money_transfer_cancel(const view::transfer_event_info& wsi); - virtual bool init(const std::string& path); - virtual bool pos_block_found(const currency::block& block_found); - virtual bool set_options(const view::gui_options& opt); - virtual bool update_tor_status(const view::current_action_status& opt); - //--------- QAbstractNativeEventFilter --------------------------- - bool nativeEventFilter(const QByteArray &eventType, void *message, qintptr *result) override; - //---------------------------------------------- - - - void closeEvent(QCloseEvent *event); - void contextMenuEvent(QContextMenuEvent * event); - void changeEvent(QEvent *e); - void on_maximized(); - bool handle_deeplink_params_in_commandline(); - //void setOrientation(Qt::ScreenOrientation orientation); - - - - void init_tray_icon(const std::string& htmlPath); - bool set_html_path(const std::string& path); - void load_file(const QString &fileName); - void store_pos(bool consider_showed = false); - void store_window_pos(); - void restore_pos(bool consider_showed = false); - bool store_app_config(); - bool load_app_config(); - bool init_window(); - bool init_ipc_server(); - bool remove_ipc(); - - - std::string get_wallet_log_prefix(size_t wallet_id) const { return m_backend.get_wallet_log_prefix(wallet_id); } - - - //MediatorObject mo; - // UI - QWebEngineView *m_view; - QWebChannel* m_channel; - - // DATA - wallets_manager m_backend; - //std::atomic m_quit_requested; - std::atomic m_gui_deinitialize_done_1; - std::atomic m_backend_stopped_2; - std::atomic m_system_shutdown; - std::atomic m_ui_dispatch_id_counter; - utils::threads_pool m_threads_pool; - - std::string m_master_password; - - - app_config m_config; - - epee::locked_object> m_wallet_states; - std::thread m_ipc_worker; - struct events_que_struct - { - std::list m_que; - - BEGIN_KV_SERIALIZE_MAP() - KV_SERIALIZE(m_que) - END_KV_SERIALIZE_MAP() - }; - events_que_struct m_events; - - std::vector m_localization; - - enum localization_string_indices - { - // order is surprisingly important here! (see also updateLocalisation in AppController.js) - localization_id_quit = 0, - localization_id_is_received, - localization_id_is_confirmed, - localization_id_income_transfer_unconfirmed, - localization_id_income_transfer_confirmed, - localization_id_mined, - localization_id_locked, - localization_id_minimized_text, - localization_id_minimized_title, - localization_id_tray_menu_show, - localization_id_tray_menu_minimize, - - localization_id_couter // keep it at the end of list - }; - - std::string m_normal_icon_path; - std::string m_blocked_icon_path; - - std::unique_ptr m_tray_icon; - std::unique_ptr m_tray_icon_menu; - std::unique_ptr m_restore_action; - std::unique_ptr m_quit_action; - std::unique_ptr m_minimize_action; - - std::string m_last_update_daemon_status_json; - - template - QString prepare_call(const char* name, const QString& param, callback_t cb) - { - LOG_PRINT_L0("que_call: [" << name << "]"); - view::api_response_t ar; - argument_type wio = AUTO_VAL_INIT(wio); - if (!epee::serialization::load_t_from_json(wio, param.toStdString())) - { - ar.error_code = API_RETURN_CODE_BAD_ARG; - return epee::serialization::store_t_to_json(ar).c_str(); - } - cb(wio, ar); - return epee::serialization::store_t_to_json(ar).c_str(); - } -}; - -namespace boost -{ - namespace serialization - { - template - void serialize(archive_t & ar, MainWindow::app_config& ac, const unsigned int version) - { - ar & ac.is_maximazed; - ar & ac.is_showed; - ar & ac.m_window_position; - ar & ac.m_window_size; - } - } -} diff --git a/src/gui/qt-daemon/application/notification_helper.h b/src/gui/qt-daemon/application/notification_helper.h deleted file mode 100644 index c00ccc88..00000000 --- a/src/gui/qt-daemon/application/notification_helper.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - - -#pragma once -#include -#include "epee/include/misc_log_ex.h" - -struct notification_helper -{ - static void show(const std::string& title, const std::string& message) -#if !defined(__APPLE__) - { - // just a stub, implemented for macOS only, see .mm - LOG_PRINT_RED("system notifications are supported only for macOS!", LOG_LEVEL_0); - } -#endif - ; -}; diff --git a/src/gui/qt-daemon/application/notification_helper.mm b/src/gui/qt-daemon/application/notification_helper.mm deleted file mode 100644 index 0c2a51f5..00000000 --- a/src/gui/qt-daemon/application/notification_helper.mm +++ /dev/null @@ -1,14 +0,0 @@ -#include "notification_helper.h" -#include -#include - -void notification_helper::show(const std::string& title, const std::string& message) -{ - NSUserNotification *userNotification = [[[NSUserNotification alloc] init] autorelease]; - userNotification.title = [NSString stringWithUTF8String:title.c_str()]; - userNotification.informativeText = [NSString stringWithUTF8String:message.c_str()]; - - NSUserNotificationCenter* center = [NSUserNotificationCenter defaultUserNotificationCenter]; - [center deliverNotification:userNotification]; -} - diff --git a/src/gui/qt-daemon/application/urleventfilter.cpp b/src/gui/qt-daemon/application/urleventfilter.cpp deleted file mode 100644 index 910b10f4..00000000 --- a/src/gui/qt-daemon/application/urleventfilter.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "urleventfilter.h" -#include - -bool URLEventFilter::eventFilter(QObject *obj, QEvent *event) -{ - if (event->type() == QEvent::FileOpen) { - QFileOpenEvent *fileEvent = static_cast(event); - if(!fileEvent->url().isEmpty()) - { - m_pmainwindow->handle_deeplink_click(fileEvent->url().toString()); - //QMessageBox msg; - //msg.setText(fileEvent->url().toString()); - //msg.exec(); - return true; - } - return true; - } else { - // standard event processing - return QObject::eventFilter(obj, event); - } - }; diff --git a/src/gui/qt-daemon/application/urleventfilter.h b/src/gui/qt-daemon/application/urleventfilter.h deleted file mode 100644 index 1e3e0dc2..00000000 --- a/src/gui/qt-daemon/application/urleventfilter.h +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include -#include -#include "mainwindow.h" - -class URLEventFilter : public QObject -{ - Q_OBJECT -public: - URLEventFilter(MainWindow* pmainwindow) : m_pmainwindow(pmainwindow),QObject() - {}; -protected: - bool eventFilter(QObject *obj, QEvent *event) override; - -private: - MainWindow* m_pmainwindow; -}; \ No newline at end of file diff --git a/src/gui/qt-daemon/main.cpp b/src/gui/qt-daemon/main.cpp deleted file mode 100644 index 89722222..00000000 --- a/src/gui/qt-daemon/main.cpp +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2017-2025 Lethean VPN -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#include -#include "application/mainwindow.h" -// #include "qdebug.h" -#include -// ReSharper disable once CppUnusedIncludeDirective -#include "include_base_utils.h" -#include "currency_core/currency_config.h" -#ifdef Q_OS_DARWIN -#include "application/urleventfilter.h" -#endif - -namespace -{ - using string_encoding::wstring_to_utf8; - using string_tools::set_module_name_and_folder; -} - -int main(int argc, char *argv[]) -{ - - if(argc > 1) - std::cout << argv[1] << std::endl; - -#ifdef _MSC_VER - #ifdef _WIN64 - _set_FMA3_enable(0); - #endif - //mutex to let InnoSetup know about running instance - CreateMutexA(nullptr, FALSE, CURRENCY_NAME_BASE "_instance"); -#endif - - -#ifdef WIN32 - WCHAR sz_file_name[MAX_PATH + 1] = L""; - GetModuleFileNameW(nullptr, sz_file_name, MAX_PATH + 1); - std::string path_to_process_utf8 = wstring_to_utf8(sz_file_name); -#else - std::string path_to_process_utf8 = argv[0]; -#endif - - TRY_ENTRY(); - set_module_name_and_folder(path_to_process_utf8); - - log_space::get_set_log_detalisation_level(true, LOG_LEVEL_0); - log_space::get_set_need_thread_id(true, true); - log_space::log_singletone::enable_channels("core,currency_protocol,tx_pool,p2p,wallet"); - - - QApplication app(argc, argv); - - MainWindow viewer; - if (!viewer.init_backend(argc, argv)) - { - return 1; - } - -#ifdef Q_OS_DARWIN - URLEventFilter url_event_filter(&viewer); - app.installEventFilter(&url_event_filter); -#endif - - app.installNativeEventFilter(&viewer); - viewer.setWindowTitle(CURRENCY_NAME_BASE); - viewer.show_inital(); - - int res = QApplication::exec(); - LOG_PRINT_L0("Process exit with code: " << res); - return res; - CATCH_ENTRY2(0); -} diff --git a/src/gui/qt-daemon/qtlogger.h b/src/gui/qt-daemon/qtlogger.h deleted file mode 100644 index b1ff2e76..00000000 --- a/src/gui/qt-daemon/qtlogger.h +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#pragma once - -#include - -//#define QT_CONSOLE_STREAM qDebug() - -#define QT_CONSOLE_STREAM(s) \ -{std::stringstream ss; ss << s; fputs(ss.str().c_str(), stderr); fflush(stderr);} - - - -//fputs(buf.c_str(), stderr); -//fflush(stderr); - - -void customHandler(QtMsgType type, const char* msg) { - fputs(msg, stderr); - fflush(stderr); -} - - -class qt_console_stream : public epee::log_space::ibase_log_stream -{ - QDebug db; -public: - qt_console_stream() : db(qDebug()) - { - // Somewhere in your program - //qInstallMsgHandler(customHandler); - } - - ~qt_console_stream() - { - } - - int get_type(){ return LOGGER_CONSOLE; } - - inline void set_console_color(int color, bool bright) - { - switch (color) - { - case epee::log_space::console_color_default: - if (bright) - {QT_CONSOLE_STREAM("\033[1;37m");} - else - {QT_CONSOLE_STREAM("\033[0m");} - break; - case epee::log_space::console_color_white: - if (bright) - {QT_CONSOLE_STREAM("\033[1;37m");} - else - {QT_CONSOLE_STREAM("\033[0;37m");} - break; - case epee::log_space::console_color_red: - if (bright) - {QT_CONSOLE_STREAM("\033[1;31m");} - else - {QT_CONSOLE_STREAM("\033[0;31m");} - break; - case epee::log_space::console_color_green: - if (bright) - {QT_CONSOLE_STREAM("\033[1;32m");} - else - {QT_CONSOLE_STREAM("\033[0;32m");} - break; - - case epee::log_space::console_color_blue: - if (bright) - {QT_CONSOLE_STREAM("\033[1;34m");} - else - {QT_CONSOLE_STREAM("\033[0;34m");} - break; - - case epee::log_space::console_color_cyan: - if (bright) - {QT_CONSOLE_STREAM("\033[1;36m");} - else - {QT_CONSOLE_STREAM("\033[0;36m");} - break; - - case epee::log_space::console_color_magenta: - if (bright) - {QT_CONSOLE_STREAM("\033[1;35m");} - else - {QT_CONSOLE_STREAM("\033[0;35m");} - break; - - case epee::log_space::console_color_yellow: - if (bright) - {QT_CONSOLE_STREAM("\033[1;33m");} - else - {QT_CONSOLE_STREAM("\033[0;33m");} - break; - - } - } - - inline void reset_console_color() - { - {QT_CONSOLE_STREAM("\033[0m");} - } - - virtual bool out_buffer(const char* buffer, int buffer_len, int log_level, int color, const char* plog_name = NULL) - { - if (plog_name) - return true; //skip alternative logs from console - - set_console_color(color, log_level < 1); - - std::string buf(buffer, buffer_len); - for (size_t i = 0; i != buf.size(); i++) - { - if (buf[i] == 7 || buf[i] == -107) - buf[i] = '^'; - //remove \n - //if (i == buf.size()-1) - // buf[i] = ' '; - } - - QT_CONSOLE_STREAM(buf.c_str()); - - - reset_console_color(); - return true; - } - - -}; From 06e7780df55ca6f9e9272fa0d3e3320631172f37 Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 18:18:41 +0100 Subject: [PATCH 05/66] updates licence MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit adds this to the bottom of whats there: // Copyright (c) 2017-2025 Lethean (https://lt.hn) // // Licensed under the European Union Public Licence (EUPL) version 1.2. // You may obtain a copy of the licence at: // // https://joinup.ec.europa.eu/software/page/eupl/licence-eupl // // The EUPL is a copyleft licence that is compatible with the MIT/X11 // licence used by the original projects; the MIT terms are therefore // considered “grandfathered” under the EUPL for this code. // // SPDX‑License‑Identifier: EUPL-1.2 // --- src/common/atomics_boost_serialization.h | 17 ++- src/common/base58.cpp | 17 ++- src/common/base58.h | 17 ++- src/common/boost_serialization_helper.h | 17 ++- src/common/boost_serialization_maps.h | 19 ++- src/common/boost_version_check.h | 19 ++- src/common/callstack_helper.cpp | 19 ++- src/common/callstack_helper.h | 19 ++- src/common/command_line.cpp | 19 ++- src/common/command_line.h | 17 ++- src/common/config_encrypt_helper.h | 19 ++- src/common/crypto_serialization.h | 19 ++- src/common/crypto_stream_operators.cpp | 19 ++- src/common/crypto_stream_operators.h | 19 ++- src/common/db_abstract_accessor.h | 17 ++- src/common/db_backend_base.h | 18 ++- src/common/db_backend_leveldb.cpp | 120 ++---------------- src/common/db_backend_leveldb.h | 16 ++- src/common/db_backend_lmdb.cpp | 20 ++- src/common/db_backend_lmdb.h | 20 ++- src/common/db_backend_mdbx.cpp | 20 ++- src/common/db_backend_mdbx.h | 20 ++- src/common/db_backend_selector.cpp | 19 ++- src/common/db_backend_selector.h | 19 ++- src/common/difficulty_boost_serialization.h | 15 ++- src/common/encryption_filter.cpp | 19 ++- src/common/encryption_filter.h | 17 ++- src/common/error_codes.h | 17 ++- src/common/general_purpose_commands_defs.h | 17 ++- src/common/int-util.h | 17 ++- src/common/make_hashable.h | 18 ++- src/common/median_db_cache.h | 16 ++- src/common/miniupnp_helper.h | 17 ++- src/common/mnemonic-encoding.cpp | 47 +++---- src/common/mnemonic-encoding.h | 43 +++---- src/common/ntp.cpp | 25 ++-- src/common/ntp.h | 17 ++- src/common/pod-class.h | 19 ++- src/common/pod_array_file_container.h | 19 ++- src/common/pre_download.h | 20 ++- src/common/threads_pool.h | 19 ++- src/common/tor_helper.h | 17 ++- ...unordered_containers_boost_serialization.h | 17 ++- src/common/utf8.h | 42 +++--- src/common/utf8/checked.h | 42 +++--- src/common/utf8/core.h | 42 +++--- src/common/utf8/cpp11.h | 42 +++--- src/common/utf8/cpp17.h | 42 +++--- src/common/utf8/cpp20.h | 42 +++--- src/common/utf8/unchecked.h | 42 +++--- src/common/util.cpp | 19 ++- src/common/util.h | 17 ++- src/common/variant_helper.h | 17 ++- src/common/varint.h | 17 ++- src/connectivity_tool/conn_tool.cpp | 19 ++- src/crypto/RIPEMD160.c | 50 +++----- src/crypto/RIPEMD160.h | 50 +++----- src/crypto/RIPEMD160_helper.cpp | 19 ++- src/crypto/RIPEMD160_helper.h | 19 ++- src/crypto/bitcoin/byteswap.h | 19 ++- src/crypto/bitcoin/common.h | 19 ++- src/crypto/bitcoin/cpuid.h | 19 ++- src/crypto/bitcoin/endian.h | 19 ++- src/crypto/bitcoin/sha256.cpp | 19 ++- src/crypto/bitcoin/sha256.h | 19 ++- src/crypto/bitcoin/sha256_helper.h | 19 ++- src/crypto/blake2-impl.h | 30 +++-- src/crypto/blake2.h | 30 +++-- src/crypto/blake2b-ref.c | 30 +++-- src/crypto/chacha8.c | 17 +++ src/crypto/chacha8.h | 19 ++- src/crypto/chacha8_stream.c | 17 +++ src/crypto/chacha8_stream.h | 17 +++ src/crypto/clsag.cpp | 20 ++- src/crypto/clsag.h | 20 ++- src/crypto/crypto-ops-data.c | 19 ++- src/crypto/crypto-ops.c | 40 +++--- src/crypto/crypto-ops.h | 20 ++- src/crypto/crypto-sugar.cpp | 20 ++- src/crypto/crypto-sugar.h | 20 ++- src/crypto/crypto.cpp | 19 ++- src/crypto/crypto.h | 19 ++- src/crypto/ecrypt-config.h | 17 +++ src/crypto/ecrypt-machine.h | 17 +++ src/crypto/ecrypt-portable.h | 17 +++ src/crypto/ecrypt-sync.h | 17 +++ src/crypto/eth_signature.cpp | 19 ++- src/crypto/eth_signature.h | 19 ++- src/crypto/generic-ops.h | 17 ++- src/crypto/hash-ops.h | 19 ++- src/crypto/hash.c | 20 ++- src/crypto/hash.h | 19 ++- src/crypto/initializer.h | 19 ++- src/crypto/keccak.c | 17 +++ src/crypto/keccak.h | 17 +++ src/crypto/msm.cpp | 19 ++- src/crypto/msm.h | 20 ++- src/crypto/one_out_of_many_proofs.cpp | 19 ++- src/crypto/one_out_of_many_proofs.h | 19 ++- src/crypto/random.c | 20 ++- src/crypto/random.h | 21 ++- src/crypto/range_proof_bpp.h | 20 ++- src/crypto/range_proof_bppe.h | 20 ++- src/crypto/range_proofs.cpp | 20 ++- src/crypto/range_proofs.h | 20 ++- src/crypto/tree-hash.c | 19 ++- src/crypto/zarcanum.cpp | 20 ++- src/crypto/zarcanum.h | 20 ++- src/currency_core/account.cpp | 17 ++- src/currency_core/account.h | 17 ++- .../account_boost_serialization.h | 17 ++- src/currency_core/alias_helper.h | 15 ++- src/currency_core/basic_api_response_codes.h | 17 ++- src/currency_core/basic_kv_structs.h | 17 ++- src/currency_core/basic_pow_helpers.cpp | 20 ++- src/currency_core/basic_pow_helpers.h | 17 ++- src/currency_core/bc_attachments_helpers.h | 16 ++- .../bc_attachments_helpers_basic.h | 18 ++- .../bc_attachments_service_manager.cpp | 16 ++- .../bc_attachments_service_manager.h | 16 ++- src/currency_core/bc_block_datetime_service.h | 19 ++- src/currency_core/bc_escrow_service.h | 16 ++- src/currency_core/bc_offers_serialization.h | 16 ++- src/currency_core/bc_offers_service.cpp | 16 ++- src/currency_core/bc_offers_service.h | 16 ++- src/currency_core/bc_offers_service_basic.h | 16 ++- src/currency_core/bc_payments_id_service.h | 16 ++- src/currency_core/block_chain_shortener.cpp | 19 ++- src/currency_core/block_chain_shortener.h | 17 ++- src/currency_core/block_flags.h | 15 ++- src/currency_core/blockchain_storage.cpp | 18 ++- src/currency_core/blockchain_storage.h | 18 ++- src/currency_core/blockchain_storage_basic.h | 18 ++- .../blockchain_storage_boost_serialization.h | 17 ++- src/currency_core/checkpoints.cpp | 17 ++- src/currency_core/checkpoints.h | 17 ++- src/currency_core/checkpoints_create.h | 17 ++- src/currency_core/connection_context.h | 17 ++- src/currency_core/core_runtime_config.h | 17 ++- src/currency_core/core_tools.h | 18 ++- src/currency_core/crypto_config.h | 18 ++- src/currency_core/currency_basic.h | 20 ++- .../currency_basic_backward_comp.inl | 19 ++- .../currency_boost_serialization.h | 17 ++- src/currency_core/currency_core.cpp | 18 ++- src/currency_core/currency_core.h | 18 ++- src/currency_core/currency_format_utils.cpp | 18 ++- src/currency_core/currency_format_utils.h | 18 ++- .../currency_format_utils_abstract.h | 19 ++- .../currency_format_utils_blocks.cpp | 19 ++- .../currency_format_utils_blocks.h | 19 ++- .../currency_format_utils_transactions.cpp | 19 ++- .../currency_format_utils_transactions.h | 19 ++- src/currency_core/currency_stat_info.h | 17 ++- src/currency_core/difficulty.cpp | 17 ++- src/currency_core/difficulty.h | 17 ++- src/currency_core/dispatch_core_events.h | 17 ++- .../etc_custom_serialization.cpp | 17 ++- src/currency_core/etc_custom_serialization.h | 17 ++- src/currency_core/genesis.cpp | 18 ++- src/currency_core/genesis.h | 18 ++- src/currency_core/genesis_acc.cpp | 17 ++- src/currency_core/genesis_acc.h | 16 ++- src/currency_core/miner.cpp | 16 ++- src/currency_core/miner.h | 18 ++- src/currency_core/offers_service_basics.h | 16 ++- src/currency_core/offers_services_helpers.cpp | 15 ++- src/currency_core/offers_services_helpers.h | 15 ++- src/currency_core/pos_mining.cpp | 18 ++- src/currency_core/pos_mining.h | 18 ++- src/currency_core/tx_pool.cpp | 17 ++- src/currency_core/tx_pool.h | 17 ++- src/currency_core/tx_semantic_validation.cpp | 19 ++- src/currency_core/tx_semantic_validation.h | 19 ++- src/currency_core/verification_context.h | 17 ++- src/currency_protocol/blobdatatype.h | 19 ++- .../currency_protocol_defs.h | 19 ++- .../currency_protocol_defs_print.h | 17 ++- .../currency_protocol_handler.h | 17 ++- .../currency_protocol_handler.inl | 19 ++- .../currency_protocol_handler_common.h | 17 ++- src/daemon/daemon.cpp | 19 ++- src/daemon/daemon_commands_handler.h | 19 ++- .../generate_test_genesis.cpp | 15 ++- src/miner/simpleminer.cpp | 20 ++- src/miner/simpleminer.h | 20 ++- src/miner/target_helper.h | 20 ++- .../maintainers_info_boost_serialization.h | 17 ++- src/p2p/net_node.h | 19 ++- src/p2p/net_node.inl | 19 ++- src/p2p/net_node_common.h | 17 ++- src/p2p/net_peerlist.h | 19 ++- src/p2p/net_peerlist_boost_serialization.h | 17 ++- src/p2p/p2p_networks.h | 17 ++- src/p2p/p2p_protocol_defs.h | 19 ++- src/pch/stdafx.cpp | 17 +++ src/pch/stdafx.h | 20 ++- src/platform/mingw/alloca.h | 19 ++- src/platform/msc/alloca.h | 19 ++- src/platform/msc/inline_c.h | 19 ++- src/platform/msc/stdbool.h | 19 ++- src/platform/msc/sys/param.h | 19 ++- src/rpc/core_rpc_server.cpp | 19 ++- src/rpc/core_rpc_server.h | 19 ++- src/rpc/core_rpc_server_commands_defs.h | 19 ++- src/rpc/core_rpc_server_error_codes.h | 17 ++- src/serialization/binary_archive.h | 20 ++- src/serialization/binary_utils.h | 20 ++- src/serialization/boost_types.h | 21 ++- src/serialization/debug_archive.h | 20 ++- src/serialization/json_archive.h | 21 ++- src/serialization/json_utils.h | 20 ++- src/serialization/multiprecision.h | 19 ++- src/serialization/serialization.h | 20 ++- src/serialization/serialize_basic_types.h | 19 ++- src/serialization/stl_containers.h | 20 ++- src/serialization/string.h | 20 ++- src/serialization/variant.h | 20 ++- src/simplewallet/password_container.cpp | 19 ++- src/simplewallet/password_container.h | 19 ++- src/simplewallet/simplewallet.cpp | 19 ++- src/simplewallet/simplewallet.h | 19 ++- src/stratum/stratum_helpers.h | 18 ++- src/stratum/stratum_server.cpp | 18 ++- src/stratum/stratum_server.h | 18 ++- src/wallet/core_default_rpc_proxy.cpp | 17 ++- src/wallet/core_default_rpc_proxy.h | 17 ++- src/wallet/core_fast_rpc_proxy.h | 15 ++- src/wallet/core_rpc_proxy.h | 17 ++- src/wallet/decoy_selection.cpp | 19 ++- src/wallet/decoy_selection.h | 19 ++- .../decoy_selection_default_distribution.hpp | 19 ++- src/wallet/plain_wallet_api.cpp | 19 ++- src/wallet/plain_wallet_api.h | 19 ++- src/wallet/plain_wallet_api_defs.h | 19 ++- src/wallet/view_iface.h | 15 ++- src/wallet/wallet2.cpp | 19 ++- src/wallet/wallet2.h | 19 ++- src/wallet/wallet2_base.h | 19 ++- src/wallet/wallet2_escrow.cpp | 17 ++- src/wallet/wallet_debug_events_definitions.h | 19 ++- src/wallet/wallet_errors.h | 19 ++- src/wallet/wallet_helpers.h | 19 ++- src/wallet/wallet_id_adapter.h | 17 ++- src/wallet/wallet_public_structs_defs.h | 17 ++- src/wallet/wallet_rpc_server.cpp | 19 ++- src/wallet/wallet_rpc_server.h | 17 ++- src/wallet/wallet_rpc_server_error_codes.h | 17 ++- src/wallet/wallets_manager.cpp | 15 ++- src/wallet/wallets_manager.h | 15 ++- src/wallet/wrap_service.h | 17 ++- 251 files changed, 3789 insertions(+), 1215 deletions(-) diff --git a/src/common/atomics_boost_serialization.h b/src/common/atomics_boost_serialization.h index e9aa9798..c057f27a 100644 --- a/src/common/atomics_boost_serialization.h +++ b/src/common/atomics_boost_serialization.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/base58.cpp b/src/common/base58.cpp index 76e277c3..ec9d1dd1 100644 --- a/src/common/base58.cpp +++ b/src/common/base58.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/common/base58.h b/src/common/base58.h index be09658d..3f56a485 100644 --- a/src/common/base58.h +++ b/src/common/base58.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/boost_serialization_helper.h b/src/common/boost_serialization_helper.h index 1f2297a4..7ac00587 100644 --- a/src/common/boost_serialization_helper.h +++ b/src/common/boost_serialization_helper.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/boost_serialization_maps.h b/src/common/boost_serialization_maps.h index f6704b95..70f7feff 100644 --- a/src/common/boost_serialization_maps.h +++ b/src/common/boost_serialization_maps.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2022 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/common/boost_version_check.h b/src/common/boost_version_check.h index 73d96810..cd48029e 100644 --- a/src/common/boost_version_check.h +++ b/src/common/boost_version_check.h @@ -1,6 +1,19 @@ -// Copyright (c) 2025 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/callstack_helper.cpp b/src/common/callstack_helper.cpp index 939dc929..fbbe99aa 100644 --- a/src/common/callstack_helper.cpp +++ b/src/common/callstack_helper.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2019-2025 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #if defined(WIN32) diff --git a/src/common/callstack_helper.h b/src/common/callstack_helper.h index 439ddcd8..4e0bbb19 100644 --- a/src/common/callstack_helper.h +++ b/src/common/callstack_helper.h @@ -1,6 +1,19 @@ -// Copyright (c) 2019-2025 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/common/command_line.cpp b/src/common/command_line.cpp index ff83104d..5897165c 100644 --- a/src/common/command_line.cpp +++ b/src/common/command_line.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "command_line.h" diff --git a/src/common/command_line.h b/src/common/command_line.h index 6797cc18..fdb3fb29 100644 --- a/src/common/command_line.h +++ b/src/common/command_line.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/config_encrypt_helper.h b/src/common/config_encrypt_helper.h index c2208c79..d9219356 100644 --- a/src/common/config_encrypt_helper.h +++ b/src/common/config_encrypt_helper.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2020 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/crypto_serialization.h b/src/common/crypto_serialization.h index ae94403c..73221027 100644 --- a/src/common/crypto_serialization.h +++ b/src/common/crypto_serialization.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include #include diff --git a/src/common/crypto_stream_operators.cpp b/src/common/crypto_stream_operators.cpp index cc87dd37..565c55d6 100644 --- a/src/common/crypto_stream_operators.cpp +++ b/src/common/crypto_stream_operators.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "crypto_stream_operators.h" bool parse_hash256(const std::string str_hash, crypto::hash& hash) diff --git a/src/common/crypto_stream_operators.h b/src/common/crypto_stream_operators.h index fa2531de..b5ff318b 100644 --- a/src/common/crypto_stream_operators.h +++ b/src/common/crypto_stream_operators.h @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/common/db_abstract_accessor.h b/src/common/db_abstract_accessor.h index b5fefad4..3bd9ff28 100644 --- a/src/common/db_abstract_accessor.h +++ b/src/common/db_abstract_accessor.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/common/db_backend_base.h b/src/common/db_backend_base.h index 01c87e1b..850daec1 100644 --- a/src/common/db_backend_base.h +++ b/src/common/db_backend_base.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/db_backend_leveldb.cpp b/src/common/db_backend_leveldb.cpp index c408c43a..a34b249e 100644 --- a/src/common/db_backend_leveldb.cpp +++ b/src/common/db_backend_leveldb.cpp @@ -1,109 +1,17 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. -// -// #pragma once -// #include "db_backend_leveldb.h" -// -// namespace tools -// { -// namespace db -// { -// level_db_backend : public i_db_backend -// { -// std::string m_path; -// db_handle m_pdb; -// public: -// basic_db() :m_pdb(nullptr) -// {} -// ~basic_db(){ close(); } -// bool close() -// { -// if (m_pdb) -// delete m_pdb; -// m_pdb = nullptr; -// -// return true; -// } -// -// void begin_transaction() -// { -// //leveldb is not supporting transactions yet -// } -// -// void commit_transaction() -// { -// //leveldb is not supporting transactions yet -// } -// -// -// bool open(const std::string& path) -// { -// m_path = path; -// close(); -// leveldb::Options options; -// options.create_if_missing = true; -// leveldb::Status status = leveldb::DB::Open(options, path, &m_pdb); -// if (!status.ok()) -// { -// LOG_ERROR("Unable to open/create database " << path << ", error: " << status.ToString()); -// return err_handle; -// } -// return true; -// } -// -// bool erase(const char* k, size s) -// { -// TRY_ENTRY(); -// leveldb::WriteOptions wo; -// wo.sync = true; -// leveldb::Status s = m_pdb->Delete(wo, leveldb::Slice(k, s)); -// if (!s.ok()) -// return false; -// -// return true; -// CATCH_ENTRY_L0("get_t_object_from_db", false); -// } -// -// -// bool get(const char* k, size s, std::string& res_buff) -// { -// TRY_ENTRY(); -// leveldb::ReadOptions ro; -// leveldb::Status s = m_pdb->Get(ro, leveldb::Slice(k, s), &res_buff); -// if (!s.ok()) -// return false; -// -// CATCH_ENTRY_L0("get_t_object_from_db", false); -// } -// -// bool clear() -// { -// close(); -// boost::system::error_code ec; -// bool res = boost::filesystem::remove_all(m_path, ec); -// if (!res) -// { -// LOG_ERROR("Failed to remove db file " << m_path << ", why: " << ec); -// return false; -// } -// return open(m_path); -// } -// -// bool set(const char* k, size s, const char* v, size vs) -// { -// TRY_ENTRY(); -// leveldb::WriteOptions wo; -// wo.sync = true; -// leveldb::Status s = m_pdb->Put(wo, leveldb::Slice(k, s), leveldb::Slice(v, vs)); -// if (!s.ok()) -// return false; -// -// return true; -// CATCH_ENTRY_L0("set_t_object_to_db", false); -// } -// }; -// } -// } +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// diff --git a/src/common/db_backend_leveldb.h b/src/common/db_backend_leveldb.h index 541f3d64..b014618a 100644 --- a/src/common/db_backend_leveldb.h +++ b/src/common/db_backend_leveldb.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "include_base_utils.h" diff --git a/src/common/db_backend_lmdb.cpp b/src/common/db_backend_lmdb.cpp index d23fff80..fcd07460 100644 --- a/src/common/db_backend_lmdb.cpp +++ b/src/common/db_backend_lmdb.cpp @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "db_backend_lmdb.h" #include "misc_language.h" diff --git a/src/common/db_backend_lmdb.h b/src/common/db_backend_lmdb.h index c2920f0c..9d664cd8 100644 --- a/src/common/db_backend_lmdb.h +++ b/src/common/db_backend_lmdb.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/db_backend_mdbx.cpp b/src/common/db_backend_mdbx.cpp index 3307dec8..a303a7b6 100644 --- a/src/common/db_backend_mdbx.cpp +++ b/src/common/db_backend_mdbx.cpp @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifdef ENABLED_ENGINE_MDBX #include "db_backend_mdbx.h" #include "misc_language.h" diff --git a/src/common/db_backend_mdbx.h b/src/common/db_backend_mdbx.h index af5363f6..2f21c3dc 100644 --- a/src/common/db_backend_mdbx.h +++ b/src/common/db_backend_mdbx.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #ifdef ENABLED_ENGINE_MDBX diff --git a/src/common/db_backend_selector.cpp b/src/common/db_backend_selector.cpp index 33f1382f..f88fa73d 100644 --- a/src/common/db_backend_selector.cpp +++ b/src/common/db_backend_selector.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2020 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "db_backend_selector.h" #include "currency_core/currency_config.h" diff --git a/src/common/db_backend_selector.h b/src/common/db_backend_selector.h index 54c4a10a..f2e6c210 100644 --- a/src/common/db_backend_selector.h +++ b/src/common/db_backend_selector.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2020 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/difficulty_boost_serialization.h b/src/common/difficulty_boost_serialization.h index 3630423f..d2a41796 100644 --- a/src/common/difficulty_boost_serialization.h +++ b/src/common/difficulty_boost_serialization.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/encryption_filter.cpp b/src/common/encryption_filter.cpp index 8861fa8c..ef42316b 100644 --- a/src/common/encryption_filter.cpp +++ b/src/common/encryption_filter.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "encryption_filter.h" diff --git a/src/common/encryption_filter.h b/src/common/encryption_filter.h index 854dc7ad..a1f32e15 100644 --- a/src/common/encryption_filter.h +++ b/src/common/encryption_filter.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/error_codes.h b/src/common/error_codes.h index 3a629d5e..426a60d8 100644 --- a/src/common/error_codes.h +++ b/src/common/error_codes.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/general_purpose_commands_defs.h b/src/common/general_purpose_commands_defs.h index f9da9968..ad17bf70 100644 --- a/src/common/general_purpose_commands_defs.h +++ b/src/common/general_purpose_commands_defs.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "serialization/keyvalue_hexemizer.h" diff --git a/src/common/int-util.h b/src/common/int-util.h index ddf06dfe..808cda7b 100644 --- a/src/common/int-util.h +++ b/src/common/int-util.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/make_hashable.h b/src/common/make_hashable.h index c22bfa45..84769874 100644 --- a/src/common/make_hashable.h +++ b/src/common/make_hashable.h @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2020 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/median_db_cache.h b/src/common/median_db_cache.h index 2e2dea50..6cca9d08 100644 --- a/src/common/median_db_cache.h +++ b/src/common/median_db_cache.h @@ -1,9 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "misc_language.h" diff --git a/src/common/miniupnp_helper.h b/src/common/miniupnp_helper.h index 319740b0..453f9035 100644 --- a/src/common/miniupnp_helper.h +++ b/src/common/miniupnp_helper.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/mnemonic-encoding.cpp b/src/common/mnemonic-encoding.cpp index f52ece6b..541ac19e 100644 --- a/src/common/mnemonic-encoding.cpp +++ b/src/common/mnemonic-encoding.cpp @@ -1,40 +1,25 @@ -// Copyright (c) 2014, The Monero Project -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are -// permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list -// of conditions and the following disclaimer in the documentation and/or other -// materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific -// prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// /* * This file and its cpp file are for translating Electrum-style word lists * into their equivalent byte representations for cross-compatibility with * that method of "backing up" one's wallet keys. */ -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project - - #include #include #include diff --git a/src/common/mnemonic-encoding.h b/src/common/mnemonic-encoding.h index 5e235399..03516f8b 100644 --- a/src/common/mnemonic-encoding.h +++ b/src/common/mnemonic-encoding.h @@ -1,30 +1,19 @@ -// Copyright (c) 2014, The Monero Project -// -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, are -// permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright notice, this list -// of conditions and the following disclaimer in the documentation and/or other -// materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific -// prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL -// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF -// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// /* * This file and its cpp file are for translating Electrum-style word lists diff --git a/src/common/ntp.cpp b/src/common/ntp.cpp index 0b50e9be..89bf9783 100644 --- a/src/common/ntp.cpp +++ b/src/common/ntp.cpp @@ -1,13 +1,20 @@ -// Copyright (c) 2019-2022 Zano Project +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// -// Note: class udp_blocking_client is a slightly modified version of an example -// taken from https://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/timeouts/blocking_udp_client.cpp -// -// Copyright (c) 2003-2012 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// #include #include #include diff --git a/src/common/ntp.h b/src/common/ntp.h index 4e453b32..99ad9ed7 100644 --- a/src/common/ntp.h +++ b/src/common/ntp.h @@ -1,4 +1,19 @@ -// Copyright (c) 2019 Zano Project +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/common/pod-class.h b/src/common/pod-class.h index 84c89994..47dca67a 100644 --- a/src/common/pod-class.h +++ b/src/common/pod-class.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/pod_array_file_container.h b/src/common/pod_array_file_container.h index e165480c..8aa30b90 100644 --- a/src/common/pod_array_file_container.h +++ b/src/common/pod_array_file_container.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/common/pre_download.h b/src/common/pre_download.h index cd2adb74..9d4931f7 100644 --- a/src/common/pre_download.h +++ b/src/common/pre_download.h @@ -1,7 +1,19 @@ -// Copyright (c) 2020 Zano Project -// Copyright (c) 2012-2018 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/common/threads_pool.h b/src/common/threads_pool.h index 23f4e857..fcb65104 100644 --- a/src/common/threads_pool.h +++ b/src/common/threads_pool.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/tor_helper.h b/src/common/tor_helper.h index 48cabba1..58f6a378 100644 --- a/src/common/tor_helper.h +++ b/src/common/tor_helper.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/unordered_containers_boost_serialization.h b/src/common/unordered_containers_boost_serialization.h index 644133f4..fba5afc3 100644 --- a/src/common/unordered_containers_boost_serialization.h +++ b/src/common/unordered_containers_boost_serialization.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/utf8.h b/src/common/utf8.h index b5135309..099d4862 100644 --- a/src/common/utf8.h +++ b/src/common/utf8.h @@ -1,29 +1,19 @@ -// Copyright 2006 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_2675DCD0_9480_4c0c_B92A_CC14C027B731 diff --git a/src/common/utf8/checked.h b/src/common/utf8/checked.h index 98949f8b..2b21c65a 100644 --- a/src/common/utf8/checked.h +++ b/src/common/utf8/checked.h @@ -1,29 +1,19 @@ -// Copyright 2006-2016 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 diff --git a/src/common/utf8/core.h b/src/common/utf8/core.h index af22969e..c1175862 100644 --- a/src/common/utf8/core.h +++ b/src/common/utf8/core.h @@ -1,29 +1,19 @@ -// Copyright 2006 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_CORE_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 diff --git a/src/common/utf8/cpp11.h b/src/common/utf8/cpp11.h index 691633c8..743f6fa4 100644 --- a/src/common/utf8/cpp11.h +++ b/src/common/utf8/cpp11.h @@ -1,29 +1,19 @@ -// Copyright 2018 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef UTF8_FOR_CPP_a184c22c_d012_11e8_a8d5_f2801f1b9fd1 #define UTF8_FOR_CPP_a184c22c_d012_11e8_a8d5_f2801f1b9fd1 diff --git a/src/common/utf8/cpp17.h b/src/common/utf8/cpp17.h index 6e2fcc23..7c1f4d49 100644 --- a/src/common/utf8/cpp17.h +++ b/src/common/utf8/cpp17.h @@ -1,29 +1,19 @@ -// Copyright 2018 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef UTF8_FOR_CPP_7e906c01_03a3_4daf_b420_ea7ea952b3c9 #define UTF8_FOR_CPP_7e906c01_03a3_4daf_b420_ea7ea952b3c9 diff --git a/src/common/utf8/cpp20.h b/src/common/utf8/cpp20.h index 07b61d0f..4d956893 100644 --- a/src/common/utf8/cpp20.h +++ b/src/common/utf8/cpp20.h @@ -1,29 +1,19 @@ -// Copyright 2022 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef UTF8_FOR_CPP_207e906c01_03a3_4daf_b420_ea7ea952b3c9 #define UTF8_FOR_CPP_207e906c01_03a3_4daf_b420_ea7ea952b3c9 diff --git a/src/common/utf8/unchecked.h b/src/common/utf8/unchecked.h index bf291789..b1287790 100644 --- a/src/common/utf8/unchecked.h +++ b/src/common/utf8/unchecked.h @@ -1,29 +1,19 @@ -// Copyright 2006 Nemanja Trifunovic - -/* -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -*/ - +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 #define UTF8_FOR_CPP_UNCHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731 diff --git a/src/common/util.cpp b/src/common/util.cpp index 58bcd243..619b50cd 100644 --- a/src/common/util.cpp +++ b/src/common/util.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "include_base_utils.h" #include "zlib_helper.h" @@ -907,7 +918,7 @@ std::string get_nix_version_display_string() // { // unsigned char c2 = data[i + 1]; // // Valid second byte: 10xxxxxx -// // Also ensure its not an overlong encoding (0xC0, 0xC1 are invalid starts) +// // Also ensure it�s not an overlong encoding (0xC0, 0xC1 are invalid starts) // if ((c2 & 0xC0) == 0x80 && (c & 0xFE) != 0xC0) // { // sanitized.push_back(static_cast(c)); diff --git a/src/common/util.h b/src/common/util.h index 3b74e4dc..c686bfaf 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/variant_helper.h b/src/common/variant_helper.h index 4eb12546..b8e47bdf 100644 --- a/src/common/variant_helper.h +++ b/src/common/variant_helper.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/common/varint.h b/src/common/varint.h index 249fce23..31f48be7 100644 --- a/src/common/varint.h +++ b/src/common/varint.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/connectivity_tool/conn_tool.cpp b/src/connectivity_tool/conn_tool.cpp index 1bc6edc4..021d59bb 100644 --- a/src/connectivity_tool/conn_tool.cpp +++ b/src/connectivity_tool/conn_tool.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// diff --git a/src/crypto/RIPEMD160.c b/src/crypto/RIPEMD160.c index 0f832305..edd62906 100644 --- a/src/crypto/RIPEMD160.c +++ b/src/crypto/RIPEMD160.c @@ -1,37 +1,19 @@ -/********************************************************************\ -* -* FILE: rmd160.c -* -* CONTENTS: A sample C-implementation of the RIPEMD-160 -* hash-function. -* TARGET: any computer with an ANSI C compiler -* -* AUTHOR: Antoon Bosselaers, ESAT-COSIC -* DATE: 1 March 1996 -* VERSION: 1.0 -* -* Copyright (c) 1996 Katholieke Universiteit Leuven -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without restriction, -* including without limitation the rights to use, copy, modify, merge, -* publish, distribute, sublicense, and/or sell copies of the Software, -* and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -\********************************************************************/ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// /* header files */ #include diff --git a/src/crypto/RIPEMD160.h b/src/crypto/RIPEMD160.h index f0ea97ef..e1d1a98d 100644 --- a/src/crypto/RIPEMD160.h +++ b/src/crypto/RIPEMD160.h @@ -1,37 +1,19 @@ -/********************************************************************\ -* -* FILE: rmd160.h -* -* CONTENTS: Header file for a sample C-implementation of the -* RIPEMD-160 hash-function. -* TARGET: any computer with an ANSI C compiler -* -* AUTHOR: Antoon Bosselaers, ESAT-COSIC -* DATE: 1 March 1996 -* VERSION: 1.0 -* -* Copyright (c) 1996 Katholieke Universiteit Leuven -* -* Permission is hereby granted, free of charge, to any person -* obtaining a copy of this software and associated documentation -* files (the "Software"), to deal in the Software without restriction, -* including without limitation the rights to use, copy, modify, merge, -* publish, distribute, sublicense, and/or sell copies of the Software, -* and to permit persons to whom the Software is furnished to do so, -* subject to the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -* -\********************************************************************/ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef RMD160H /* make sure this file is read only once */ #define RMD160H diff --git a/src/crypto/RIPEMD160_helper.cpp b/src/crypto/RIPEMD160_helper.cpp index 9962802f..4ed7f5c5 100644 --- a/src/crypto/RIPEMD160_helper.cpp +++ b/src/crypto/RIPEMD160_helper.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2020 The Zano developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "RIPEMD160_helper.h" #include "auto_val_init.h" extern "C" { diff --git a/src/crypto/RIPEMD160_helper.h b/src/crypto/RIPEMD160_helper.h index 2257e2bb..08d4693c 100644 --- a/src/crypto/RIPEMD160_helper.h +++ b/src/crypto/RIPEMD160_helper.h @@ -1,6 +1,19 @@ -// Copyright (c) 2020 The Zano developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/bitcoin/byteswap.h b/src/crypto/bitcoin/byteswap.h index 27ef1a18..64ab1742 100644 --- a/src/crypto/bitcoin/byteswap.h +++ b/src/crypto/bitcoin/byteswap.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2019 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef BITCOIN_COMPAT_BYTESWAP_H #define BITCOIN_COMPAT_BYTESWAP_H diff --git a/src/crypto/bitcoin/common.h b/src/crypto/bitcoin/common.h index afaf0e11..9387cf3b 100644 --- a/src/crypto/bitcoin/common.h +++ b/src/crypto/bitcoin/common.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2018 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef BITCOIN_CRYPTO_COMMON_H #define BITCOIN_CRYPTO_COMMON_H diff --git a/src/crypto/bitcoin/cpuid.h b/src/crypto/bitcoin/cpuid.h index 0877ad47..18c1fbbc 100644 --- a/src/crypto/bitcoin/cpuid.h +++ b/src/crypto/bitcoin/cpuid.h @@ -1,6 +1,19 @@ -// Copyright (c) 2017-2019 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef BITCOIN_COMPAT_CPUID_H #define BITCOIN_COMPAT_CPUID_H diff --git a/src/crypto/bitcoin/endian.h b/src/crypto/bitcoin/endian.h index 354c6372..eb9d87e4 100644 --- a/src/crypto/bitcoin/endian.h +++ b/src/crypto/bitcoin/endian.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2018 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef BITCOIN_COMPAT_ENDIAN_H #define BITCOIN_COMPAT_ENDIAN_H diff --git a/src/crypto/bitcoin/sha256.cpp b/src/crypto/bitcoin/sha256.cpp index 20c994f3..5d975b6d 100644 --- a/src/crypto/bitcoin/sha256.cpp +++ b/src/crypto/bitcoin/sha256.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2019 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "sha256.h" #include "common.h" diff --git a/src/crypto/bitcoin/sha256.h b/src/crypto/bitcoin/sha256.h index 80d3625c..ca690ded 100644 --- a/src/crypto/bitcoin/sha256.h +++ b/src/crypto/bitcoin/sha256.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2018 The Bitcoin Core developers -// Distributed under the MIT software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef BITCOIN_CRYPTO_SHA256_H #define BITCOIN_CRYPTO_SHA256_H diff --git a/src/crypto/bitcoin/sha256_helper.h b/src/crypto/bitcoin/sha256_helper.h index f376913a..5dd395d2 100644 --- a/src/crypto/bitcoin/sha256_helper.h +++ b/src/crypto/bitcoin/sha256_helper.h @@ -1,6 +1,19 @@ -// Copyright (c) 2020 The Zano developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/blake2-impl.h b/src/crypto/blake2-impl.h index c1df82e0..6ee612fb 100644 --- a/src/crypto/blake2-impl.h +++ b/src/crypto/blake2-impl.h @@ -1,17 +1,19 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef BLAKE2_IMPL_H #define BLAKE2_IMPL_H diff --git a/src/crypto/blake2.h b/src/crypto/blake2.h index 4949c650..46d6081e 100644 --- a/src/crypto/blake2.h +++ b/src/crypto/blake2.h @@ -1,17 +1,19 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifndef BLAKE2_H #define BLAKE2_H diff --git a/src/crypto/blake2b-ref.c b/src/crypto/blake2b-ref.c index cd38b1ba..80219b27 100644 --- a/src/crypto/blake2b-ref.c +++ b/src/crypto/blake2b-ref.c @@ -1,17 +1,19 @@ -/* - BLAKE2 reference source code package - reference C implementations - - Copyright 2012, Samuel Neves . You may use this under the - terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at - your option. The terms of these licenses can be found at: - - - CC0 1.0 Universal : http://creativecommons.org/publicdomain/zero/1.0 - - OpenSSL license : https://www.openssl.org/source/license.html - - Apache 2.0 : http://www.apache.org/licenses/LICENSE-2.0 - - More information about the BLAKE2 hash function can be found at - https://blake2.net. -*/ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/crypto/chacha8.c b/src/crypto/chacha8.c index df135af5..3f353db3 100644 --- a/src/crypto/chacha8.c +++ b/src/crypto/chacha8.c @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + /* chacha-merged.c version 20080118 D. J. Bernstein diff --git a/src/crypto/chacha8.h b/src/crypto/chacha8.h index cebc6abe..49102273 100644 --- a/src/crypto/chacha8.h +++ b/src/crypto/chacha8.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/chacha8_stream.c b/src/crypto/chacha8_stream.c index 94d9d816..18ea84ee 100644 --- a/src/crypto/chacha8_stream.c +++ b/src/crypto/chacha8_stream.c @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + /* chacha-ref.c version 20080118 D. J. Bernstein diff --git a/src/crypto/chacha8_stream.h b/src/crypto/chacha8_stream.h index a2d0b070..6df84ba6 100644 --- a/src/crypto/chacha8_stream.h +++ b/src/crypto/chacha8_stream.h @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + /* ecrypt-sync.h */ /* diff --git a/src/crypto/clsag.cpp b/src/crypto/clsag.cpp index 26be2c59..01c92d7e 100644 --- a/src/crypto/clsag.cpp +++ b/src/crypto/clsag.cpp @@ -1,10 +1,18 @@ -// Copyright (c) 2022-2024 Zano Project -// Copyright (c) 2022-2024 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) // -// This file contains implementation of the original d-CLSAG (s.a. https://eprint.iacr.org/2019/654.pdf by Goodel at el) -// and the extended d/v-CLSAG version (s.a. https://github.com/hyle-team/docs/blob/master/zano/dv-CLSAG-extension/ by sowle) +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // #include "clsag.h" //#include "misc_log_ex.h" diff --git a/src/crypto/clsag.h b/src/crypto/clsag.h index 924af50d..018eb8db 100644 --- a/src/crypto/clsag.h +++ b/src/crypto/clsag.h @@ -1,10 +1,18 @@ -// Copyright (c) 2022-2024 Zano Project -// Copyright (c) 2022-2024 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) // -// This file contains implementation of the original d-CLSAG (s.a. https://eprint.iacr.org/2019/654.pdf by Goodel at el) -// and the extended d/v-CLSAG version (s.a. https://github.com/hyle-team/docs/blob/master/zano/dv-CLSAG-extension/ by sowle) +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // #pragma once #include "crypto-sugar.h" diff --git a/src/crypto/crypto-ops-data.c b/src/crypto/crypto-ops-data.c index 48bfe21a..d5aebb5d 100644 --- a/src/crypto/crypto-ops-data.c +++ b/src/crypto/crypto-ops-data.c @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include diff --git a/src/crypto/crypto-ops.c b/src/crypto/crypto-ops.c index 852c5f1f..1ab21482 100644 --- a/src/crypto/crypto-ops.c +++ b/src/crypto/crypto-ops.c @@ -1,29 +1,19 @@ -// Copyright (c) 2018-2021 Zano Project -// Copyright (c) 2020-2021 sowle (val@zano.org, crypto.sowle@gmail.com) -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // -// This file contains pieces of code from libsodium project. -// libsodium is licensed under the ISC License: -/* - * ISC License - * - * Copyright (c) 2013-2020 - * Frank Denis - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ #include #include diff --git a/src/crypto/crypto-ops.h b/src/crypto/crypto-ops.h index 8ed42fcd..f5bd7540 100644 --- a/src/crypto/crypto-ops.h +++ b/src/crypto/crypto-ops.h @@ -1,7 +1,19 @@ -// Copyright (c) 2018-2021 Zano Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include // size_t diff --git a/src/crypto/crypto-sugar.cpp b/src/crypto/crypto-sugar.cpp index dfc4dcc6..92a595ad 100644 --- a/src/crypto/crypto-sugar.cpp +++ b/src/crypto/crypto-sugar.cpp @@ -1,9 +1,19 @@ -// Copyright (c) 2020-2023 Zano Project -// Copyright (c) 2020-2023 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // -// Note: This file originates from tests/functional_tests/crypto_tests.cpp #include "crypto-sugar.h" diff --git a/src/crypto/crypto-sugar.h b/src/crypto/crypto-sugar.h index 3a76fa59..cd6d789b 100644 --- a/src/crypto/crypto-sugar.h +++ b/src/crypto/crypto-sugar.h @@ -1,9 +1,19 @@ -// Copyright (c) 2020-2024 Zano Project -// Copyright (c) 2020-2024 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // -// Note: This file originates from tests/functional_tests/crypto_tests.cpp #pragma once #include #include diff --git a/src/crypto/crypto.cpp b/src/crypto/crypto.cpp index b2b7c4bb..49650a6b 100644 --- a/src/crypto/crypto.cpp +++ b/src/crypto/crypto.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/crypto/crypto.h b/src/crypto/crypto.h index 9433ad4f..95ddc904 100644 --- a/src/crypto/crypto.h +++ b/src/crypto/crypto.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/ecrypt-config.h b/src/crypto/ecrypt-config.h index 9176de17..799048cd 100644 --- a/src/crypto/ecrypt-config.h +++ b/src/crypto/ecrypt-config.h @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + /* ecrypt-config.h */ /* *** Normally, it should not be necessary to edit this file. *** */ diff --git a/src/crypto/ecrypt-machine.h b/src/crypto/ecrypt-machine.h index 83356b1e..d8d62916 100644 --- a/src/crypto/ecrypt-machine.h +++ b/src/crypto/ecrypt-machine.h @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + /* ecrypt-machine.h */ /* diff --git a/src/crypto/ecrypt-portable.h b/src/crypto/ecrypt-portable.h index 4baa4d6a..dec6f907 100644 --- a/src/crypto/ecrypt-portable.h +++ b/src/crypto/ecrypt-portable.h @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + /* ecrypt-portable.h */ /* diff --git a/src/crypto/ecrypt-sync.h b/src/crypto/ecrypt-sync.h index cd5f5d43..ca8d6818 100644 --- a/src/crypto/ecrypt-sync.h +++ b/src/crypto/ecrypt-sync.h @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + /* ecrypt-sync.h */ /* diff --git a/src/crypto/eth_signature.cpp b/src/crypto/eth_signature.cpp index c5e0999b..d6e7193c 100644 --- a/src/crypto/eth_signature.cpp +++ b/src/crypto/eth_signature.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2024 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "eth_signature.h" #include "crypto.h" #ifndef USE_OPEN_SSL_FOR_ECDSA diff --git a/src/crypto/eth_signature.h b/src/crypto/eth_signature.h index 4db0b8e7..b412e96c 100644 --- a/src/crypto/eth_signature.h +++ b/src/crypto/eth_signature.h @@ -1,6 +1,19 @@ -// Copyright (c) 2024 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include #include diff --git a/src/crypto/generic-ops.h b/src/crypto/generic-ops.h index 4fe9a5ba..430619a3 100644 --- a/src/crypto/generic-ops.h +++ b/src/crypto/generic-ops.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/hash-ops.h b/src/crypto/hash-ops.h index fcc06d14..854846ea 100644 --- a/src/crypto/hash-ops.h +++ b/src/crypto/hash-ops.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/hash.c b/src/crypto/hash.c index 0d399f49..45203463 100644 --- a/src/crypto/hash.c +++ b/src/crypto/hash.c @@ -1,7 +1,19 @@ -// Copyright (c) 2020-2021 Zano project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/crypto/hash.h b/src/crypto/hash.h index 7fb0573d..41faad95 100644 --- a/src/crypto/hash.h +++ b/src/crypto/hash.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/initializer.h b/src/crypto/initializer.h index 8c84621b..a84bcf3a 100644 --- a/src/crypto/initializer.h +++ b/src/crypto/initializer.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/keccak.c b/src/crypto/keccak.c index 3ee2a887..857c6e32 100644 --- a/src/crypto/keccak.c +++ b/src/crypto/keccak.c @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + // keccak.c // 19-Nov-11 Markku-Juhani O. Saarinen // A baseline Keccak (3rd round) implementation. diff --git a/src/crypto/keccak.h b/src/crypto/keccak.h index 4f7f8572..3842a06f 100644 --- a/src/crypto/keccak.h +++ b/src/crypto/keccak.h @@ -1,3 +1,20 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + // keccak.h // 19-Nov-11 Markku-Juhani O. Saarinen diff --git a/src/crypto/msm.cpp b/src/crypto/msm.cpp index 628d905a..74abf8b1 100644 --- a/src/crypto/msm.cpp +++ b/src/crypto/msm.cpp @@ -1,7 +1,18 @@ -// Copyright (c) 2023-2023 Zano Project -// Copyright (c) 2023-2023 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // #include "epee/include/misc_log_ex.h" //#include "zarcanum.h" diff --git a/src/crypto/msm.h b/src/crypto/msm.h index 218b55f6..f58ae6fd 100644 --- a/src/crypto/msm.h +++ b/src/crypto/msm.h @@ -1,7 +1,19 @@ -// Copyright (c) 2023-2023 Zano Project (https://zano.org/) -// Copyright (c) 2023-2023 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once // This file contains Multi-Scalar Multiplication routines diff --git a/src/crypto/one_out_of_many_proofs.cpp b/src/crypto/one_out_of_many_proofs.cpp index ab921f44..abc39074 100644 --- a/src/crypto/one_out_of_many_proofs.cpp +++ b/src/crypto/one_out_of_many_proofs.cpp @@ -1,7 +1,18 @@ -// Copyright (c) 2023-2024 Zano Project -// Copyright (c) 2023-2024 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // #include "one_out_of_many_proofs.h" #include "../currency_core/crypto_config.h" diff --git a/src/crypto/one_out_of_many_proofs.h b/src/crypto/one_out_of_many_proofs.h index e8c3c860..3746f39d 100644 --- a/src/crypto/one_out_of_many_proofs.h +++ b/src/crypto/one_out_of_many_proofs.h @@ -1,7 +1,18 @@ -// Copyright (c) 2023 Zano Project -// Copyright (c) 2023 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // #pragma once #include "crypto-sugar.h" diff --git a/src/crypto/random.c b/src/crypto/random.c index f204c163..3d0f4b37 100644 --- a/src/crypto/random.c +++ b/src/crypto/random.c @@ -1,7 +1,19 @@ -// Copyright (c) 2018-2025 Zano Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/crypto/random.h b/src/crypto/random.h index 7db79b8b..aec69e23 100644 --- a/src/crypto/random.h +++ b/src/crypto/random.h @@ -1,8 +1,19 @@ -// Copyright (c) 2018-2025 Zano Project -// Copyright (c) 2014-2018 The Boolberry developers -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/crypto/range_proof_bpp.h b/src/crypto/range_proof_bpp.h index db1ffa1a..b8557804 100644 --- a/src/crypto/range_proof_bpp.h +++ b/src/crypto/range_proof_bpp.h @@ -1,7 +1,19 @@ -// Copyright (c) 2021-2022 Zano Project (https://zano.org/) -// Copyright (c) 2021-2022 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once // diff --git a/src/crypto/range_proof_bppe.h b/src/crypto/range_proof_bppe.h index de786541..f1ad30c4 100644 --- a/src/crypto/range_proof_bppe.h +++ b/src/crypto/range_proof_bppe.h @@ -1,7 +1,19 @@ -// Copyright (c) 2022 Zano Project (https://zano.org/) -// Copyright (c) 2022 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once // diff --git a/src/crypto/range_proofs.cpp b/src/crypto/range_proofs.cpp index fd14ec0f..d2932b39 100644 --- a/src/crypto/range_proofs.cpp +++ b/src/crypto/range_proofs.cpp @@ -1,7 +1,19 @@ -// Copyright (c) 2021 Zano Project (https://zano.org/) -// Copyright (c) 2021 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "range_proofs.h" namespace crypto diff --git a/src/crypto/range_proofs.h b/src/crypto/range_proofs.h index 17cbba51..b9c63a4e 100644 --- a/src/crypto/range_proofs.h +++ b/src/crypto/range_proofs.h @@ -1,7 +1,19 @@ -// Copyright (c) 2021-2023 Zano Project (https://zano.org/) -// Copyright (c) 2021-2023 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "epee/include/misc_log_ex.h" diff --git a/src/crypto/tree-hash.c b/src/crypto/tree-hash.c index 2909f319..921df382 100644 --- a/src/crypto/tree-hash.c +++ b/src/crypto/tree-hash.c @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/crypto/zarcanum.cpp b/src/crypto/zarcanum.cpp index e0b81f44..12f386b1 100644 --- a/src/crypto/zarcanum.cpp +++ b/src/crypto/zarcanum.cpp @@ -1,9 +1,19 @@ -// Copyright (c) 2022-2023 Zano Project -// Copyright (c) 2022-2023 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // -// Note: This file originates from tests/functional_tests/crypto_tests.cpp #include "epee/include/misc_log_ex.h" #include "zarcanum.h" #include "range_proofs.h" diff --git a/src/crypto/zarcanum.h b/src/crypto/zarcanum.h index 55e6b202..5621c78a 100644 --- a/src/crypto/zarcanum.h +++ b/src/crypto/zarcanum.h @@ -1,9 +1,19 @@ -// Copyright (c) 2022-2024 Zano Project -// Copyright (c) 2022-2024 sowle (val@zano.org, crypto.sowle@gmail.com) -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // -// Note: This file originates from tests/functional_tests/crypto_tests.cpp #pragma once #include "crypto-sugar.h" #include "range_proofs.h" diff --git a/src/currency_core/account.cpp b/src/currency_core/account.cpp index ff194a59..20cb2a16 100644 --- a/src/currency_core/account.cpp +++ b/src/currency_core/account.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/currency_core/account.h b/src/currency_core/account.h index d732181d..315aa2d9 100644 --- a/src/currency_core/account.h +++ b/src/currency_core/account.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/account_boost_serialization.h b/src/currency_core/account_boost_serialization.h index f0f2d634..68c2906e 100644 --- a/src/currency_core/account_boost_serialization.h +++ b/src/currency_core/account_boost_serialization.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/alias_helper.h b/src/currency_core/alias_helper.h index 3bc5b33e..4e52f407 100644 --- a/src/currency_core/alias_helper.h +++ b/src/currency_core/alias_helper.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/basic_api_response_codes.h b/src/currency_core/basic_api_response_codes.h index bb1cafe5..0914716c 100644 --- a/src/currency_core/basic_api_response_codes.h +++ b/src/currency_core/basic_api_response_codes.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// diff --git a/src/currency_core/basic_kv_structs.h b/src/currency_core/basic_kv_structs.h index 1ff520c6..aff017ae 100644 --- a/src/currency_core/basic_kv_structs.h +++ b/src/currency_core/basic_kv_structs.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/basic_pow_helpers.cpp b/src/currency_core/basic_pow_helpers.cpp index d029ee19..29f314c0 100644 --- a/src/currency_core/basic_pow_helpers.cpp +++ b/src/currency_core/basic_pow_helpers.cpp @@ -1,7 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project -// Copyright (c) 2018-2019 Hyle Team -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "include_base_utils.h" diff --git a/src/currency_core/basic_pow_helpers.h b/src/currency_core/basic_pow_helpers.h index 62ba7721..c9ca06ac 100644 --- a/src/currency_core/basic_pow_helpers.h +++ b/src/currency_core/basic_pow_helpers.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/bc_attachments_helpers.h b/src/currency_core/bc_attachments_helpers.h index 48f1fac4..cf788783 100644 --- a/src/currency_core/bc_attachments_helpers.h +++ b/src/currency_core/bc_attachments_helpers.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "currency_basic.h" diff --git a/src/currency_core/bc_attachments_helpers_basic.h b/src/currency_core/bc_attachments_helpers_basic.h index 74039e9d..46f13a4e 100644 --- a/src/currency_core/bc_attachments_helpers_basic.h +++ b/src/currency_core/bc_attachments_helpers_basic.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "currency_basic.h" diff --git a/src/currency_core/bc_attachments_service_manager.cpp b/src/currency_core/bc_attachments_service_manager.cpp index c56015b6..b8a53d4c 100644 --- a/src/currency_core/bc_attachments_service_manager.cpp +++ b/src/currency_core/bc_attachments_service_manager.cpp @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "bc_attachments_service_manager.h" diff --git a/src/currency_core/bc_attachments_service_manager.h b/src/currency_core/bc_attachments_service_manager.h index 632126a9..1e5f514d 100644 --- a/src/currency_core/bc_attachments_service_manager.h +++ b/src/currency_core/bc_attachments_service_manager.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/currency_core/bc_block_datetime_service.h b/src/currency_core/bc_block_datetime_service.h index 4db3d743..7fe1cea9 100644 --- a/src/currency_core/bc_block_datetime_service.h +++ b/src/currency_core/bc_block_datetime_service.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2021 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #define BC_BLOCK_DATETIME_SERVICE_ID "d" diff --git a/src/currency_core/bc_escrow_service.h b/src/currency_core/bc_escrow_service.h index c9e00ae1..6c5de2fe 100644 --- a/src/currency_core/bc_escrow_service.h +++ b/src/currency_core/bc_escrow_service.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "account.h" diff --git a/src/currency_core/bc_offers_serialization.h b/src/currency_core/bc_offers_serialization.h index f786133f..52cf5675 100644 --- a/src/currency_core/bc_offers_serialization.h +++ b/src/currency_core/bc_offers_serialization.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/bc_offers_service.cpp b/src/currency_core/bc_offers_service.cpp index b6349e90..a7ff8ac6 100644 --- a/src/currency_core/bc_offers_service.cpp +++ b/src/currency_core/bc_offers_service.cpp @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "bc_offers_service.h" diff --git a/src/currency_core/bc_offers_service.h b/src/currency_core/bc_offers_service.h index 1d7c6429..2ed8d2bf 100644 --- a/src/currency_core/bc_offers_service.h +++ b/src/currency_core/bc_offers_service.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/currency_core/bc_offers_service_basic.h b/src/currency_core/bc_offers_service_basic.h index 41f06c40..f9b71f34 100644 --- a/src/currency_core/bc_offers_service_basic.h +++ b/src/currency_core/bc_offers_service_basic.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/bc_payments_id_service.h b/src/currency_core/bc_payments_id_service.h index 070907bd..1ce636db 100644 --- a/src/currency_core/bc_payments_id_service.h +++ b/src/currency_core/bc_payments_id_service.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/block_chain_shortener.cpp b/src/currency_core/block_chain_shortener.cpp index 986658a1..db2522fc 100644 --- a/src/currency_core/block_chain_shortener.cpp +++ b/src/currency_core/block_chain_shortener.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "block_chain_shortener.h" #include "common/crypto_stream_operators.h" diff --git a/src/currency_core/block_chain_shortener.h b/src/currency_core/block_chain_shortener.h index dfd64de1..0738ead1 100644 --- a/src/currency_core/block_chain_shortener.h +++ b/src/currency_core/block_chain_shortener.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #pragma once diff --git a/src/currency_core/block_flags.h b/src/currency_core/block_flags.h index b7724e15..cd06b44b 100644 --- a/src/currency_core/block_flags.h +++ b/src/currency_core/block_flags.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #define CURRENCY_BLOCK_FLAG_POS_BLOCK 0x01 diff --git a/src/currency_core/blockchain_storage.cpp b/src/currency_core/blockchain_storage.cpp index a6fb1142..39423725 100644 --- a/src/currency_core/blockchain_storage.cpp +++ b/src/currency_core/blockchain_storage.cpp @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/currency_core/blockchain_storage.h b/src/currency_core/blockchain_storage.h index cccc8d83..05633d73 100644 --- a/src/currency_core/blockchain_storage.h +++ b/src/currency_core/blockchain_storage.h @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/currency_core/blockchain_storage_basic.h b/src/currency_core/blockchain_storage_basic.h index 643ba527..09e35db5 100644 --- a/src/currency_core/blockchain_storage_basic.h +++ b/src/currency_core/blockchain_storage_basic.h @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/currency_core/blockchain_storage_boost_serialization.h b/src/currency_core/blockchain_storage_boost_serialization.h index ce1babf8..9e2678d4 100644 --- a/src/currency_core/blockchain_storage_boost_serialization.h +++ b/src/currency_core/blockchain_storage_boost_serialization.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/checkpoints.cpp b/src/currency_core/checkpoints.cpp index bbce9815..7c06b355 100644 --- a/src/currency_core/checkpoints.cpp +++ b/src/currency_core/checkpoints.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "include_base_utils.h" using namespace epee; diff --git a/src/currency_core/checkpoints.h b/src/currency_core/checkpoints.h index 76675e67..08fa57ba 100644 --- a/src/currency_core/checkpoints.h +++ b/src/currency_core/checkpoints.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/currency_core/checkpoints_create.h b/src/currency_core/checkpoints_create.h index 49d10037..0b1fdf82 100644 --- a/src/currency_core/checkpoints_create.h +++ b/src/currency_core/checkpoints_create.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/connection_context.h b/src/currency_core/connection_context.h index 5e094477..b858b787 100644 --- a/src/currency_core/connection_context.h +++ b/src/currency_core/connection_context.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/currency_core/core_runtime_config.h b/src/currency_core/core_runtime_config.h index 92bc78bd..92f81a96 100644 --- a/src/currency_core/core_runtime_config.h +++ b/src/currency_core/core_runtime_config.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "boost/serialization/array.hpp" diff --git a/src/currency_core/core_tools.h b/src/currency_core/core_tools.h index 38d7362f..07489874 100644 --- a/src/currency_core/core_tools.h +++ b/src/currency_core/core_tools.h @@ -1,9 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/crypto_config.h b/src/currency_core/crypto_config.h index 648550bc..72d6a9b4 100644 --- a/src/currency_core/crypto_config.h +++ b/src/currency_core/crypto_config.h @@ -1,6 +1,18 @@ -// Copyright (c) 2022-2023 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // #pragma once diff --git a/src/currency_core/currency_basic.h b/src/currency_core/currency_basic.h index c73660f6..c9d51831 100644 --- a/src/currency_core/currency_basic.h +++ b/src/currency_core/currency_basic.h @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Copyright (c) 2014-2015 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/currency_basic_backward_comp.inl b/src/currency_core/currency_basic_backward_comp.inl index 9dc2a903..482a4289 100644 --- a/src/currency_core/currency_basic_backward_comp.inl +++ b/src/currency_core/currency_basic_backward_comp.inl @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2022 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// diff --git a/src/currency_core/currency_boost_serialization.h b/src/currency_core/currency_boost_serialization.h index c12caf25..0d92b807 100644 --- a/src/currency_core/currency_boost_serialization.h +++ b/src/currency_core/currency_boost_serialization.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/currency_core.cpp b/src/currency_core/currency_core.cpp index 7fe8746c..378ca9c7 100644 --- a/src/currency_core/currency_core.cpp +++ b/src/currency_core/currency_core.cpp @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "include_base_utils.h" using namespace epee; diff --git a/src/currency_core/currency_core.h b/src/currency_core/currency_core.h index 3da70452..9ddd40de 100644 --- a/src/currency_core/currency_core.h +++ b/src/currency_core/currency_core.h @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/currency_format_utils.cpp b/src/currency_core/currency_format_utils.cpp index dbe4d82a..0d05887a 100644 --- a/src/currency_core/currency_format_utils.cpp +++ b/src/currency_core/currency_format_utils.cpp @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include "include_base_utils.h" #include diff --git a/src/currency_core/currency_format_utils.h b/src/currency_core/currency_format_utils.h index 4e67f9a0..f3fbbb97 100644 --- a/src/currency_core/currency_format_utils.h +++ b/src/currency_core/currency_format_utils.h @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2023 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/currency_format_utils_abstract.h b/src/currency_core/currency_format_utils_abstract.h index ad3d2b55..551c045c 100644 --- a/src/currency_core/currency_format_utils_abstract.h +++ b/src/currency_core/currency_format_utils_abstract.h @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/currency_format_utils_blocks.cpp b/src/currency_core/currency_format_utils_blocks.cpp index 85bcddfd..745d94da 100644 --- a/src/currency_core/currency_format_utils_blocks.cpp +++ b/src/currency_core/currency_format_utils_blocks.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// diff --git a/src/currency_core/currency_format_utils_blocks.h b/src/currency_core/currency_format_utils_blocks.h index 130b51dc..35399f6d 100644 --- a/src/currency_core/currency_format_utils_blocks.h +++ b/src/currency_core/currency_format_utils_blocks.h @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/currency_format_utils_transactions.cpp b/src/currency_core/currency_format_utils_transactions.cpp index 6c4a5a2e..bf7a863a 100644 --- a/src/currency_core/currency_format_utils_transactions.cpp +++ b/src/currency_core/currency_format_utils_transactions.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// diff --git a/src/currency_core/currency_format_utils_transactions.h b/src/currency_core/currency_format_utils_transactions.h index 6bb04b01..f1541ace 100644 --- a/src/currency_core/currency_format_utils_transactions.h +++ b/src/currency_core/currency_format_utils_transactions.h @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2023 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/currency_stat_info.h b/src/currency_core/currency_stat_info.h index 2c490a28..3c92f1b9 100644 --- a/src/currency_core/currency_stat_info.h +++ b/src/currency_core/currency_stat_info.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "serialization/keyvalue_serialization.h" diff --git a/src/currency_core/difficulty.cpp b/src/currency_core/difficulty.cpp index b0bdfac0..3f4a3df9 100644 --- a/src/currency_core/difficulty.cpp +++ b/src/currency_core/difficulty.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/currency_core/difficulty.h b/src/currency_core/difficulty.h index 731fb26f..8ffb64df 100644 --- a/src/currency_core/difficulty.h +++ b/src/currency_core/difficulty.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/dispatch_core_events.h b/src/currency_core/dispatch_core_events.h index 19d3df40..c4a7a5cd 100644 --- a/src/currency_core/dispatch_core_events.h +++ b/src/currency_core/dispatch_core_events.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2014-2015 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/etc_custom_serialization.cpp b/src/currency_core/etc_custom_serialization.cpp index 555ec799..371ffbaa 100644 --- a/src/currency_core/etc_custom_serialization.cpp +++ b/src/currency_core/etc_custom_serialization.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2014-2015 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "currency_format_utils.h" #include "etc_custom_serialization.h" diff --git a/src/currency_core/etc_custom_serialization.h b/src/currency_core/etc_custom_serialization.h index b0269ba9..8fae1c82 100644 --- a/src/currency_core/etc_custom_serialization.h +++ b/src/currency_core/etc_custom_serialization.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2014-2015 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/currency_core/genesis.cpp b/src/currency_core/genesis.cpp index 15ccdb7f..d8828a24 100644 --- a/src/currency_core/genesis.cpp +++ b/src/currency_core/genesis.cpp @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "genesis.h" namespace currency diff --git a/src/currency_core/genesis.h b/src/currency_core/genesis.h index 5ab76152..f7de99c0 100644 --- a/src/currency_core/genesis.h +++ b/src/currency_core/genesis.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include #include diff --git a/src/currency_core/genesis_acc.cpp b/src/currency_core/genesis_acc.cpp index e38f7e42..92a59773 100644 --- a/src/currency_core/genesis_acc.cpp +++ b/src/currency_core/genesis_acc.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "genesis_acc.h" diff --git a/src/currency_core/genesis_acc.h b/src/currency_core/genesis_acc.h index c923f8c4..fbd4c0f0 100644 --- a/src/currency_core/genesis_acc.h +++ b/src/currency_core/genesis_acc.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/currency_core/miner.cpp b/src/currency_core/miner.cpp index dc37f3f6..86ecedef 100644 --- a/src/currency_core/miner.cpp +++ b/src/currency_core/miner.cpp @@ -1,9 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/currency_core/miner.h b/src/currency_core/miner.h index 674bb4d2..7685442e 100644 --- a/src/currency_core/miner.h +++ b/src/currency_core/miner.h @@ -1,9 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/offers_service_basics.h b/src/currency_core/offers_service_basics.h index 63feedb9..8fdfdced 100644 --- a/src/currency_core/offers_service_basics.h +++ b/src/currency_core/offers_service_basics.h @@ -1,7 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_core/offers_services_helpers.cpp b/src/currency_core/offers_services_helpers.cpp index 0029ef4e..cc597077 100644 --- a/src/currency_core/offers_services_helpers.cpp +++ b/src/currency_core/offers_services_helpers.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include diff --git a/src/currency_core/offers_services_helpers.h b/src/currency_core/offers_services_helpers.h index 1d0aa919..193d6339 100644 --- a/src/currency_core/offers_services_helpers.h +++ b/src/currency_core/offers_services_helpers.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "profile_tools.h" diff --git a/src/currency_core/pos_mining.cpp b/src/currency_core/pos_mining.cpp index 478284d8..46225ea3 100644 --- a/src/currency_core/pos_mining.cpp +++ b/src/currency_core/pos_mining.cpp @@ -1,6 +1,18 @@ -// Copyright (c) 2022-2024 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // #include "currency_basic.h" #include "difficulty.h" diff --git a/src/currency_core/pos_mining.h b/src/currency_core/pos_mining.h index ae6baf03..dd77e17f 100644 --- a/src/currency_core/pos_mining.h +++ b/src/currency_core/pos_mining.h @@ -1,6 +1,18 @@ -// Copyright (c) 2022 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 // #pragma once diff --git a/src/currency_core/tx_pool.cpp b/src/currency_core/tx_pool.cpp index ed2edf08..cb856cef 100644 --- a/src/currency_core/tx_pool.cpp +++ b/src/currency_core/tx_pool.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/currency_core/tx_pool.h b/src/currency_core/tx_pool.h index 321f0c48..27ce8ccc 100644 --- a/src/currency_core/tx_pool.h +++ b/src/currency_core/tx_pool.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "include_base_utils.h" diff --git a/src/currency_core/tx_semantic_validation.cpp b/src/currency_core/tx_semantic_validation.cpp index d358edf2..705771d5 100644 --- a/src/currency_core/tx_semantic_validation.cpp +++ b/src/currency_core/tx_semantic_validation.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// diff --git a/src/currency_core/tx_semantic_validation.h b/src/currency_core/tx_semantic_validation.h index 03a946c7..bd2a29e3 100644 --- a/src/currency_core/tx_semantic_validation.h +++ b/src/currency_core/tx_semantic_validation.h @@ -1,6 +1,19 @@ -// Copyright (c) 2018-2023 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "include_base_utils.h" diff --git a/src/currency_core/verification_context.h b/src/currency_core/verification_context.h index 85533cc5..0964fb15 100644 --- a/src/currency_core/verification_context.h +++ b/src/currency_core/verification_context.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_protocol/blobdatatype.h b/src/currency_protocol/blobdatatype.h index b3d614aa..58d0046d 100644 --- a/src/currency_protocol/blobdatatype.h +++ b/src/currency_protocol/blobdatatype.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_protocol/currency_protocol_defs.h b/src/currency_protocol/currency_protocol_defs.h index d8dca973..b2115f45 100644 --- a/src/currency_protocol/currency_protocol_defs.h +++ b/src/currency_protocol/currency_protocol_defs.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_protocol/currency_protocol_defs_print.h b/src/currency_protocol/currency_protocol_defs_print.h index 023ed305..50933489 100644 --- a/src/currency_protocol/currency_protocol_defs_print.h +++ b/src/currency_protocol/currency_protocol_defs_print.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_protocol/currency_protocol_handler.h b/src/currency_protocol/currency_protocol_handler.h index c21ac71a..2dc13609 100644 --- a/src/currency_protocol/currency_protocol_handler.h +++ b/src/currency_protocol/currency_protocol_handler.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/currency_protocol/currency_protocol_handler.inl b/src/currency_protocol/currency_protocol_handler.inl index 0d772d45..434973fb 100644 --- a/src/currency_protocol/currency_protocol_handler.inl +++ b/src/currency_protocol/currency_protocol_handler.inl @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include "currency_protocol_handler.h" #include "currency_core/currency_format_utils.h" diff --git a/src/currency_protocol/currency_protocol_handler_common.h b/src/currency_protocol/currency_protocol_handler_common.h index ba640896..9cd98833 100644 --- a/src/currency_protocol/currency_protocol_handler_common.h +++ b/src/currency_protocol/currency_protocol_handler_common.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/daemon/daemon.cpp b/src/daemon/daemon.cpp index 9ebf02d4..c04b8e05 100644 --- a/src/daemon/daemon.cpp +++ b/src/daemon/daemon.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// // node.cpp : Defines the entry point for the console application. // diff --git a/src/daemon/daemon_commands_handler.h b/src/daemon/daemon_commands_handler.h index 69df1340..7787d97a 100644 --- a/src/daemon/daemon_commands_handler.h +++ b/src/daemon/daemon_commands_handler.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/genesis_generator/generate_test_genesis.cpp b/src/genesis_generator/generate_test_genesis.cpp index 1f63272f..1400b22b 100644 --- a/src/genesis_generator/generate_test_genesis.cpp +++ b/src/genesis_generator/generate_test_genesis.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "misc_log_ex.h" #include "currency_core/currency_format_utils.h" diff --git a/src/miner/simpleminer.cpp b/src/miner/simpleminer.cpp index 9ae89e4c..c497ee6f 100644 --- a/src/miner/simpleminer.cpp +++ b/src/miner/simpleminer.cpp @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "common/command_line.h" diff --git a/src/miner/simpleminer.h b/src/miner/simpleminer.h index 104afe6f..ad9fc4b7 100644 --- a/src/miner/simpleminer.h +++ b/src/miner/simpleminer.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "net/http_client.h" diff --git a/src/miner/target_helper.h b/src/miner/target_helper.h index 54583f6b..316f198b 100644 --- a/src/miner/target_helper.h +++ b/src/miner/target_helper.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "currency_core/difficulty.h" diff --git a/src/p2p/maintainers_info_boost_serialization.h b/src/p2p/maintainers_info_boost_serialization.h index b8b5df48..beff02d2 100644 --- a/src/p2p/maintainers_info_boost_serialization.h +++ b/src/p2p/maintainers_info_boost_serialization.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "p2p_protocol_defs.h" diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h index eda9ea37..1e257bca 100644 --- a/src/p2p/net_node.h +++ b/src/p2p/net_node.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl index 9de58a86..bbf3b361 100644 --- a/src/p2p/net_node.inl +++ b/src/p2p/net_node.inl @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/p2p/net_node_common.h b/src/p2p/net_node_common.h index 12fe6453..0551a279 100644 --- a/src/p2p/net_node_common.h +++ b/src/p2p/net_node_common.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/p2p/net_peerlist.h b/src/p2p/net_peerlist.h index 0b5e662a..fe6c1c03 100644 --- a/src/p2p/net_peerlist.h +++ b/src/p2p/net_peerlist.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2021 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/p2p/net_peerlist_boost_serialization.h b/src/p2p/net_peerlist_boost_serialization.h index d10370b2..fa7602b4 100644 --- a/src/p2p/net_peerlist_boost_serialization.h +++ b/src/p2p/net_peerlist_boost_serialization.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/p2p/p2p_networks.h b/src/p2p/p2p_networks.h index 3f278e92..46883b10 100644 --- a/src/p2p/p2p_networks.h +++ b/src/p2p/p2p_networks.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/p2p/p2p_protocol_defs.h b/src/p2p/p2p_protocol_defs.h index 61d7db19..0ce23bd0 100644 --- a/src/p2p/p2p_protocol_defs.h +++ b/src/p2p/p2p_protocol_defs.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/pch/stdafx.cpp b/src/pch/stdafx.cpp index 1577c4e3..fde0bd08 100644 --- a/src/pch/stdafx.cpp +++ b/src/pch/stdafx.cpp @@ -1 +1,18 @@ +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// + #include "stdafx.h" \ No newline at end of file diff --git a/src/pch/stdafx.h b/src/pch/stdafx.h index 76afcc62..32bb3b82 100644 --- a/src/pch/stdafx.h +++ b/src/pch/stdafx.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2020 Zano Project -// Copyright (c) 2014-2017 The The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/platform/mingw/alloca.h b/src/platform/mingw/alloca.h index 9e18ae9e..2dccbdc5 100644 --- a/src/platform/mingw/alloca.h +++ b/src/platform/mingw/alloca.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/platform/msc/alloca.h b/src/platform/msc/alloca.h index 918bdd1f..047e61c5 100644 --- a/src/platform/msc/alloca.h +++ b/src/platform/msc/alloca.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/platform/msc/inline_c.h b/src/platform/msc/inline_c.h index bfd46237..2eddf60d 100644 --- a/src/platform/msc/inline_c.h +++ b/src/platform/msc/inline_c.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/platform/msc/stdbool.h b/src/platform/msc/stdbool.h index 2e1a0673..9981a0f4 100644 --- a/src/platform/msc/stdbool.h +++ b/src/platform/msc/stdbool.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/platform/msc/sys/param.h b/src/platform/msc/sys/param.h index b44de84b..3183353c 100644 --- a/src/platform/msc/sys/param.h +++ b/src/platform/msc/sys/param.h @@ -1,6 +1,19 @@ -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp index 0be19ed3..0b67f9c2 100644 --- a/src/rpc/core_rpc_server.cpp +++ b/src/rpc/core_rpc_server.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "include_base_utils.h" using namespace epee; diff --git a/src/rpc/core_rpc_server.h b/src/rpc/core_rpc_server.h index 3dc4049d..fb288d51 100644 --- a/src/rpc/core_rpc_server.h +++ b/src/rpc/core_rpc_server.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h index 2e571212..a0fd34c0 100644 --- a/src/rpc/core_rpc_server_commands_defs.h +++ b/src/rpc/core_rpc_server_commands_defs.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "serialization/keyvalue_hexemizer.h" #include "currency_protocol/currency_protocol_defs.h" diff --git a/src/rpc/core_rpc_server_error_codes.h b/src/rpc/core_rpc_server_error_codes.h index 38df7321..ba6645b9 100644 --- a/src/rpc/core_rpc_server_error_codes.h +++ b/src/rpc/core_rpc_server_error_codes.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/serialization/binary_archive.h b/src/serialization/binary_archive.h index 3fe31e72..088cd3ae 100644 --- a/src/serialization/binary_archive.h +++ b/src/serialization/binary_archive.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// /* binary_archive.h * diff --git a/src/serialization/binary_utils.h b/src/serialization/binary_utils.h index c9b5c31a..bd0e1092 100644 --- a/src/serialization/binary_utils.h +++ b/src/serialization/binary_utils.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include "binary_archive.h" diff --git a/src/serialization/boost_types.h b/src/serialization/boost_types.h index 463316fc..e54f29f4 100644 --- a/src/serialization/boost_types.h +++ b/src/serialization/boost_types.h @@ -1,8 +1,19 @@ -// Copyright (c) 2018-2024 Zano Project -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/serialization/debug_archive.h b/src/serialization/debug_archive.h index 4f5bec8d..8d986f1f 100644 --- a/src/serialization/debug_archive.h +++ b/src/serialization/debug_archive.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/serialization/json_archive.h b/src/serialization/json_archive.h index 09fea679..ad8f3178 100644 --- a/src/serialization/json_archive.h +++ b/src/serialization/json_archive.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2019 The Zano Project -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// /* json_archive.h * diff --git a/src/serialization/json_utils.h b/src/serialization/json_utils.h index 990f0f53..d8eb5e03 100644 --- a/src/serialization/json_utils.h +++ b/src/serialization/json_utils.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include "json_archive.h" diff --git a/src/serialization/multiprecision.h b/src/serialization/multiprecision.h index 36f7de94..cc1ac360 100644 --- a/src/serialization/multiprecision.h +++ b/src/serialization/multiprecision.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/serialization/serialization.h b/src/serialization/serialization.h index a44ec405..ff915958 100644 --- a/src/serialization/serialization.h +++ b/src/serialization/serialization.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2018 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// /* serialization.h * diff --git a/src/serialization/serialize_basic_types.h b/src/serialization/serialize_basic_types.h index 499a458e..3678adfa 100644 --- a/src/serialization/serialize_basic_types.h +++ b/src/serialization/serialize_basic_types.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/serialization/stl_containers.h b/src/serialization/stl_containers.h index f6cdbd49..24156320 100644 --- a/src/serialization/stl_containers.h +++ b/src/serialization/stl_containers.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/serialization/string.h b/src/serialization/string.h index e6e6b7e6..29723d9f 100644 --- a/src/serialization/string.h +++ b/src/serialization/string.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/serialization/variant.h b/src/serialization/variant.h index 716d54cf..7934d468 100644 --- a/src/serialization/variant.h +++ b/src/serialization/variant.h @@ -1,7 +1,19 @@ -// Copyright (c) 2014-2017 The The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/simplewallet/password_container.cpp b/src/simplewallet/password_container.cpp index ccba0c16..cd205b59 100644 --- a/src/simplewallet/password_container.cpp +++ b/src/simplewallet/password_container.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "password_container.h" diff --git a/src/simplewallet/password_container.h b/src/simplewallet/password_container.h index 5bca195b..985246af 100644 --- a/src/simplewallet/password_container.h +++ b/src/simplewallet/password_container.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index 57186476..30b645c1 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #if defined(WIN32) diff --git a/src/simplewallet/simplewallet.h b/src/simplewallet/simplewallet.h index 13ef637f..23657d38 100644 --- a/src/simplewallet/simplewallet.h +++ b/src/simplewallet/simplewallet.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/stratum/stratum_helpers.h b/src/stratum/stratum_helpers.h index 6eacd377..a872a679 100644 --- a/src/stratum/stratum_helpers.h +++ b/src/stratum/stratum_helpers.h @@ -1,7 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/stratum/stratum_server.cpp b/src/stratum/stratum_server.cpp index 95729637..4d5a01dd 100644 --- a/src/stratum/stratum_server.cpp +++ b/src/stratum/stratum_server.cpp @@ -1,7 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "stratum_server.h" #include "stratum_helpers.h" diff --git a/src/stratum/stratum_server.h b/src/stratum/stratum_server.h index 7647e34e..e2330e97 100644 --- a/src/stratum/stratum_server.h +++ b/src/stratum/stratum_server.h @@ -1,7 +1,19 @@ -// Copyright (c) 2018-2019 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/core_default_rpc_proxy.cpp b/src/wallet/core_default_rpc_proxy.cpp index 5e67beb4..32f39ac2 100644 --- a/src/wallet/core_default_rpc_proxy.cpp +++ b/src/wallet/core_default_rpc_proxy.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "core_default_rpc_proxy.h" diff --git a/src/wallet/core_default_rpc_proxy.h b/src/wallet/core_default_rpc_proxy.h index d82ec28d..d3d5e813 100644 --- a/src/wallet/core_default_rpc_proxy.h +++ b/src/wallet/core_default_rpc_proxy.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/core_fast_rpc_proxy.h b/src/wallet/core_fast_rpc_proxy.h index 0b1c4b0e..5d00d5a5 100644 --- a/src/wallet/core_fast_rpc_proxy.h +++ b/src/wallet/core_fast_rpc_proxy.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "rpc/core_rpc_server.h" #include "wallet/core_rpc_proxy.h" diff --git a/src/wallet/core_rpc_proxy.h b/src/wallet/core_rpc_proxy.h index 655548b7..138f40b7 100644 --- a/src/wallet/core_rpc_proxy.h +++ b/src/wallet/core_rpc_proxy.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/decoy_selection.cpp b/src/wallet/decoy_selection.cpp index e9d24446..4a04832d 100644 --- a/src/wallet/decoy_selection.cpp +++ b/src/wallet/decoy_selection.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2023 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "decoy_selection.h" #include "decoy_selection_default_distribution.hpp" diff --git a/src/wallet/decoy_selection.h b/src/wallet/decoy_selection.h index de4cecf9..40ed2e91 100644 --- a/src/wallet/decoy_selection.h +++ b/src/wallet/decoy_selection.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2023 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/wallet/decoy_selection_default_distribution.hpp b/src/wallet/decoy_selection_default_distribution.hpp index 9dc44579..f519fbd4 100644 --- a/src/wallet/decoy_selection_default_distribution.hpp +++ b/src/wallet/decoy_selection_default_distribution.hpp @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2023 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// const std::vector g_default_distribution = diff --git a/src/wallet/plain_wallet_api.cpp b/src/wallet/plain_wallet_api.cpp index eceb536e..270210f1 100644 --- a/src/wallet/plain_wallet_api.cpp +++ b/src/wallet/plain_wallet_api.cpp @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2020 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #ifdef ANDROID_BUILD diff --git a/src/wallet/plain_wallet_api.h b/src/wallet/plain_wallet_api.h index ec5af47d..a15cea0d 100644 --- a/src/wallet/plain_wallet_api.h +++ b/src/wallet/plain_wallet_api.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/wallet/plain_wallet_api_defs.h b/src/wallet/plain_wallet_api_defs.h index 613227d0..df52e544 100644 --- a/src/wallet/plain_wallet_api_defs.h +++ b/src/wallet/plain_wallet_api_defs.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2020 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include "net/http_server_handlers_map2.h" diff --git a/src/wallet/view_iface.h b/src/wallet/view_iface.h index 67f90240..852a47b4 100644 --- a/src/wallet/view_iface.h +++ b/src/wallet/view_iface.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 42f7ac0c..0ba1979e 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include diff --git a/src/wallet/wallet2.h b/src/wallet/wallet2.h index ef2c3a39..9d7afacb 100644 --- a/src/wallet/wallet2.h +++ b/src/wallet/wallet2.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2023 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/wallet/wallet2_base.h b/src/wallet/wallet2_base.h index d991a55b..bf71b34e 100644 --- a/src/wallet/wallet2_base.h +++ b/src/wallet/wallet2_base.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2023 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/wallet/wallet2_escrow.cpp b/src/wallet/wallet2_escrow.cpp index 2efab94c..1fdaaaf2 100644 --- a/src/wallet/wallet2_escrow.cpp +++ b/src/wallet/wallet2_escrow.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2016 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #define KEEP_WALLET_LOG_MACROS #include "wallet2.h" diff --git a/src/wallet/wallet_debug_events_definitions.h b/src/wallet/wallet_debug_events_definitions.h index 85eb9614..90acaf13 100644 --- a/src/wallet/wallet_debug_events_definitions.h +++ b/src/wallet/wallet_debug_events_definitions.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2023 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/wallet_errors.h b/src/wallet/wallet_errors.h index 12581bc5..bcb71142 100644 --- a/src/wallet/wallet_errors.h +++ b/src/wallet/wallet_errors.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/wallet_helpers.h b/src/wallet/wallet_helpers.h index 50da63a0..8efb9b72 100644 --- a/src/wallet/wallet_helpers.h +++ b/src/wallet/wallet_helpers.h @@ -1,6 +1,19 @@ -// Copyright (c) 2014-2020 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 Zano Project +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/wallet_id_adapter.h b/src/wallet/wallet_id_adapter.h index f13ce0c7..272fb052 100644 --- a/src/wallet/wallet_id_adapter.h +++ b/src/wallet/wallet_id_adapter.h @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/wallet_public_structs_defs.h b/src/wallet/wallet_public_structs_defs.h index f3908c24..b79c7c3b 100644 --- a/src/wallet/wallet_public_structs_defs.h +++ b/src/wallet/wallet_public_structs_defs.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once #include diff --git a/src/wallet/wallet_rpc_server.cpp b/src/wallet/wallet_rpc_server.cpp index 82b11dfb..f9fabdbd 100644 --- a/src/wallet/wallet_rpc_server.cpp +++ b/src/wallet/wallet_rpc_server.cpp @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2024 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include "include_base_utils.h" diff --git a/src/wallet/wallet_rpc_server.h b/src/wallet/wallet_rpc_server.h index 2bc4edb8..196759ce 100644 --- a/src/wallet/wallet_rpc_server.h +++ b/src/wallet/wallet_rpc_server.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/wallet_rpc_server_error_codes.h b/src/wallet/wallet_rpc_server_error_codes.h index 8ef2af3f..81ddece2 100644 --- a/src/wallet/wallet_rpc_server_error_codes.h +++ b/src/wallet/wallet_rpc_server_error_codes.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/wallets_manager.cpp b/src/wallet/wallets_manager.cpp index 72ccdf7d..163e601e 100644 --- a/src/wallet/wallets_manager.cpp +++ b/src/wallet/wallets_manager.cpp @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #include #include "wallets_manager.h" diff --git a/src/wallet/wallets_manager.h b/src/wallet/wallets_manager.h index 77e2cbc7..a728662c 100644 --- a/src/wallet/wallets_manager.h +++ b/src/wallet/wallets_manager.h @@ -1,8 +1,19 @@ // Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project // Copyright (c) 2012-2013 The Boolberry developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once diff --git a/src/wallet/wrap_service.h b/src/wallet/wrap_service.h index cefbfe6f..3918045e 100644 --- a/src/wallet/wrap_service.h +++ b/src/wallet/wrap_service.h @@ -1,6 +1,19 @@ // Copyright (c) 2014-2018 Zano Project -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2014-2018 The Louisdor Project +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once From e3910d8a5993e562952cd063945a02129ec1e607 Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 18:28:10 +0100 Subject: [PATCH 06/66] Refactor config variable checks into macro Replaces repetitive individual variable checks with a macro to streamline and simplify the process of verifying required configuration variables in CMake. --- cmake/check-config-vars.cmake | 87 ++++++++++++----------------------- 1 file changed, 30 insertions(+), 57 deletions(-) diff --git a/cmake/check-config-vars.cmake b/cmake/check-config-vars.cmake index b912cc39..bab219fa 100644 --- a/cmake/check-config-vars.cmake +++ b/cmake/check-config-vars.cmake @@ -1,57 +1,30 @@ -if (NOT DEFINED currency_display_decimal_point) - message(FATAL_ERROR "currency_display_decimal_point not set") -endif() -if (NOT DEFINED coin) - message(FATAL_ERROR "coin not set") -endif() -if (NOT DEFINED base_reward_dust_threshold) - message(FATAL_ERROR "base_reward_dust_threshold not set") -endif() -if (NOT DEFINED default_dust_threshold) - message(FATAL_ERROR "default_dust_threshold not set") -endif() -if (NOT DEFINED tx_default_fee) - message(FATAL_ERROR "tx_default_fee not set") -endif() -if (NOT DEFINED tx_minimum_fee) - message(FATAL_ERROR "tx_minimum_fee not set") -endif() -if (NOT DEFINED difficulty_pow_starter) - message(FATAL_ERROR "difficulty_pow_starter not set") -endif() -if (NOT DEFINED difficulty_pos_target) - message(FATAL_ERROR "difficulty_pos_target not set") -endif() -if (NOT DEFINED difficulty_pow_target) - message(FATAL_ERROR "difficulty_pow_target not set") -endif() -if (NOT DEFINED difficulty_window) - message(FATAL_ERROR "difficulty_window not set") -endif() -if (NOT DEFINED difficulty_lag) - message(FATAL_ERROR "difficulty_lag not set") -endif() -if (NOT DEFINED difficulty_cut) - message(FATAL_ERROR "difficulty_cut not set") -endif() -if (NOT DEFINED p2p_default_port) - message(FATAL_ERROR "p2p_default_port not set") -endif() -if (NOT DEFINED rpc_default_port) - message(FATAL_ERROR "rpc_default_port not set") -endif() -if (NOT DEFINED stratum_default_port) - message(FATAL_ERROR "stratum_default_port not set") -endif() -if (NOT DEFINED p2p_maintainers_pub_key) - message(FATAL_ERROR "p2p_maintainers_pub_key not set") -endif() -if (NOT DEFINED currency_name_abr) - message(FATAL_ERROR "currency_name_abr not set") -endif() -if (NOT DEFINED currency_name_base) - message(FATAL_ERROR "currency_name_base not set") -endif() -if (NOT DEFINED currency_name_short_base) - message(FATAL_ERROR "currency_name_short_base not set") -endif() + +macro(check_defined_vars) + foreach(var ${ARGN}) + if(NOT DEFINED ${var}) + message(FATAL_ERROR "${var} not set") + endif() + endforeach() +endmacro() + +check_defined_vars( + currency_display_decimal_point + coin + base_reward_dust_threshold + default_dust_threshold + tx_default_fee + tx_minimum_fee + difficulty_pow_starter + difficulty_pos_target + difficulty_pow_target + difficulty_window + difficulty_lag + difficulty_cut + p2p_default_port + rpc_default_port + stratum_default_port + p2p_maintainers_pub_key + currency_name_abr + currency_name_base + currency_name_short_base +) From 542095a6a5cf9e3f5e3b57c9d7651db0f6090a99 Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 21:01:14 +0100 Subject: [PATCH 07/66] Update config for Lethean rebranding and remove Zano data Rebranded configuration files and copyright/license headers for Lethean, replacing Zano references. Updated CMake config variables for Lethean, added new address prefixes, and removed hardcoded Zano pre-download data. Commented out hardcoded seed nodes in p2p/net_node.inl. Updated docs submodule pointer. --- cmake/check-config-vars.cmake | 3 ++ cmake/config-vars.cmake | 35 ++++++++++++++++------- docs | 2 +- src/common/pre_download.h | 8 +++--- src/currency_core/currency_config.h.in | 39 +++++++++++++++++--------- src/p2p/net_node.inl | 32 ++++++++++----------- 6 files changed, 74 insertions(+), 45 deletions(-) diff --git a/cmake/check-config-vars.cmake b/cmake/check-config-vars.cmake index bab219fa..e3825cc6 100644 --- a/cmake/check-config-vars.cmake +++ b/cmake/check-config-vars.cmake @@ -27,4 +27,7 @@ check_defined_vars( currency_name_abr currency_name_base currency_name_short_base + address_prefix_integrated + address_prefix_auditable + address_prefix_auditable_integrated ) diff --git a/cmake/config-vars.cmake b/cmake/config-vars.cmake index 94ca850e..ef33f7c9 100644 --- a/cmake/config-vars.cmake +++ b/cmake/config-vars.cmake @@ -1,20 +1,35 @@ -set(currency_display_decimal_point 12 CACHE STRING "CURRENCY_DISPLAY_DECIMAL_POINT" ) +# Tokenomics set(coin 1000000000000 CACHE STRING "COIN" ) -set(base_reward_dust_threshold 1000000 CACHE STRING "BASE_REWARD_DUST_THRESHOLD") -set(default_dust_threshold 0 CACHE STRING "DEFAULT_DUST_THRESHOLD" ) +set(premine_amount 4000000000000000000 CACHE STRING "PREMINE_AMOUNT" ) set(tx_default_fee 10000000000 CACHE STRING "TX_DEFAULT_FEE" ) set(tx_minimum_fee 10000000000 CACHE STRING "TX_MINIMUM_FEE" ) +set(currency_block_reward 1000000000000 CACHE STRING "CURRENCY_BLOCK_REWARD" ) +set(currency_display_decimal_point 12 CACHE STRING "CURRENCY_DISPLAY_DECIMAL_POINT" ) + +# Chain Config +set(currency_name_abr "LTHN" CACHE STRING "CURRENCY_NAME_ABR" ) +set(currency_name_base "Lethean" CACHE STRING "CURRENCY_NAME_BASE" ) +set(currency_name_short_base "Lethean" CACHE STRING "CURRENCY_NAME_SHORT_BASE" ) +set(address_prefix 0xc5 CACHE STRING "CURRENCY_PUBLIC_ADDRESS_BASE58_PREFIX" ) +set(address_prefix_integrated 0x36f8 CACHE STRING "CURRENCY_PUBLIC_INTEG_ADDRESS_V2_BASE58_PREFIX" ) +set(address_prefix_auditable 0x98c8 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_ADDRESS_BASE58_PREFIX" ) +set(address_prefix_auditable_integrated 0x8a49 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_INTEG_ADDRESS_BASE58_PREFIX" ) +set(base_reward_dust_threshold 1000000 CACHE STRING "BASE_REWARD_DUST_THRESHOLD") +set(default_dust_threshold 0 CACHE STRING "DEFAULT_DUST_THRESHOLD" ) set(difficulty_pow_starter 1 CACHE STRING "DIFFICULTY_POW_STARTER" ) set(difficulty_pos_target 120 CACHE STRING "DIFFICULTY_POS_TARGET" ) set(difficulty_pow_target 120 CACHE STRING "DIFFICULTY_POW_TARGET" ) set(difficulty_window 720 CACHE STRING "DIFFICULTY_WINDOW" ) set(difficulty_lag 15 CACHE STRING "DIFFICULTY_LAG" ) set(difficulty_cut 60 CACHE STRING "DIFFICULTY_CUT" ) -set(p2p_default_port 36942 CACHE STRING "P2P_DEFAULT_PORT" ) -set(rpc_default_port 36941 CACHE STRING "RPC_DEFAULT_PORT" ) -set(stratum_default_port 36940 CACHE STRING "STRATUM_DEFAULT_PORT" ) set(p2p_maintainers_pub_key "8f138bb73f6d663a3746a542770781a09579a7b84cb4125249e95530824ee607" CACHE STRING "P2P_MAINTAINERS_PUB_KEY" ) -set(currency_name_abr "FAKE" CACHE STRING "CURRENCY_NAME_ABR" ) -set(currency_name_base "Fake" CACHE STRING "CURRENCY_NAME_BASE" ) -set(currency_name_short_base "Fake" CACHE STRING "CURRENCY_NAME_SHORT_BASE" ) -set(premine_amount 4000000000000000000 CACHE STRING "PREMINE_AMOUNT" ) + +if (TESTNET) + set(p2p_default_port 36942 CACHE STRING "P2P_DEFAULT_PORT" ) + set(rpc_default_port 36941 CACHE STRING "RPC_DEFAULT_PORT" ) + set(stratum_default_port 36940 CACHE STRING "STRATUM_DEFAULT_PORT" ) +else () + set(p2p_default_port 36942 CACHE STRING "P2P_DEFAULT_PORT" ) + set(rpc_default_port 36941 CACHE STRING "RPC_DEFAULT_PORT" ) + set(stratum_default_port 36940 CACHE STRING "STRATUM_DEFAULT_PORT" ) +endif () diff --git a/docs b/docs index eb47d517..a9e0a8a8 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit eb47d517d3ddb2751fc5645d1e06b423588f6cb9 +Subproject commit a9e0a8a8fb8ce0c97dc0ea01698efdd65ee0137f diff --git a/src/common/pre_download.h b/src/common/pre_download.h index 9d4931f7..3e9269ca 100644 --- a/src/common/pre_download.h +++ b/src/common/pre_download.h @@ -33,10 +33,10 @@ namespace tools }; #ifndef TESTNET - static constexpr pre_download_entry c_pre_download_mdbx = { "https://f005.backblazeb2.com/file/zano-predownload/zano_mdbx_95_3150000.pak", "296d3129fee9253adea332d6c6128941aa5ef67eecaba49b9f8327f8c2d86ea1", 9388521394, 14226862080 }; - static constexpr pre_download_entry c_pre_download_lmdb = { "https://f005.backblazeb2.com/file/zano-predownload/zano_lmdb_95_3150000.pak", "bdb9d651636b36fd7d1f216c4afe89b1e7ec887da6eac7455ea18253a93345e8", 11287228509, 13988814848 }; - static constexpr pre_download_entry c_pre_download_mdbx_non_pruned = { "https://f005.backblazeb2.com/file/zano-predownload/zano_mdbx_95_3141000_non_pruned.pak", "0703902d535253627a2dd3c8697b305844b0241dfffefce5ec9d9e8e3475cdab", 10065877170, 15032156160 }; - static constexpr pre_download_entry c_pre_download_lmdb_non_pruned = { "https://f005.backblazeb2.com/file/zano-predownload/zano_lmdb_95_3141000_non_pruned.pak", "fe407e332d42a124d42781f6ccc6d2456728348230d7f05d94203ac405c37e63", 12081697874, 14824468480 }; + static constexpr pre_download_entry c_pre_download_mdbx = { "", "", 0, 0 }; + static constexpr pre_download_entry c_pre_download_lmdb = { "", "", 0, 0 }; + static constexpr pre_download_entry c_pre_download_mdbx_non_pruned = { "", "", 0, 0 }; + static constexpr pre_download_entry c_pre_download_lmdb_non_pruned = { "", "", 0, 0 }; #else static constexpr pre_download_entry c_pre_download_mdbx = { "", "", 0, 0 }; static constexpr pre_download_entry c_pre_download_lmdb = { "", "", 0, 0 }; diff --git a/src/currency_core/currency_config.h.in b/src/currency_core/currency_config.h.in index bfd066a8..f3a735ce 100644 --- a/src/currency_core/currency_config.h.in +++ b/src/currency_core/currency_config.h.in @@ -1,8 +1,19 @@ -// Copyright (c) 2014-2025 Zano Project +// Copyright (c) 2014-2018 Zano Project // Copyright (c) 2014-2018 The Louisdor Project -// Copyright (c) 2012-2013 The Cryptonote developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. +// Copyright (c) 2012-2013 The Boolberry developers +// Copyright (c) 2017-2025 Lethean (https://lt.hn) +// +// Licensed under the European Union Public Licence (EUPL) version 1.2. +// You may obtain a copy of the licence at: +// +// https://joinup.ec.europa.eu/software/page/eupl/licence-eupl +// +// The EUPL is a copyleft licence that is compatible with the MIT/X11 +// licence used by the original projects; the MIT terms are therefore +// considered “grandfathered” under the EUPL for this code. +// +// SPDX‑License‑Identifier: EUPL-1.2 +// #pragma once @@ -22,11 +33,11 @@ #define CURRENCY_TX_MAX_ALLOWED_INPUTS 256 // limited primarily by asset surjection proof #define CURRENCY_TX_MAX_ALLOWED_OUTS 2000 #define CURRENCY_TX_MIN_ALLOWED_OUTS 2 // effective starting HF4 Zarcanum -#define CURRENCY_PUBLIC_ADDRESS_BASE58_PREFIX 0xc5 // addresses start with 'Zx' +#define CURRENCY_PUBLIC_ADDRESS_BASE58_PREFIX @address_prefix@ // addresses start with 'Zx' #define CURRENCY_PUBLIC_INTEG_ADDRESS_BASE58_PREFIX 0x3678 // integrated addresses start with 'iZ' -#define CURRENCY_PUBLIC_INTEG_ADDRESS_V2_BASE58_PREFIX 0x36f8 // integrated addresses start with 'iZ' (new format) -#define CURRENCY_PUBLIC_AUDITABLE_ADDRESS_BASE58_PREFIX 0x98c8 // auditable addresses start with 'aZx' -#define CURRENCY_PUBLIC_AUDITABLE_INTEG_ADDRESS_BASE58_PREFIX 0x8a49 // auditable integrated addresses start with 'aiZX' +#define CURRENCY_PUBLIC_INTEG_ADDRESS_V2_BASE58_PREFIX @address_prefix_integrated@ // integrated addresses start with 'iZ' (new format) +#define CURRENCY_PUBLIC_AUDITABLE_ADDRESS_BASE58_PREFIX @address_prefix_auditable@ // auditable addresses start with 'aZx' +#define CURRENCY_PUBLIC_AUDITABLE_INTEG_ADDRESS_BASE58_PREFIX @address_prefix_auditable_integrated@ // auditable integrated addresses start with 'aiZX' #define CURRENCY_MINED_MONEY_UNLOCK_WINDOW 10 #define CURRENT_TRANSACTION_VERSION 3 #define TRANSACTION_VERSION_INITAL 0 @@ -66,7 +77,7 @@ #define TX_DEFAULT_FEE ((uint64_t)@tx_default_fee@) // .01 #define TX_MINIMUM_FEE ((uint64_t)@tx_minimum_fee@) // .01 -#define CURRENCY_BLOCK_REWARD 1000000000000 // 1.0 coin == pow(10, CURRENCY_DISPLAY_DECIMAL_POINT) +#define CURRENCY_BLOCK_REWARD @currency_block_reward@ // 1.0 coin == pow(10, CURRENCY_DISPLAY_DECIMAL_POINT) #define WALLET_MAX_ALLOWED_OUTPUT_AMOUNT ((uint64_t)0xffffffffffffffffLL) @@ -113,12 +124,12 @@ #ifndef TESTNET -#define P2P_DEFAULT_PORT (36942 + CURRENCY_FORMATION_VERSION) -#define RPC_DEFAULT_PORT 36941 -#define STRATUM_DEFAULT_PORT 36940 -//#define STRARUM_DEFAULT_PORT 51113 +#define P2P_DEFAULT_PORT @p2p_default_port@ +#define RPC_DEFAULT_PORT @rpc_default_port@ +#define STRATUM_DEFAULT_PORT @stratum_default_port@ + #define P2P_NETWORK_ID_TESTNET_FLAG 1 -#define P2P_MAINTAINERS_PUB_KEY "aaa2d7aabc8d383fd53a3ae898697b28f236ceade6bafc1eecff413a6a02272a" +#define P2P_MAINTAINERS_PUB_KEY "@p2p_maintainers_pub_key@" #define DIFFICULTY_POS_STARTER 1 #else #define P2P_DEFAULT_PORT @p2p_default_port@ diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl index bbf3b361..aa09c384 100644 --- a/src/p2p/net_node.inl +++ b/src/p2p/net_node.inl @@ -435,24 +435,24 @@ namespace nodetool #ifndef TESTNET //TODO: //ADD_HARDCODED_SEED_NODE(std::string("0.0.0.0:") + std::to_string(P2P_DEFAULT_PORT)); - ADD_HARDCODED_SEED_NODE("95.217.43.225", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("94.130.137.230", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("95.217.42.247", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("94.130.160.115", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("195.201.107.230", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("95.217.46.49", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("159.69.76.144", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("144.76.183.143", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("95.217.43.225", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("94.130.137.230", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("95.217.42.247", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("94.130.160.115", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("195.201.107.230", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("95.217.46.49", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("159.69.76.144", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("144.76.183.143", P2P_DEFAULT_PORT); #else // TESTNET - ADD_HARDCODED_SEED_NODE("95.217.43.225", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("94.130.137.230", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("95.217.42.247", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("94.130.160.115", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("195.201.107.230", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("95.217.46.49", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("159.69.76.144", P2P_DEFAULT_PORT); - ADD_HARDCODED_SEED_NODE("144.76.183.143", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("95.217.43.225", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("94.130.137.230", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("95.217.42.247", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("94.130.160.115", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("195.201.107.230", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("95.217.46.49", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("159.69.76.144", P2P_DEFAULT_PORT); + //ADD_HARDCODED_SEED_NODE("144.76.183.143", P2P_DEFAULT_PORT); #endif bool res = handle_command_line(vm); From ba059f76d4aaf457a1873bc5a2f51770d4ff0bf5 Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 21:22:15 +0100 Subject: [PATCH 08/66] Rename binaries to lethean-* and update workflows Changed output binary names in CMakeLists.txt from zanod/simplewallet to lethean-* variants, with testnet-specific names when applicable. Updated GitHub Actions workflows to upload lethean-* artifacts instead of the previous explicit binary names. --- .github/workflows/build-linux.yml | 4 +--- .github/workflows/build-macos-arm64.yml | 4 +--- .github/workflows/build-macos-intel.yml | 4 +--- .github/workflows/build-windows.yml | 4 +--- src/CMakeLists.txt | 11 ++++++++++- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 358c8819..d5a19c38 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -37,8 +37,6 @@ jobs: uses: ./.github/actions/upload-artifacts with: chain-network: ${{ inputs.chain-network }} - assets: | - zanod - simplewallet + assets: lethean-* asset-type: 'cli' asset-directory: ${{ github.workspace }}/build/gcc-linux-amd64-release/src diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index 15d75b10..11414e24 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -35,8 +35,6 @@ jobs: uses: ./.github/actions/upload-artifacts with: chain-network: ${{ inputs.chain-network }} - assets: | - zanod - simplewallet + assets: lethean-* asset-type: 'cli' asset-directory: ${{ github.workspace }}/build/apple-clang-arm64-release/src \ No newline at end of file diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index 6151daab..48383a53 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -34,8 +34,6 @@ jobs: uses: ./.github/actions/upload-artifacts with: chain-network: ${{ inputs.chain-network }} - assets: | - zanod - simplewallet + assets: lethean-* asset-type: 'cli' asset-directory: ${{ github.workspace }}/build/apple-clang-arm64-release/src diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 94514901..ca934fc9 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -34,8 +34,6 @@ jobs: uses: ./.github/actions/upload-artifacts with: chain-network: ${{ inputs.chain-network }} - assets: | - zanod.exe - simplewallet.exe + assets: lethean-* asset-type: 'cli' asset-directory: ${{ github.workspace }}/build/msvc-194-amd64-release/src/Release diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9e081b91..4cfb615f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -178,5 +178,14 @@ ENABLE_SHARED_PCH_EXECUTABLE(simplewallet) set_property(TARGET common crypto currency_core rpc stratum wallet PROPERTY FOLDER "libs") set_property(TARGET daemon simplewallet connectivity_tool PROPERTY FOLDER "prog") -set_property(TARGET daemon PROPERTY OUTPUT_NAME "zanod") + +if (NOT TESTNET) + set_property(TARGET daemon PROPERTY OUTPUT_NAME "lethean-chain-node") + set_property(TARGET simplewallet PROPERTY OUTPUT_NAME "lethean-wallet-cli") + set_property(TARGET connectivity_tool PROPERTY OUTPUT_NAME "lethean-chain-tool") +else () + set_property(TARGET daemon PROPERTY OUTPUT_NAME "lethean-testnet-chain-node") + set_property(TARGET simplewallet PROPERTY OUTPUT_NAME "lethean-testnet-wallet-cli") + set_property(TARGET connectivity_tool PROPERTY OUTPUT_NAME "lethean-testnet-chain-tool") +endif () From e3e588846f4c150c42007b73a71418b03b2842bc Mon Sep 17 00:00:00 2001 From: Snider Date: Thu, 25 Sep 2025 21:30:09 +0100 Subject: [PATCH 09/66] Fix error message grammar in ChainConfig.cmake Corrected the grammar of the fatal error message when both premine wallet and fresh genesis generation are enabled. --- cmake/ChainConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/ChainConfig.cmake b/cmake/ChainConfig.cmake index ac24b9c2..9ccdcabc 100644 --- a/cmake/ChainConfig.cmake +++ b/cmake/ChainConfig.cmake @@ -16,7 +16,7 @@ set(GENERATE_PREMINE_WALLET OFF CACHE BOOL "Generate premine wallet") set(PREMINE_WALLET_PASSWORD "" CACHE STRING "Premine wallet password") if (GENERATE_PREMINE_WALLET AND GENERATE_FRESH_GENESIS) - message(FATAL_ERROR "Genesis can be generatet together with premine wallet") + message(FATAL_ERROR "Genesis can not be generated together with premine wallet") endif() if (GENERATE_PREMINE_WALLET) From 3365bddaba8c0854d250a8fdc2e559892295f1e8 Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 26 Sep 2025 12:09:54 +0100 Subject: [PATCH 10/66] Update config-vars.cmake 0x73f7 - 'iT' 0x6af7 - integrated 'iTH' 0xdeaf7 - auditable addresses 'iTHn' 0x7eaf7 - auditable integrated 'iTHa' --- cmake/config-vars.cmake | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/config-vars.cmake b/cmake/config-vars.cmake index ef33f7c9..79b648fe 100644 --- a/cmake/config-vars.cmake +++ b/cmake/config-vars.cmake @@ -10,10 +10,10 @@ set(currency_display_decimal_point 12 CACHE STRING "CURRENCY_DISPLAY_DECIMAL_POI set(currency_name_abr "LTHN" CACHE STRING "CURRENCY_NAME_ABR" ) set(currency_name_base "Lethean" CACHE STRING "CURRENCY_NAME_BASE" ) set(currency_name_short_base "Lethean" CACHE STRING "CURRENCY_NAME_SHORT_BASE" ) -set(address_prefix 0xc5 CACHE STRING "CURRENCY_PUBLIC_ADDRESS_BASE58_PREFIX" ) -set(address_prefix_integrated 0x36f8 CACHE STRING "CURRENCY_PUBLIC_INTEG_ADDRESS_V2_BASE58_PREFIX" ) -set(address_prefix_auditable 0x98c8 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_ADDRESS_BASE58_PREFIX" ) -set(address_prefix_auditable_integrated 0x8a49 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_INTEG_ADDRESS_BASE58_PREFIX" ) +set(address_prefix 0x73f7 CACHE STRING "CURRENCY_PUBLIC_ADDRESS_BASE58_PREFIX" ) # addresses start with 'iT' +set(address_prefix_integrated 0x6af7 CACHE STRING "CURRENCY_PUBLIC_INTEG_ADDRESS_V2_BASE58_PREFIX" ) # integrated addresses start with 'iTH' +set(address_prefix_auditable 0xdeaf7 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_ADDRESS_BASE58_PREFIX" ) # auditable addresses start with 'iTHn' +set(address_prefix_auditable_integrated 0x7eaf7 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_INTEG_ADDRESS_BASE58_PREFIX" ) # auditable integrated addresses start with 'iTHa' set(base_reward_dust_threshold 1000000 CACHE STRING "BASE_REWARD_DUST_THRESHOLD") set(default_dust_threshold 0 CACHE STRING "DEFAULT_DUST_THRESHOLD" ) set(difficulty_pow_starter 1 CACHE STRING "DIFFICULTY_POW_STARTER" ) From aa457a7bb2dd108d7ed3a562f8d5d64655ebda8b Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 26 Sep 2025 12:09:57 +0100 Subject: [PATCH 11/66] Update ChainConfig.cmake --- cmake/ChainConfig.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/ChainConfig.cmake b/cmake/ChainConfig.cmake index 9ccdcabc..ca060fec 100644 --- a/cmake/ChainConfig.cmake +++ b/cmake/ChainConfig.cmake @@ -36,7 +36,7 @@ if (GENERATE_PREMINE_WALLET) # Generate wallet add_custom_command(TARGET premine_wallet POST_BUILD - COMMAND echo ${PREMINE_WALLET_PASSWORD} | ${CMAKE_BINARY_DIR}/src/simplewallet --generate-new-wallet ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet + COMMAND echo ${PREMINE_WALLET_PASSWORD} | ${CMAKE_BINARY_DIR}/src/lethean-wallet-cli --generate-new-wallet ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet COMMENT "Generating premine wallet in ${CMAKE_SOURCE_DIR}/premine_wallet" ) From 8914c6c0fbad90a3d6fac0f1e2e50b1e9c76295c Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 26 Sep 2025 12:19:51 +0100 Subject: [PATCH 12/66] Update address prefix values in config-vars.cmake wallet prefix conventions: prefix is 'iT', non auditable wallets then use 'H', auditable wallets use 'h'; 'N' is a base addr, 'n' is a sub address, --- cmake/config-vars.cmake | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cmake/config-vars.cmake b/cmake/config-vars.cmake index 79b648fe..fd96c731 100644 --- a/cmake/config-vars.cmake +++ b/cmake/config-vars.cmake @@ -10,10 +10,11 @@ set(currency_display_decimal_point 12 CACHE STRING "CURRENCY_DISPLAY_DECIMAL_POI set(currency_name_abr "LTHN" CACHE STRING "CURRENCY_NAME_ABR" ) set(currency_name_base "Lethean" CACHE STRING "CURRENCY_NAME_BASE" ) set(currency_name_short_base "Lethean" CACHE STRING "CURRENCY_NAME_SHORT_BASE" ) -set(address_prefix 0x73f7 CACHE STRING "CURRENCY_PUBLIC_ADDRESS_BASE58_PREFIX" ) # addresses start with 'iT' -set(address_prefix_integrated 0x6af7 CACHE STRING "CURRENCY_PUBLIC_INTEG_ADDRESS_V2_BASE58_PREFIX" ) # integrated addresses start with 'iTH' -set(address_prefix_auditable 0xdeaf7 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_ADDRESS_BASE58_PREFIX" ) # auditable addresses start with 'iTHn' -set(address_prefix_auditable_integrated 0x7eaf7 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_INTEG_ADDRESS_BASE58_PREFIX" ) # auditable integrated addresses start with 'iTHa' +# prefix is 'iT', non auditable wallets then use 'H', auditable wallets use 'h'; 'N' is a base addr, 'n' is a sub address, +set(address_prefix 0x1eaf7 CACHE STRING "CURRENCY_PUBLIC_ADDRESS_BASE58_PREFIX" ) # addresses start with 'iTHN' +set(address_prefix_integrated 0xdeaf7 CACHE STRING "CURRENCY_PUBLIC_INTEG_ADDRESS_V2_BASE58_PREFIX" ) # integrated addresses start with 'iTHn' +set(address_prefix_auditable 0x3ceff7 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_ADDRESS_BASE58_PREFIX" ) # auditable addresses start with 'iThN' +set(address_prefix_auditable_integrated 0x8b077 CACHE STRING "CURRENCY_PUBLIC_AUDITABLE_INTEG_ADDRESS_BASE58_PREFIX" ) # auditable integrated addresses start with 'iThn' set(base_reward_dust_threshold 1000000 CACHE STRING "BASE_REWARD_DUST_THRESHOLD") set(default_dust_threshold 0 CACHE STRING "DEFAULT_DUST_THRESHOLD" ) set(difficulty_pow_starter 1 CACHE STRING "DIFFICULTY_POW_STARTER" ) From ec1f5bfdf81785d4993bab8448da104224efa74c Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 26 Sep 2025 18:49:34 +0100 Subject: [PATCH 13/66] Add Conan dependency provider CMake module Introduces cmake/conan_provider.cmake, a comprehensive CMake module for integrating Conan as a dependency provider. This module automates Conan profile detection, compiler and platform settings, and manages Conan installation and dependency resolution during CMake configuration. --- cmake/conan_provider.cmake | 682 +++++++++++++++++++++++++++++++++++++ 1 file changed, 682 insertions(+) create mode 100644 cmake/conan_provider.cmake diff --git a/cmake/conan_provider.cmake b/cmake/conan_provider.cmake new file mode 100644 index 00000000..d39187c6 --- /dev/null +++ b/cmake/conan_provider.cmake @@ -0,0 +1,682 @@ +# The MIT License (MIT) +# +# Copyright (c) 2024 JFrog +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +set(CONAN_MINIMUM_VERSION 2.0.5) + +# Create a new policy scope and set the minimum required cmake version so the +# features behind a policy setting like if(... IN_LIST ...) behaves as expected +# even if the parent project does not specify a minimum cmake version or a minimum +# version less than this module requires (e.g. 3.0) before the first project() call. +# (see: https://cmake.org/cmake/help/latest/variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES.html) +# +# The policy-affecting calls like cmake_policy(SET...) or `cmake_minimum_required` only +# affects the current policy scope, i.e. between the PUSH and POP in this case. +# +# https://cmake.org/cmake/help/book/mastering-cmake/chapter/Policies.html#the-policy-stack +cmake_policy(PUSH) +cmake_minimum_required(VERSION 3.24) + + +function(detect_os os os_api_level os_sdk os_subsystem os_version) + # it could be cross compilation + message(STATUS "CMake-Conan: cmake_system_name=${CMAKE_SYSTEM_NAME}") + if(CMAKE_SYSTEM_NAME AND NOT CMAKE_SYSTEM_NAME STREQUAL "Generic") + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(${os} Macos PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME STREQUAL "QNX") + set(${os} Neutrino PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME STREQUAL "CYGWIN") + set(${os} Windows PARENT_SCOPE) + set(${os_subsystem} cygwin PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME MATCHES "^MSYS") + set(${os} Windows PARENT_SCOPE) + set(${os_subsystem} msys2 PARENT_SCOPE) + elseif(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") + # https://github.com/emscripten-core/emscripten/blob/4.0.6/cmake/Modules/Platform/Emscripten.cmake#L17C1-L17C34 + set(${os} Emscripten PARENT_SCOPE) + else() + set(${os} ${CMAKE_SYSTEM_NAME} PARENT_SCOPE) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Android") + if(DEFINED ANDROID_PLATFORM) + string(REGEX MATCH "[0-9]+" _os_api_level ${ANDROID_PLATFORM}) + elseif(DEFINED CMAKE_SYSTEM_VERSION) + set(_os_api_level ${CMAKE_SYSTEM_VERSION}) + endif() + message(STATUS "CMake-Conan: android api level=${_os_api_level}") + set(${os_api_level} ${_os_api_level} PARENT_SCOPE) + endif() + if(CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|watchOS") + # CMAKE_OSX_SYSROOT contains the full path to the SDK for MakeFile/Ninja + # generators, but just has the original input string for Xcode. + if(NOT IS_DIRECTORY ${CMAKE_OSX_SYSROOT}) + set(_os_sdk ${CMAKE_OSX_SYSROOT}) + else() + if(CMAKE_OSX_SYSROOT MATCHES Simulator) + set(apple_platform_suffix simulator) + else() + set(apple_platform_suffix os) + endif() + if(CMAKE_OSX_SYSROOT MATCHES AppleTV) + set(_os_sdk "appletv${apple_platform_suffix}") + elseif(CMAKE_OSX_SYSROOT MATCHES iPhone) + set(_os_sdk "iphone${apple_platform_suffix}") + elseif(CMAKE_OSX_SYSROOT MATCHES Watch) + set(_os_sdk "watch${apple_platform_suffix}") + endif() + endif() + if(DEFINED os_sdk) + message(STATUS "CMake-Conan: cmake_osx_sysroot=${CMAKE_OSX_SYSROOT}") + set(${os_sdk} ${_os_sdk} PARENT_SCOPE) + endif() + if(DEFINED CMAKE_OSX_DEPLOYMENT_TARGET) + message(STATUS "CMake-Conan: cmake_osx_deployment_target=${CMAKE_OSX_DEPLOYMENT_TARGET}") + set(${os_version} ${CMAKE_OSX_DEPLOYMENT_TARGET} PARENT_SCOPE) + endif() + endif() + endif() +endfunction() + + +function(detect_arch arch) + # CMAKE_OSX_ARCHITECTURES can contain multiple architectures, but Conan only supports one. + # Therefore this code only finds one. If the recipes support multiple architectures, the + # build will work. Otherwise, there will be a linker error for the missing architecture(s). + if(DEFINED CMAKE_OSX_ARCHITECTURES) + string(REPLACE " " ";" apple_arch_list "${CMAKE_OSX_ARCHITECTURES}") + list(LENGTH apple_arch_list apple_arch_count) + if(apple_arch_count GREATER 1) + message(WARNING "CMake-Conan: Multiple architectures detected, this will only work if Conan recipe(s) produce fat binaries.") + endif() + endif() + if(CMAKE_SYSTEM_NAME MATCHES "Darwin|iOS|tvOS|watchOS" AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "") + set(host_arch ${CMAKE_OSX_ARCHITECTURES}) + elseif(MSVC) + set(host_arch ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}) + else() + set(host_arch ${CMAKE_SYSTEM_PROCESSOR}) + endif() + if(host_arch MATCHES "aarch64|arm64|ARM64") + set(_arch armv8) + elseif(host_arch MATCHES "armv7|armv7-a|armv7l|ARMV7") + set(_arch armv7) + elseif(host_arch MATCHES armv7s) + set(_arch armv7s) + elseif(host_arch MATCHES "i686|i386|X86") + set(_arch x86) + elseif(host_arch MATCHES "AMD64|amd64|x86_64|x64") + set(_arch x86_64) + endif() + if(EMSCRIPTEN) + # https://github.com/emscripten-core/emscripten/blob/4.0.6/cmake/Modules/Platform/Emscripten.cmake#L294C1-L294C80 + set(_arch wasm) + endif() + message(STATUS "CMake-Conan: cmake_system_processor=${_arch}") + set(${arch} ${_arch} PARENT_SCOPE) +endfunction() + + +function(detect_cxx_standard cxx_standard) + set(${cxx_standard} ${CMAKE_CXX_STANDARD} PARENT_SCOPE) + if(CMAKE_CXX_EXTENSIONS) + set(${cxx_standard} "gnu${CMAKE_CXX_STANDARD}" PARENT_SCOPE) + endif() +endfunction() + + +macro(detect_gnu_libstdcxx) + # _conan_is_gnu_libstdcxx true if GNU libstdc++ + check_cxx_source_compiles(" + #include + #if !defined(__GLIBCXX__) && !defined(__GLIBCPP__) + static_assert(false); + #endif + int main(){}" _conan_is_gnu_libstdcxx) + + # _conan_gnu_libstdcxx_is_cxx11_abi true if C++11 ABI + check_cxx_source_compiles(" + #include + static_assert(sizeof(std::string) != sizeof(void*), \"using libstdc++\"); + int main () {}" _conan_gnu_libstdcxx_is_cxx11_abi) + + set(_conan_gnu_libstdcxx_suffix "") + if(_conan_gnu_libstdcxx_is_cxx11_abi) + set(_conan_gnu_libstdcxx_suffix "11") + endif() + unset (_conan_gnu_libstdcxx_is_cxx11_abi) +endmacro() + + +macro(detect_libcxx) + # _conan_is_libcxx true if LLVM libc++ + check_cxx_source_compiles(" + #include + #if !defined(_LIBCPP_VERSION) + static_assert(false); + #endif + int main(){}" _conan_is_libcxx) +endmacro() + + +function(detect_lib_cxx lib_cxx) + if(CMAKE_SYSTEM_NAME STREQUAL "Android") + message(STATUS "CMake-Conan: android_stl=${CMAKE_ANDROID_STL_TYPE}") + set(${lib_cxx} ${CMAKE_ANDROID_STL_TYPE} PARENT_SCOPE) + return() + endif() + + include(CheckCXXSourceCompiles) + + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + detect_gnu_libstdcxx() + set(${lib_cxx} "libstdc++${_conan_gnu_libstdcxx_suffix}" PARENT_SCOPE) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "AppleClang") + set(${lib_cxx} "libc++" PARENT_SCOPE) + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND NOT CMAKE_SYSTEM_NAME MATCHES "Windows") + # Check for libc++ + detect_libcxx() + if(_conan_is_libcxx) + set(${lib_cxx} "libc++" PARENT_SCOPE) + return() + endif() + + # Check for libstdc++ + detect_gnu_libstdcxx() + if(_conan_is_gnu_libstdcxx) + set(${lib_cxx} "libstdc++${_conan_gnu_libstdcxx_suffix}" PARENT_SCOPE) + return() + endif() + + # TODO: it would be an error if we reach this point + elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + # Do nothing - compiler.runtime and compiler.runtime_type + # should be handled separately: https://github.com/conan-io/cmake-conan/pull/516 + return() + else() + # TODO: unable to determine, ask user to provide a full profile file instead + endif() +endfunction() + + +function(detect_compiler compiler compiler_version compiler_runtime compiler_runtime_type) + if(DEFINED CMAKE_CXX_COMPILER_ID) + set(_compiler ${CMAKE_CXX_COMPILER_ID}) + set(_compiler_version ${CMAKE_CXX_COMPILER_VERSION}) + else() + if(NOT DEFINED CMAKE_C_COMPILER_ID) + message(FATAL_ERROR "C or C++ compiler not defined") + endif() + set(_compiler ${CMAKE_C_COMPILER_ID}) + set(_compiler_version ${CMAKE_C_COMPILER_VERSION}) + endif() + + message(STATUS "CMake-Conan: CMake compiler=${_compiler}") + message(STATUS "CMake-Conan: CMake compiler version=${_compiler_version}") + + if(_compiler MATCHES MSVC) + set(_compiler "msvc") + string(SUBSTRING ${MSVC_VERSION} 0 3 _compiler_version) + # Configure compiler.runtime and compiler.runtime_type settings for MSVC + if(CMAKE_MSVC_RUNTIME_LIBRARY) + set(_msvc_runtime_library ${CMAKE_MSVC_RUNTIME_LIBRARY}) + else() + set(_msvc_runtime_library MultiThreaded$<$:Debug>DLL) # default value documented by CMake + endif() + + set(_KNOWN_MSVC_RUNTIME_VALUES "") + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded MultiThreadedDLL) + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreadedDebug MultiThreadedDebugDLL) + list(APPEND _KNOWN_MSVC_RUNTIME_VALUES MultiThreaded$<$:Debug> MultiThreaded$<$:Debug>DLL) + + # only accept the 6 possible values, otherwise we don't don't know to map this + if(NOT _msvc_runtime_library IN_LIST _KNOWN_MSVC_RUNTIME_VALUES) + message(FATAL_ERROR "CMake-Conan: unable to map MSVC runtime: ${_msvc_runtime_library} to Conan settings") + endif() + + # Runtime is "dynamic" in all cases if it ends in DLL + if(_msvc_runtime_library MATCHES ".*DLL$") + set(_compiler_runtime "dynamic") + else() + set(_compiler_runtime "static") + endif() + message(STATUS "CMake-Conan: CMake compiler.runtime=${_compiler_runtime}") + + # Only define compiler.runtime_type when explicitly requested + # If a generator expression is used, let Conan handle it conditional on build_type + if(NOT _msvc_runtime_library MATCHES ":Debug>") + if(_msvc_runtime_library MATCHES "Debug") + set(_compiler_runtime_type "Debug") + else() + set(_compiler_runtime_type "Release") + endif() + message(STATUS "CMake-Conan: CMake compiler.runtime_type=${_compiler_runtime_type}") + endif() + + unset(_KNOWN_MSVC_RUNTIME_VALUES) + + elseif(_compiler MATCHES AppleClang) + set(_compiler "apple-clang") + string(REPLACE "." ";" VERSION_LIST ${_compiler_version}) + list(GET VERSION_LIST 0 _compiler_version) + elseif(_compiler MATCHES Clang) + set(_compiler "clang") + string(REPLACE "." ";" VERSION_LIST ${_compiler_version}) + list(GET VERSION_LIST 0 _compiler_version) + elseif(_compiler MATCHES GNU) + set(_compiler "gcc") + string(REPLACE "." ";" VERSION_LIST ${_compiler_version}) + list(GET VERSION_LIST 0 _compiler_version) + endif() + + message(STATUS "CMake-Conan: [settings] compiler=${_compiler}") + message(STATUS "CMake-Conan: [settings] compiler.version=${_compiler_version}") + if (_compiler_runtime) + message(STATUS "CMake-Conan: [settings] compiler.runtime=${_compiler_runtime}") + endif() + if (_compiler_runtime_type) + message(STATUS "CMake-Conan: [settings] compiler.runtime_type=${_compiler_runtime_type}") + endif() + + set(${compiler} ${_compiler} PARENT_SCOPE) + set(${compiler_version} ${_compiler_version} PARENT_SCOPE) + set(${compiler_runtime} ${_compiler_runtime} PARENT_SCOPE) + set(${compiler_runtime_type} ${_compiler_runtime_type} PARENT_SCOPE) +endfunction() + + +function(detect_build_type build_type) + get_property(multiconfig_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(NOT multiconfig_generator) + # Only set when we know we are in a single-configuration generator + # Note: we may want to fail early if `CMAKE_BUILD_TYPE` is not defined + set(${build_type} ${CMAKE_BUILD_TYPE} PARENT_SCOPE) + endif() +endfunction() + + +macro(set_conan_compiler_if_appleclang lang command output_variable) + if(CMAKE_${lang}_COMPILER_ID STREQUAL "AppleClang") + execute_process(COMMAND xcrun --find ${command} + OUTPUT_VARIABLE _xcrun_out OUTPUT_STRIP_TRAILING_WHITESPACE) + cmake_path(GET _xcrun_out PARENT_PATH _xcrun_toolchain_path) + cmake_path(GET CMAKE_${lang}_COMPILER PARENT_PATH _compiler_parent_path) + if ("${_xcrun_toolchain_path}" STREQUAL "${_compiler_parent_path}") + set(${output_variable} "") + endif() + unset(_xcrun_out) + unset(_xcrun_toolchain_path) + unset(_compiler_parent_path) + endif() +endmacro() + + +macro(append_compiler_executables_configuration) + set(_conan_c_compiler "") + set(_conan_cpp_compiler "") + set(_conan_rc_compiler "") + set(_conan_compilers_list "") + if(CMAKE_C_COMPILER) + set(_conan_c_compiler "\"c\":\"${CMAKE_C_COMPILER}\"") + set_conan_compiler_if_appleclang(C cc _conan_c_compiler) + list(APPEND _conan_compilers_list ${_conan_c_compiler}) + else() + message(WARNING "CMake-Conan: The C compiler is not defined. " + "Please define CMAKE_C_COMPILER or enable the C language.") + endif() + if(CMAKE_CXX_COMPILER) + set(_conan_cpp_compiler "\"cpp\":\"${CMAKE_CXX_COMPILER}\"") + set_conan_compiler_if_appleclang(CXX c++ _conan_cpp_compiler) + list(APPEND _conan_compilers_list ${_conan_cpp_compiler}) + else() + message(WARNING "CMake-Conan: The C++ compiler is not defined. " + "Please define CMAKE_CXX_COMPILER or enable the C++ language.") + endif() + if(CMAKE_RC_COMPILER) + set(_conan_rc_compiler "\"rc\":\"${CMAKE_RC_COMPILER}\"") + list(APPEND _conan_compilers_list ${_conan_rc_compiler}) + # Not necessary to warn if RC not defined + endif() + if(NOT "x${_conan_compilers_list}" STREQUAL "x") + string(REPLACE ";" "," _conan_compilers_list "${_conan_compilers_list}") + string(APPEND profile "tools.build:compiler_executables={${_conan_compilers_list}}\n") + endif() + unset(_conan_c_compiler) + unset(_conan_cpp_compiler) + unset(_conan_rc_compiler) + unset(_conan_compilers_list) +endmacro() + + +function(detect_host_profile output_file) + detect_os(os os_api_level os_sdk os_subsystem os_version) + detect_arch(arch) + detect_compiler(compiler compiler_version compiler_runtime compiler_runtime_type) + detect_cxx_standard(compiler_cppstd) + detect_lib_cxx(compiler_libcxx) + detect_build_type(build_type) + + set(profile "") + string(APPEND profile "[settings]\n") + if(arch) + string(APPEND profile arch=${arch} "\n") + endif() + if(os) + string(APPEND profile os=${os} "\n") + endif() + if(os_api_level) + string(APPEND profile os.api_level=${os_api_level} "\n") + endif() + if(os_version) + string(APPEND profile os.version=${os_version} "\n") + endif() + if(os_sdk) + string(APPEND profile os.sdk=${os_sdk} "\n") + endif() + if(os_subsystem) + string(APPEND profile os.subsystem=${os_subsystem} "\n") + endif() + if(compiler) + string(APPEND profile compiler=${compiler} "\n") + endif() + if(compiler_version) + string(APPEND profile compiler.version=${compiler_version} "\n") + endif() + if(compiler_runtime) + string(APPEND profile compiler.runtime=${compiler_runtime} "\n") + endif() + if(compiler_runtime_type) + string(APPEND profile compiler.runtime_type=${compiler_runtime_type} "\n") + endif() + if(compiler_cppstd) + string(APPEND profile compiler.cppstd=${compiler_cppstd} "\n") + endif() + if(compiler_libcxx) + string(APPEND profile compiler.libcxx=${compiler_libcxx} "\n") + endif() + if(build_type) + string(APPEND profile "build_type=${build_type}\n") + endif() + + if(NOT DEFINED output_file) + set(file_name "${CMAKE_BINARY_DIR}/profile") + else() + set(file_name ${output_file}) + endif() + + string(APPEND profile "[conf]\n") + string(APPEND profile "tools.cmake.cmaketoolchain:generator=${CMAKE_GENERATOR}\n") + + # propagate compilers via profile + append_compiler_executables_configuration() + + if(os STREQUAL "Android") + string(APPEND profile "tools.android:ndk_path=${CMAKE_ANDROID_NDK}\n") + endif() + + message(STATUS "CMake-Conan: Creating profile ${file_name}") + file(WRITE ${file_name} ${profile}) + message(STATUS "CMake-Conan: Profile: \n${profile}") +endfunction() + + +function(conan_profile_detect_default) + message(STATUS "CMake-Conan: Checking if a default profile exists") + execute_process(COMMAND ${CONAN_COMMAND} profile path default + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + ECHO_OUTPUT_VARIABLE + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + if(NOT ${return_code} EQUAL "0") + message(STATUS "CMake-Conan: The default profile doesn't exist, detecting it.") + execute_process(COMMAND ${CONAN_COMMAND} profile detect + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + ECHO_OUTPUT_VARIABLE + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + endif() +endfunction() + + +function(conan_install) + set(conan_output_folder ${CMAKE_BINARY_DIR}/conan) + # Invoke "conan install" with the provided arguments + set(conan_args ${conan_args} -of=${conan_output_folder}) + message(STATUS "CMake-Conan: conan install ${CMAKE_SOURCE_DIR} ${conan_args} ${ARGN}") + + + # In case there was not a valid cmake executable in the PATH, we inject the + # same we used to invoke the provider to the PATH + if(DEFINED PATH_TO_CMAKE_BIN) + set(old_path $ENV{PATH}) + set(ENV{PATH} "$ENV{PATH}:${PATH_TO_CMAKE_BIN}") + endif() + + execute_process(COMMAND ${CONAN_COMMAND} install ${CMAKE_SOURCE_DIR} ${conan_args} ${ARGN} --format=json + RESULT_VARIABLE return_code + OUTPUT_VARIABLE conan_stdout + ERROR_VARIABLE conan_stderr + ECHO_ERROR_VARIABLE # show the text output regardless + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + + if(DEFINED PATH_TO_CMAKE_BIN) + set(ENV{PATH} "${old_path}") + endif() + + if(NOT "${return_code}" STREQUAL "0") + message(FATAL_ERROR "Conan install failed='${return_code}'") + endif() + + # the files are generated in a folder that depends on the layout used, if + # one is specified, but we don't know a priori where this is. + # TODO: this can be made more robust if Conan can provide this in the json output + string(JSON conan_generators_folder GET "${conan_stdout}" graph nodes 0 generators_folder) + cmake_path(CONVERT ${conan_generators_folder} TO_CMAKE_PATH_LIST conan_generators_folder) + + message(STATUS "CMake-Conan: CONAN_GENERATORS_FOLDER=${conan_generators_folder}") + set_property(GLOBAL PROPERTY CONAN_GENERATORS_FOLDER "${conan_generators_folder}") + # reconfigure on conanfile changes + string(JSON conanfile GET "${conan_stdout}" graph nodes 0 label) + message(STATUS "CMake-Conan: CONANFILE=${CMAKE_SOURCE_DIR}/${conanfile}") + set_property(DIRECTORY ${CMAKE_SOURCE_DIR} APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_SOURCE_DIR}/${conanfile}") + # success + set_property(GLOBAL PROPERTY CONAN_INSTALL_SUCCESS TRUE) + +endfunction() + + +function(conan_get_version conan_command conan_current_version) + execute_process( + COMMAND ${conan_command} --version + OUTPUT_VARIABLE conan_output + RESULT_VARIABLE conan_result + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(conan_result) + message(FATAL_ERROR "CMake-Conan: Error when trying to run Conan") + endif() + + string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" conan_version ${conan_output}) + set(${conan_current_version} ${conan_version} PARENT_SCOPE) +endfunction() + + +function(conan_version_check) + set(options ) + set(one_value_args MINIMUM CURRENT) + set(multi_value_args ) + cmake_parse_arguments(conan_version_check + "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) + + if(NOT conan_version_check_MINIMUM) + message(FATAL_ERROR "CMake-Conan: Required parameter MINIMUM not set!") + endif() + if(NOT conan_version_check_CURRENT) + message(FATAL_ERROR "CMake-Conan: Required parameter CURRENT not set!") + endif() + + if(conan_version_check_CURRENT VERSION_LESS conan_version_check_MINIMUM) + message(FATAL_ERROR "CMake-Conan: Conan version must be ${conan_version_check_MINIMUM} or later") + endif() +endfunction() + + +macro(construct_profile_argument argument_variable profile_list) + set(${argument_variable} "") + if("${profile_list}" STREQUAL "CONAN_HOST_PROFILE") + set(_arg_flag "--profile:host=") + elseif("${profile_list}" STREQUAL "CONAN_BUILD_PROFILE") + set(_arg_flag "--profile:build=") + endif() + + set(_profile_list "${${profile_list}}") + list(TRANSFORM _profile_list REPLACE "auto-cmake" "${CMAKE_BINARY_DIR}/conan_host_profile") + list(TRANSFORM _profile_list PREPEND ${_arg_flag}) + set(${argument_variable} ${_profile_list}) + + unset(_arg_flag) + unset(_profile_list) +endmacro() + + +macro(conan_provide_dependency method package_name) + set_property(GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED TRUE) + get_property(_conan_install_success GLOBAL PROPERTY CONAN_INSTALL_SUCCESS) + if(NOT _conan_install_success) + find_program(CONAN_COMMAND "conan" REQUIRED) + conan_get_version(${CONAN_COMMAND} CONAN_CURRENT_VERSION) + conan_version_check(MINIMUM ${CONAN_MINIMUM_VERSION} CURRENT ${CONAN_CURRENT_VERSION}) + message(STATUS "CMake-Conan: first find_package() found. Installing dependencies with Conan") + if("default" IN_LIST CONAN_HOST_PROFILE OR "default" IN_LIST CONAN_BUILD_PROFILE) + conan_profile_detect_default() + endif() + if("auto-cmake" IN_LIST CONAN_HOST_PROFILE) + detect_host_profile(${CMAKE_BINARY_DIR}/conan_host_profile) + endif() + construct_profile_argument(_host_profile_flags CONAN_HOST_PROFILE) + construct_profile_argument(_build_profile_flags CONAN_BUILD_PROFILE) + if(EXISTS "${CMAKE_SOURCE_DIR}/conanfile.py") + file(READ "${CMAKE_SOURCE_DIR}/conanfile.py" outfile) + if(NOT "${outfile}" MATCHES ".*CMakeDeps.*") + message(WARNING "Cmake-conan: CMakeDeps generator was not defined in the conanfile") + endif() + set(generator "") + elseif (EXISTS "${CMAKE_SOURCE_DIR}/conanfile.txt") + file(READ "${CMAKE_SOURCE_DIR}/conanfile.txt" outfile) + if(NOT "${outfile}" MATCHES ".*CMakeDeps.*") + message(WARNING "Cmake-conan: CMakeDeps generator was not defined in the conanfile. " + "Please define the generator as it will be mandatory in the future") + endif() + set(generator "-g;CMakeDeps") + endif() + get_property(_multiconfig_generator GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(NOT _multiconfig_generator) + message(STATUS "CMake-Conan: Installing single configuration ${CMAKE_BUILD_TYPE}") + conan_install(${_host_profile_flags} ${_build_profile_flags} ${CONAN_INSTALL_ARGS} ${generator}) + else() + message(STATUS "CMake-Conan: Installing both Debug and Release") + conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Release ${CONAN_INSTALL_ARGS} ${generator}) + conan_install(${_host_profile_flags} ${_build_profile_flags} -s build_type=Debug ${CONAN_INSTALL_ARGS} ${generator}) + endif() + unset(_host_profile_flags) + unset(_build_profile_flags) + unset(_multiconfig_generator) + unset(_conan_install_success) + else() + message(STATUS "CMake-Conan: find_package(${ARGV1}) found, 'conan install' already ran") + unset(_conan_install_success) + endif() + + get_property(_conan_generators_folder GLOBAL PROPERTY CONAN_GENERATORS_FOLDER) + + # Ensure that we consider Conan-provided packages ahead of any other, + # irrespective of other settings that modify the search order or search paths + # This follows the guidelines from the find_package documentation + # (https://cmake.org/cmake/help/latest/command/find_package.html): + # find_package ( PATHS paths... NO_DEFAULT_PATH) + # find_package () + + # Filter out `REQUIRED` from the argument list, as the first call may fail + set(_find_args_${package_name} "${ARGN}") + list(REMOVE_ITEM _find_args_${package_name} "REQUIRED") + if(NOT "MODULE" IN_LIST _find_args_${package_name}) + find_package(${package_name} ${_find_args_${package_name}} BYPASS_PROVIDER PATHS "${_conan_generators_folder}" NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH) + unset(_find_args_${package_name}) + endif() + + # Invoke find_package a second time - if the first call succeeded, + # this will simply reuse the result. If not, fall back to CMake default search + # behaviour, also allowing modules to be searched. + if(NOT ${package_name}_FOUND) + list(FIND CMAKE_MODULE_PATH "${_conan_generators_folder}" _index) + if(_index EQUAL -1) + list(PREPEND CMAKE_MODULE_PATH "${_conan_generators_folder}") + endif() + unset(_index) + find_package(${package_name} ${ARGN} BYPASS_PROVIDER) + list(REMOVE_ITEM CMAKE_MODULE_PATH "${_conan_generators_folder}") + endif() +endmacro() + + +cmake_language( + SET_DEPENDENCY_PROVIDER conan_provide_dependency + SUPPORTED_METHODS FIND_PACKAGE +) + + +macro(conan_provide_dependency_check) + set(_conan_provide_dependency_invoked FALSE) + get_property(_conan_provide_dependency_invoked GLOBAL PROPERTY CONAN_PROVIDE_DEPENDENCY_INVOKED) + if(NOT _conan_provide_dependency_invoked) + message(WARNING "Conan is correctly configured as dependency provider, " + "but Conan has not been invoked. Please add at least one " + "call to `find_package()`.") + if(DEFINED CONAN_COMMAND) + # supress warning in case `CONAN_COMMAND` was specified but unused. + set(_conan_command ${CONAN_COMMAND}) + unset(_conan_command) + endif() + endif() + unset(_conan_provide_dependency_invoked) +endmacro() + + +# Add a deferred call at the end of processing the top-level directory +# to check if the dependency provider was invoked at all. +cmake_language(DEFER DIRECTORY "${CMAKE_SOURCE_DIR}" CALL conan_provide_dependency_check) + +# Configurable variables for Conan profiles +set(CONAN_HOST_PROFILE "default;auto-cmake" CACHE STRING "Conan host profile") +set(CONAN_BUILD_PROFILE "default" CACHE STRING "Conan build profile") +set(CONAN_INSTALL_ARGS "--build=missing" CACHE STRING "Command line arguments for conan install") + +find_program(_cmake_program NAMES cmake NO_PACKAGE_ROOT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_SYSTEM_PATH NO_CMAKE_FIND_ROOT_PATH) +if(NOT _cmake_program) + get_filename_component(PATH_TO_CMAKE_BIN "${CMAKE_COMMAND}" DIRECTORY) + set(PATH_TO_CMAKE_BIN "${PATH_TO_CMAKE_BIN}" CACHE INTERNAL "Path where the CMake executable is") +endif() + +cmake_policy(POP) \ No newline at end of file From 13743a6eef94663d76aceeb49be4036a0ae786d1 Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 26 Sep 2025 22:02:21 +0100 Subject: [PATCH 14/66] Replace Zano branding with Lethean throughout codebase Updated various strings, documentation, and identifiers to replace 'Zano' with 'Lethean' or 'LTHN' across the codebase, including user-facing messages, documentation comments, filenames, and Android package names. This change supports the rebranding effort and ensures consistency in references to the project. --- cmake/ChainConfig.cmake | 2 +- src/crypto/one_out_of_many_proofs.cpp | 2 +- src/crypto/range_proofs.h | 4 +-- src/currency_core/currency_basic.h | 2 +- src/currency_core/offers_service_basics.h | 4 +-- src/rpc/core_rpc_server.cpp | 4 +-- src/rpc/core_rpc_server_commands_defs.h | 6 ++--- src/simplewallet/simplewallet.cpp | 31 ++++++++++++----------- src/wallet/plain_wallet_api.cpp | 4 +-- src/wallet/wallet2.cpp | 2 +- src/wallet/wallet_public_structs_defs.h | 10 ++++---- src/wallet/wallet_rpc_server.h | 2 +- 12 files changed, 37 insertions(+), 36 deletions(-) diff --git a/cmake/ChainConfig.cmake b/cmake/ChainConfig.cmake index ca060fec..89d6823f 100644 --- a/cmake/ChainConfig.cmake +++ b/cmake/ChainConfig.cmake @@ -2,7 +2,7 @@ include_directories (${CMAKE_BINARY_DIR}/src ${CMAKE_BINARY_DIR}/src/currency_core) include(${CMAKE_SOURCE_DIR}/cmake/config-vars.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/currency_configs/example.cmake) +#include(${CMAKE_SOURCE_DIR}/cmake/currency_configs/example.cmake) include(${CMAKE_SOURCE_DIR}/cmake/check-config-vars.cmake) configure_file("currency_core/currency_config.h.in" "currency_core/currency_config.h") diff --git a/src/crypto/one_out_of_many_proofs.cpp b/src/crypto/one_out_of_many_proofs.cpp index abc39074..4eec6b60 100644 --- a/src/crypto/one_out_of_many_proofs.cpp +++ b/src/crypto/one_out_of_many_proofs.cpp @@ -43,7 +43,7 @@ namespace crypto { precalculated_generators.resize(mn_max * 2); - scalar_t hash_buf[2] = { hash_helper_t::hs("Zano BGE generator"), 0 }; + scalar_t hash_buf[2] = { hash_helper_t::hs("Lethean BGE generator"), 0 }; for(size_t i = 0; i < precalculated_generators.size(); ++i) { diff --git a/src/crypto/range_proofs.h b/src/crypto/range_proofs.h index b9c63a4e..c35d34f3 100644 --- a/src/crypto/range_proofs.h +++ b/src/crypto/range_proofs.h @@ -90,7 +90,7 @@ namespace crypto static const scalar_t& get_initial_transcript() { - static scalar_t value = hash_helper_t::hs("Zano BP+ initial transcript"); + static scalar_t value = hash_helper_t::hs("Lethean BP+ initial transcript"); return value; } @@ -121,7 +121,7 @@ namespace crypto static bool calculated = false; if (!calculated) { - scalar_t hash_buf[2] = { hash_helper_t::hs("Zano BP+ generator"), 0 }; + scalar_t hash_buf[2] = { hash_helper_t::hs("Lethean BP+ generator"), 0 }; for (size_t i = 0; i < 2 * c_bpp_mn_max; ++i) { hash_buf[1].m_u64[0] = i; diff --git a/src/currency_core/currency_basic.h b/src/currency_core/currency_basic.h index c9d51831..cc64e5e8 100644 --- a/src/currency_core/currency_basic.h +++ b/src/currency_core/currency_basic.h @@ -782,7 +782,7 @@ namespace currency KV_SERIALIZE(current_supply) DOC_DSCR("Currently emitted supply for the given asset (ignored for REGISTER operation).") DOC_EXMP(500000000000000000) DOC_END KV_SERIALIZE(decimal_point) DOC_DSCR("Decimal point.") DOC_EXMP(12) DOC_END KV_SERIALIZE(ticker) DOC_DSCR("Ticker associated with the asset.") DOC_EXMP("ZABC") DOC_END - KV_SERIALIZE(full_name) DOC_DSCR("Full name of the asset.") DOC_EXMP("Zano wrapped ABC") DOC_END + KV_SERIALIZE(full_name) DOC_DSCR("Full name of the asset.") DOC_EXMP("Lethean wrapped ABC") DOC_END KV_SERIALIZE(meta_info) DOC_DSCR("Any other information associated with the asset, by default in a json format.") DOC_EXMP("{ \"some_arbitrary_field_name\": \"some arbitrary value\"}") DOC_END KV_SERIALIZE_POD_AS_HEX_STRING(owner) DOC_DSCR("Owner's key, used only for EMIT and UPDATE validation, can be changed by transferring asset ownership.") DOC_EXMP("f74bb56a5b4fa562e679ccaadd697463498a66de4f1760b2cd40f11c3a00a7a8") DOC_END KV_SERIALIZE(hidden_supply) DOC_DSCR("This field is reserved for future use and will be documented later.") DOC_END diff --git a/src/currency_core/offers_service_basics.h b/src/currency_core/offers_service_basics.h index 8fdfdced..33b30bb4 100644 --- a/src/currency_core/offers_service_basics.h +++ b/src/currency_core/offers_service_basics.h @@ -54,12 +54,12 @@ namespace bc_services KV_SERIALIZE_CUSTOM_N(amount_target, std::string, bc_services::transform_amount_to_string, bc_services::transform_string_to_amount, "at") DOC_DSCR("Smount of other currency or goods") DOC_EXMP("10000000") DOC_END KV_SERIALIZE_N(bonus, "b") DOC_DSCR("Bonus associated with the offer") DOC_EXMP("") DOC_END KV_SERIALIZE_N(target, "t") DOC_DSCR("Target: currency / goods") DOC_EXMP("USDT") DOC_END - KV_SERIALIZE_N(primary, "p") DOC_DSCR("Currency for goods") DOC_EXMP("ZANO") DOC_END + KV_SERIALIZE_N(primary, "p") DOC_DSCR("Currency for goods") DOC_EXMP("LTHN") DOC_END KV_SERIALIZE_N(location_country, "lco") DOC_DSCR("Country of the offer location") DOC_EXMP("Montenegro") DOC_END KV_SERIALIZE_N(location_city, "lci") DOC_DSCR("City of the offer location") DOC_EXMP("Kolasin") DOC_END KV_SERIALIZE_N(contacts, "cnt") DOC_DSCR("Contacts related to the offer") DOC_EXMP("Ranko +38211111111") DOC_END KV_SERIALIZE_N(comment, "com") DOC_DSCR("Comment associated with the offer") DOC_EXMP("Dobr dan") DOC_END - KV_SERIALIZE_N(payment_types, "pt") DOC_DSCR("Types of payment accepted for the offer") DOC_EXMP("zano") DOC_END + KV_SERIALIZE_N(payment_types, "pt") DOC_DSCR("Types of payment accepted for the offer") DOC_EXMP("lethean") DOC_END KV_SERIALIZE_N(deal_option, "do") DOC_DSCR("Deal option for the offer") DOC_EXMP("full amount, by parts") DOC_END KV_SERIALIZE_N(category, "cat") DOC_DSCR("Category of the offer") DOC_EXMP("") DOC_END KV_SERIALIZE_N(expiration_time, "et") DOC_DSCR("Expiration time of the offer") DOC_EXMP(0) DOC_END diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp index 0b67f9c2..bed582f2 100644 --- a/src/rpc/core_rpc_server.cpp +++ b/src/rpc/core_rpc_server.cpp @@ -1620,13 +1620,13 @@ namespace currency if (!get_account_address_and_payment_id_from_str(addr, payment_id_from_provided_addr, req.regular_address)) { error_resp.code = WALLET_RPC_ERROR_CODE_WRONG_ADDRESS; - error_resp.message = std::string("invalid address provided: \'") + req.regular_address + "\', Zano address expected"; + error_resp.message = std::string("invalid address provided: \'") + req.regular_address + "\', Lethean address expected"; return false; } if (payment_id_from_provided_addr.size()) { error_resp.code = WALLET_RPC_ERROR_CODE_WRONG_ADDRESS; - error_resp.message = std::string("invalid address provided: \'") + req.regular_address + "\', Zano address expected be regular and NOT integrated address"; + error_resp.message = std::string("invalid address provided: \'") + req.regular_address + "\', Lethean address expected be regular and NOT integrated address"; return false; } diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h index a0fd34c0..3ff81721 100644 --- a/src/rpc/core_rpc_server_commands_defs.h +++ b/src/rpc/core_rpc_server_commands_defs.h @@ -165,7 +165,7 @@ namespace currency struct COMMAND_RPC_GET_ASSETS_LIST { - DOC_COMMAND("Return list of assets registered in Zano blockchain"); + DOC_COMMAND("Return list of assets registered in Lethean blockchain"); struct request { @@ -185,7 +185,7 @@ namespace currency BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(status) DOC_DSCR("Status code of operation, OK if success") DOC_EXMP(API_RETURN_CODE_OK) DOC_END - KV_SERIALIZE(assets) DOC_DSCR("List of assets registered in Zano blockchain") DOC_EXMP_AUTO(1) DOC_END + KV_SERIALIZE(assets) DOC_DSCR("List of assets registered in Lethean blockchain") DOC_EXMP_AUTO(1) DOC_END END_KV_SERIALIZE_MAP() }; }; @@ -466,7 +466,7 @@ namespace currency BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(payment_id) DOC_DSCR("Hex-encoded Payment ID to be associated with the this address. If empty then wallet would generate new payment id using system random library") DOC_EXMP("1dfe5a88ff9effb3") DOC_END - KV_SERIALIZE(regular_address) DOC_DSCR("Zano wallet address to be used as a base for integrated address") DOC_EXMP("ZxCSpsGGeJsS8fwvQ4HktDU3qBeauoJTR6j73jAWWZxFXdF7XTbGm4YfS2kXJmAP4Rf5BVsSQ9iZ45XANXEYsrLN2L2W77dH7") DOC_END + KV_SERIALIZE(regular_address) DOC_DSCR("Lethean wallet address to be used as a base for integrated address") DOC_EXMP("ZxCSpsGGeJsS8fwvQ4HktDU3qBeauoJTR6j73jAWWZxFXdF7XTbGm4YfS2kXJmAP4Rf5BVsSQ9iZ45XANXEYsrLN2L2W77dH7") DOC_END END_KV_SERIALIZE_MAP() }; diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index 30b645c1..1137f878 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -308,7 +308,7 @@ simple_wallet::simple_wallet() m_cmd_binder.set_handler("incoming_counts", boost::bind(&simple_wallet::show_incoming_transfers_counts, this, ph::_1), "incoming_transfers counts"); m_cmd_binder.set_handler("list_recent_transfers", boost::bind(&simple_wallet::list_recent_transfers, this, ph::_1), "list_recent_transfers [offset] [count] - Show recent maximum 1000 transfers, offset default = 0, count default = 100 "); m_cmd_binder.set_handler("export_recent_transfers", boost::bind(&simple_wallet::export_recent_transfers, this, ph::_1), "list_recent_transfers_tx - Write recent transfer in json to wallet_recent_transfers.txt"); - m_cmd_binder.set_handler("list_outputs", boost::bind(&simple_wallet::list_outputs, this, ph::_1), "list_outputs [spent|unspent] [ticker=ZANO] [unknown] - Lists all the outputs. The result may be filtered by spent status, asset ticker or unknown asset ids."); + m_cmd_binder.set_handler("list_outputs", boost::bind(&simple_wallet::list_outputs, this, ph::_1), "list_outputs [spent|unspent] [ticker=LTHN] [unknown] - Lists all the outputs. The result may be filtered by spent status, asset ticker or unknown asset ids."); m_cmd_binder.set_handler("lo", boost::bind(&simple_wallet::list_outputs, this, ph::_1), "alias for list_outputs"); m_cmd_binder.set_handler("dump_transfers", boost::bind(&simple_wallet::dump_transfers, this, ph::_1), "dump_transfers - Write transfers in json to dump_transfers.txt"); m_cmd_binder.set_handler("dump_keyimages", boost::bind(&simple_wallet::dump_key_images, this, ph::_1), "dump_keyimages - Write key_images in json to dump_key_images.txt"); @@ -708,7 +708,7 @@ bool simple_wallet::restore_wallet(const std::string& wallet_file, const std::st "Your wallet has been restored.\n" << "To start synchronizing with the daemon use \"refresh\" command.\n" << "Use \"help\" command to see the list of available commands.\n" << - "Always use \"exit\" command when closing simplewallet to save\n" << + "Always use \"exit\" command when closing your wallet to save\n" << "current session's state. Otherwise, you will possibly need to synchronize \n" << "your wallet again. Your wallet keys is NOT under risk anyway.\n" << "**********************************************************************"; @@ -903,7 +903,7 @@ std::string print_money_trailing_zeros_replaced_with_spaces(uint64_t amount, siz //---------------------------------------------------------------------------------------------------- std::string simple_wallet::get_token_info_string(const crypto::public_key& asset_id, uint64_t& decimal_points) { - std::string token_info = "ZANO"; + std::string token_info = "LTHN"; decimal_points = CURRENCY_DISPLAY_DECIMAL_POINT; if (asset_id != currency::native_coin_asset_id) { @@ -1607,6 +1607,7 @@ bool simple_wallet::validate_wrap_status(uint64_t amount) currency::void_struct req = AUTO_VAL_INIT(req); currency::rpc_get_wrap_info_response res = AUTO_VAL_INIT(res); + return false; //@todo remove manual bock - Snider 2025 bool r = epee::net_utils::invoke_http_json_remote_command2("http://wrapped.zano.org/api2/get_wrap_info", req, res, http_client, 10000); if (!r) { @@ -1618,7 +1619,7 @@ bool simple_wallet::validate_wrap_status(uint64_t amount) if (amount <= zano_needed_for_wrap) { fail_msg_writer() << "Too small amount to cover ERC20 fee. ERC20 cost is: " - << print_money(zano_needed_for_wrap) << " Zano" << + << print_money(zano_needed_for_wrap) << " Lethean" << "($" << res.tx_cost.usd_needed_for_erc20 << ")"; return false; } @@ -1626,11 +1627,11 @@ bool simple_wallet::validate_wrap_status(uint64_t amount) if (amount > unwrapped_coins_left) { fail_msg_writer() << "Amount is bigger than ERC20 tokens left available: " - << print_money(unwrapped_coins_left) << " wZano"; + << print_money(unwrapped_coins_left) << " wLTHN"; return false; } - success_msg_writer(false) << "You'll receive estimate " << print_money(amount - zano_needed_for_wrap) << " wZano (" << print_money(zano_needed_for_wrap)<< " Zano will be used to cover ERC20 fee)"; + success_msg_writer(false) << "You'll receive estimate " << print_money(amount - zano_needed_for_wrap) << " wLTHN (" << print_money(zano_needed_for_wrap)<< " Lethean will be used to cover ERC20 fee)"; success_msg_writer(false) << "Proceed? (yes/no)"; while (true) { @@ -1740,7 +1741,7 @@ bool simple_wallet::transfer_impl(const std::vector &args_, uint64_ { success_msg_writer(false) << "Address " << local_args[i] << " recognized as wrapped address, creating wrapping transaction."; - success_msg_writer(false) << "This transaction will create wZano (\"Wrapped Zano\") which will be sent to the specified address on the Ethereum network."; + success_msg_writer(false) << "This transaction will create wLTHN (\"Wrapped Lethean\") which will be sent to the specified address on the Ethereum network."; if (!validate_wrap_status(de.amount)) { @@ -1799,13 +1800,13 @@ bool simple_wallet::transfer_impl(const std::vector &args_, uint64_ if (!m_wallet->is_watch_only()) { if(wrapped_transaction) - success_msg_writer(true) << "Transaction successfully sent to wZano custody wallet, id: " << get_transaction_hash(tx) << ", " << get_object_blobsize(tx) << " bytes"; + success_msg_writer(true) << "Transaction successfully sent to wLTHN custody wallet, id: " << get_transaction_hash(tx) << ", " << get_object_blobsize(tx) << " bytes"; else success_msg_writer(true) << "Transaction successfully sent, id: " << get_transaction_hash(tx) << ", " << get_object_blobsize(tx) << " bytes"; } else { - success_msg_writer(true) << "Transaction prepared for signing and saved into \"zano_tx_unsigned\" file, use full wallet to sign transfer and then use \"submit_transfer\" on this wallet to broadcast the transaction to the network"; + success_msg_writer(true) << R"(Transaction prepared for signing and saved into "lethean_tx_unsigned" file, use full wallet to sign transfer and then use "submit_transfer" on this wallet to broadcast the transaction to the network)"; } SIMPLE_WALLET_CATCH_TRY_ENTRY() @@ -2783,7 +2784,7 @@ bool simple_wallet::sweep_below(const std::vector &args) size_t outs_total = 0, outs_swept = 0; uint64_t amount_total = 0, amount_swept = 0; currency::transaction result_tx = AUTO_VAL_INIT(result_tx); - std::string filename = "zano_tx_unsigned"; + std::string filename = "lethean_tx_unsigned"; m_wallet->sweep_below(fake_outs_count, addr, amount, payment_id, fee, outs_total, amount_total, outs_swept, amount_swept, &result_tx, &filename); success_msg_writer(false) << outs_swept << " outputs (" << print_money_brief(amount_swept) << " coins) of " << outs_total << " total (" << print_money_brief(amount_total) @@ -2838,12 +2839,12 @@ bool simple_wallet::sweep_bare_outs(const std::vector &args) uint64_t unlocked_balance = 0; uint64_t balance = m_wallet->balance(unlocked_balance); if (balance < COIN) - success_msg_writer(false) << "Looks like it's not enough coins to perform this operation. Transferring " << print_money_brief(TX_MINIMUM_FEE) << " ZANO or more to this wallet may help."; + success_msg_writer(false) << "Looks like it's not enough coins to perform this operation. Transferring " << print_money_brief(TX_MINIMUM_FEE) << " LTHN or more to this wallet may help."; else if (unlocked_balance < COIN) success_msg_writer(false) << "Not enough spendable outputs to perform this operation. Please, try again later."; else { - success_msg_writer(false) << "This operation couldn't be performed for some reason. Please, copy simplewallet's log file and ask for support. Nothing was done."; + success_msg_writer(false) << "This operation couldn't be performed for some reason. Please, copy wallet's log file and ask for support. Nothing was done."; LOG_PRINT_L0("strange situation: balance: " << print_money_brief(balance) << ", unlocked_balance: " << print_money_brief(unlocked_balance) << " but get_bare_unspent_outputs_stats returned empty result"); } return true; @@ -3374,14 +3375,14 @@ int main(int argc, char* argv[]) if (command_line::get_arg(vm, command_line::arg_help)) { - success_msg_writer() << "Usage: simplewallet [--wallet-file=|--generate-new[-auditable]-wallet=] [--daemon-address=:] []"; + success_msg_writer() << "Usage: lethean-wallet-cli [--wallet-file=|--generate-new[-auditable]-wallet=] [--daemon-address=:] []"; success_msg_writer() << desc_all << '\n' << sw->get_commands_str(); exit_requested = true; return true; } else if (command_line::get_arg(vm, command_line::arg_version)) { - success_msg_writer() << CURRENCY_NAME << " simplewallet v" << PROJECT_VERSION_LONG; + success_msg_writer() << CURRENCY_NAME << " Wallet v" << PROJECT_VERSION_LONG; exit_requested = true; return true; } @@ -3408,7 +3409,7 @@ int main(int argc, char* argv[]) log_dir = log_file_path.has_parent_path() ? log_file_path.parent_path().string() : log_space::log_singletone::get_default_log_folder(); log_space::log_singletone::add_logger(LOGGER_FILE, log_file_path.filename().string().c_str(), log_dir.c_str(), LOG_LEVEL_4); LOG_PRINT_L0(ENDL << ENDL); - message_writer(epee::log_space::console_color_white, true, std::string(), LOG_LEVEL_0) << CURRENCY_NAME << " simplewallet v" << PROJECT_VERSION_LONG; + message_writer(epee::log_space::console_color_white, true, std::string(), LOG_LEVEL_0) << CURRENCY_NAME << " Wallet v" << PROJECT_VERSION_LONG; if (command_line::has_arg(vm, command_line::arg_log_level)) { diff --git a/src/wallet/plain_wallet_api.cpp b/src/wallet/plain_wallet_api.cpp index 270210f1..b023d73b 100644 --- a/src/wallet/plain_wallet_api.cpp +++ b/src/wallet/plain_wallet_api.cpp @@ -31,7 +31,7 @@ #include "static_helpers.h" #include "wallet_helpers.h" -#define ANDROID_PACKAGE_NAME "com.zano_mobile" +#define ANDROID_PACKAGE_NAME "com.lethean.mobile" #define LOGS_FOLDER "logs" @@ -440,7 +440,7 @@ namespace plain_wallet { const std::string src_folder_path = get_bundle_working_dir(); boost::system::error_code ec; - const std::string full_target_path = target_dir + "/Zano_export" + std::to_string(epee::misc_utils::get_tick_count()); + const std::string full_target_path = target_dir + "/Lethean_export" + std::to_string(epee::misc_utils::get_tick_count()); boost::filesystem::create_directory(full_target_path, ec); if (ec) { diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp index 0ba1979e..de4bb0b4 100644 --- a/src/wallet/wallet2.cpp +++ b/src/wallet/wallet2.cpp @@ -8205,7 +8205,7 @@ void wallet2::transfer(construct_tx_param& ctp, if (m_watch_only) { - bool r = store_unsigned_tx_to_file_and_reserve_transfers(ftp, (p_unsigned_filename_or_tx_blob_str != nullptr ? *p_unsigned_filename_or_tx_blob_str : "zano_tx_unsigned"), p_unsigned_filename_or_tx_blob_str); + bool r = store_unsigned_tx_to_file_and_reserve_transfers(ftp, (p_unsigned_filename_or_tx_blob_str != nullptr ? *p_unsigned_filename_or_tx_blob_str : "lethean_tx_unsigned"), p_unsigned_filename_or_tx_blob_str); WLT_THROW_IF_FALSE_WALLET_CMN_ERR_EX(r, "failed to store unsigned tx"); WLT_LOG_GREEN("[wallet::transfer]" << " prepare_transaction_time: " << print_fixed_decimal_point(prepare_transaction_time, 3), LOG_LEVEL_0); return; diff --git a/src/wallet/wallet_public_structs_defs.h b/src/wallet/wallet_public_structs_defs.h index b79c7c3b..b5dcf2cc 100644 --- a/src/wallet/wallet_public_structs_defs.h +++ b/src/wallet/wallet_public_structs_defs.h @@ -190,8 +190,8 @@ namespace wallet_public KV_SERIALIZE(timestamp) DOC_DSCR("Timestamp of the block that included transaction in blockchain, 0 for unconfirmed") DOC_EXMP(1712590951) DOC_END KV_SERIALIZE(employed_entries) DOC_DSCR("Mark entries from transaction that was connected to this wallet") DOC_END KV_SERIALIZE(fee) DOC_DSCR("Transaction fee") DOC_EXMP(10000000000) DOC_END - KV_SERIALIZE(is_service) DOC_DSCR("Tells if this transaction is used as utility by one of Zano services(contracts, ionic swaps, etc)") DOC_EXMP(false) DOC_END - KV_SERIALIZE(is_mixing) DOC_DSCR("Tells if this transaction using mixins or not(auditble wallets normally don't use mixins)") DOC_EXMP(false) DOC_END + KV_SERIALIZE(is_service) DOC_DSCR("Tells if this transaction is used as utility by one of Lethean services(contracts, ionic swaps, etc)") DOC_EXMP(false) DOC_END + KV_SERIALIZE(is_mixing) DOC_DSCR("Tells if this transaction using mixins or not(auditable wallets normally don't use mixins)") DOC_EXMP(false) DOC_END KV_SERIALIZE(is_mining) DOC_DSCR("Tells if this transaction is coinbase transaction(ie generated by PoW mining or by PoS staking)") DOC_EXMP(false) DOC_END KV_SERIALIZE(tx_type) DOC_DSCR("Could be one of this: GUI_TX_TYPE_NORMAL=0, GUI_TX_TYPE_PUSH_OFFER=1, GUI_TX_TYPE_UPDATE_OFFER=2, GUI_TX_TYPE_CANCEL_OFFER=3, GUI_TX_TYPE_NEW_ALIAS=4,GUI_TX_TYPE_UPDATE_ALIAS=5,GUI_TX_TYPE_COIN_BASE=6,GUI_TX_TYPE_ESCROW_PROPOSAL=7,GUI_TX_TYPE_ESCROW_TRANSFER=8,GUI_TX_TYPE_ESCROW_RELEASE_NORMAL=9,GUI_TX_TYPE_ESCROW_RELEASE_BURN=10,GUI_TX_TYPE_ESCROW_CANCEL_PROPOSAL=11,GUI_TX_TYPE_ESCROW_RELEASE_CANCEL=12,GUI_TX_TYPE_HTLC_DEPOSIT=13,GUI_TX_TYPE_HTLC_REDEEM=14") DOC_EXMP(0) DOC_END KV_SERIALIZE(show_sender) DOC_DSCR("If sender is included in tx") DOC_EXMP(false) DOC_END @@ -199,8 +199,8 @@ namespace wallet_public KV_SERIALIZE(service_entries) DOC_DSCR("Additional entries that might be stored in transaction but not part of it's consensus") DOC_EXMP_AUTO(1) DOC_END KV_SERIALIZE(transfer_internal_index) DOC_DSCR("Index of this entry in the wallet's array of transaction's history") DOC_EXMP(12) DOC_END KV_SERIALIZE(remote_addresses) DOC_DSCR("Remote addresses of this transfer(destination if it's outgoing transfer or sender if it's incoming transaction)") DOC_EXMP_AUTO(1, "ZxBvJDuQjMG9R2j4WnYUhBYNrwZPwuyXrC7FHdVmWqaESgowDvgfWtiXeNGu8Px9B24pkmjsA39fzSSiEQG1ekB225ZnrMTBp") DOC_END - KV_SERIALIZE(remote_aliases) DOC_DSCR("Aliases for remot addresses, of discovered") DOC_EXMP_AUTO(1, "roger") DOC_END - KV_SERIALIZE(subtransfers) DOC_DSCR("Essential part of transfer entry: amounts that been transfered in this transaction grouped by asset id") DOC_EXMP_AUTO(1) DOC_END + KV_SERIALIZE(remote_aliases) DOC_DSCR("Aliases for remote addresses, of discovered") DOC_EXMP_AUTO(1, "roger") DOC_END + KV_SERIALIZE(subtransfers) DOC_DSCR("Essential part of transfer entry: amounts that been transferred in this transaction grouped by asset id") DOC_EXMP_AUTO(1) DOC_END KV_SERIALIZE_EPHEMERAL_N(currency::asset_descriptor_operation, wallet_transfer_info_get_ado, "ado") DOC_DSCR("\"Asset Descriptor Operation\" if it was present in transaction") DOC_END END_KV_SERIALIZE_MAP() @@ -723,7 +723,7 @@ namespace wallet_public KV_SERIALIZE(comment) DOC_DSCR("Text comment that is displayed in UI") DOC_EXMP_AUTO("Thanks for the coffe") DOC_END KV_SERIALIZE(push_payer) DOC_DSCR("Reveal information about sender of this transaction, basically add sender address to transaction in encrypted way, so only receiver can see who sent transaction") DOC_EXMP(false) DOC_END KV_SERIALIZE(hide_receiver) DOC_DSCR("This add to transaction information about remote address(destination), might be needed when the wallet restored from seed phrase and fully resynched, if this option were true, then sender won't be able to see remote address for sent transactions anymore.") DOC_EXMP(true) DOC_END - KV_SERIALIZE(service_entries) DOC_DSCR("Service entries that might be used by different apps that works on top of Zano network, not part of consensus") DOC_EXMP_AUTO(1) DOC_END + KV_SERIALIZE(service_entries) DOC_DSCR("Service entries that might be used by different apps that works on top of Lethean network, not part of consensus") DOC_EXMP_AUTO(1) DOC_END KV_SERIALIZE(service_entries_permanent) DOC_DSCR("Point to wallet that service_entries should be placed to 'extra' section of transaction(which won't be pruned after checkpoints)") DOC_EXMP_AUTO(1) DOC_END END_KV_SERIALIZE_MAP() }; diff --git a/src/wallet/wallet_rpc_server.h b/src/wallet/wallet_rpc_server.h index 196759ce..ca9c9fb9 100644 --- a/src/wallet/wallet_rpc_server.h +++ b/src/wallet/wallet_rpc_server.h @@ -24,7 +24,7 @@ #include "wallet2.h" #include "common/command_line.h" -#define ZANO_ACCESS_TOKEN "Zano-Access-Token" +#define ZANO_ACCESS_TOKEN "Lethean-Access-Token" namespace tools { From 2781c7c9b7c494706aacf189873a370e4a3cfd16 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 01:22:15 +0100 Subject: [PATCH 15/66] Refactor build profiles and remove legacy build scripts Renamed and updated CMake build profiles for consistency across platforms, added a new gcc-linux-armv8 profile, and removed legacy build scripts and utilities from the utils directory. Introduced Docker build context and documentation for containerized builds. Updated docs submodule reference. --- .dockerignore | 8 + ...-clang-arm64-release => apple-clang-armv8} | 3 +- ...clang-amd64-release => apple-clang-x86_64} | 3 +- cmake/profiles/gcc-linux-armv8 | 9 + ...c-linux-amd64-release => gcc-linux-x86_64} | 1 - ...msvc-194-amd64-release => msvc-194-x86_64} | 1 - docs | 2 +- utils/boost_1.70_gcc_8.patch | 15 -- utils/build_mail.py | 36 --- utils/build_script_linux.sh | 147 ----------- utils/build_script_linux_appimage.sh | 159 ------------ utils/build_script_mac_osx.sh | 197 --------------- utils/build_script_windows.bat | 236 ------------------ utils/configure_local_paths.cmd.example | 13 - utils/configure_local_paths_msvs2019.cmd | 9 - utils/configure_macos_xcodeproj.sh | 19 -- utils/configure_win32_msvs2015_gui.cmd | 7 - utils/configure_win64_msvs2013_gui.cmd | 7 - utils/configure_win64_msvs2015_gui.cmd | 7 - utils/configure_win64_msvs2017_gui.cmd | 7 - .../configure_win64_msvs2017_gui_testnet.cmd | 7 - .../configure_win64_msvs2019_gui_testnet.cmd | 7 - utils/configure_win64_msvs2022_gui.cmd | 7 - .../configure_win64_msvs2022_gui_testnet.cmd | 7 - utils/docker/containers/README.md | 5 + utils/docker/images/lthn-chain/Dockerfile | 59 +++++ utils/gpg/zoidberg.asc | 52 ---- utils/macosx_build_config.command | 12 - utils/macosx_build_uploader.sh | 51 ---- utils/macosx_fix_boost_libs_path.sh | 63 ----- utils/macosx_fixup.sh | 28 --- 31 files changed, 84 insertions(+), 1100 deletions(-) create mode 100644 .dockerignore rename cmake/profiles/{apple-clang-arm64-release => apple-clang-armv8} (69%) rename cmake/profiles/{apple-clang-amd64-release => apple-clang-x86_64} (69%) create mode 100644 cmake/profiles/gcc-linux-armv8 rename cmake/profiles/{gcc-linux-amd64-release => gcc-linux-x86_64} (88%) rename cmake/profiles/{msvc-194-amd64-release => msvc-194-x86_64} (89%) delete mode 100644 utils/boost_1.70_gcc_8.patch delete mode 100644 utils/build_mail.py delete mode 100755 utils/build_script_linux.sh delete mode 100755 utils/build_script_linux_appimage.sh delete mode 100755 utils/build_script_mac_osx.sh delete mode 100644 utils/build_script_windows.bat delete mode 100644 utils/configure_local_paths.cmd.example delete mode 100644 utils/configure_local_paths_msvs2019.cmd delete mode 100755 utils/configure_macos_xcodeproj.sh delete mode 100644 utils/configure_win32_msvs2015_gui.cmd delete mode 100644 utils/configure_win64_msvs2013_gui.cmd delete mode 100644 utils/configure_win64_msvs2015_gui.cmd delete mode 100644 utils/configure_win64_msvs2017_gui.cmd delete mode 100644 utils/configure_win64_msvs2017_gui_testnet.cmd delete mode 100644 utils/configure_win64_msvs2019_gui_testnet.cmd delete mode 100644 utils/configure_win64_msvs2022_gui.cmd delete mode 100644 utils/configure_win64_msvs2022_gui_testnet.cmd create mode 100644 utils/docker/containers/README.md create mode 100644 utils/docker/images/lthn-chain/Dockerfile delete mode 100644 utils/gpg/zoidberg.asc delete mode 100644 utils/macosx_build_config.command delete mode 100644 utils/macosx_build_uploader.sh delete mode 100644 utils/macosx_fix_boost_libs_path.sh delete mode 100644 utils/macosx_fixup.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..a67bd21f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +build +.github +.idea +docs +resources +snap +tests +CMakeUserPresets.json \ No newline at end of file diff --git a/cmake/profiles/apple-clang-arm64-release b/cmake/profiles/apple-clang-armv8 similarity index 69% rename from cmake/profiles/apple-clang-arm64-release rename to cmake/profiles/apple-clang-armv8 index d8325998..72a0c026 100644 --- a/cmake/profiles/apple-clang-arm64-release +++ b/cmake/profiles/apple-clang-armv8 @@ -4,7 +4,6 @@ arch=armv8 compiler=apple-clang compiler.version=13 compiler.libcxx=libc++ -build_type=Release [conf] - +tools.cmake.cmaketoolchain:user_presets=False diff --git a/cmake/profiles/apple-clang-amd64-release b/cmake/profiles/apple-clang-x86_64 similarity index 69% rename from cmake/profiles/apple-clang-amd64-release rename to cmake/profiles/apple-clang-x86_64 index 0a367dcb..adda230c 100644 --- a/cmake/profiles/apple-clang-amd64-release +++ b/cmake/profiles/apple-clang-x86_64 @@ -4,7 +4,6 @@ arch=x86_64 compiler=apple-clang compiler.version=13 compiler.libcxx=libc++ -build_type=Release [conf] - +tools.cmake.cmaketoolchain:user_presets=False \ No newline at end of file diff --git a/cmake/profiles/gcc-linux-armv8 b/cmake/profiles/gcc-linux-armv8 new file mode 100644 index 00000000..48e1521c --- /dev/null +++ b/cmake/profiles/gcc-linux-armv8 @@ -0,0 +1,9 @@ +[settings] +os=Linux +arch=armv8 +compiler=gcc +compiler.version=11 +compiler.libcxx=libstdc++11 + +[conf] +tools.cmake.cmaketoolchain:user_presets=False diff --git a/cmake/profiles/gcc-linux-amd64-release b/cmake/profiles/gcc-linux-x86_64 similarity index 88% rename from cmake/profiles/gcc-linux-amd64-release rename to cmake/profiles/gcc-linux-x86_64 index 94317ee6..4a58979e 100644 --- a/cmake/profiles/gcc-linux-amd64-release +++ b/cmake/profiles/gcc-linux-x86_64 @@ -4,7 +4,6 @@ arch=x86_64 compiler=gcc compiler.version=11 compiler.libcxx=libstdc++11 -build_type=Release [conf] tools.cmake.cmaketoolchain:user_presets=False diff --git a/cmake/profiles/msvc-194-amd64-release b/cmake/profiles/msvc-194-x86_64 similarity index 89% rename from cmake/profiles/msvc-194-amd64-release rename to cmake/profiles/msvc-194-x86_64 index 52b8722a..aea65d04 100644 --- a/cmake/profiles/msvc-194-amd64-release +++ b/cmake/profiles/msvc-194-x86_64 @@ -1,6 +1,5 @@ [settings] arch=x86_64 -build_type=Release compiler=msvc compiler.cppstd=17 compiler.runtime=static diff --git a/docs b/docs index a9e0a8a8..93d4f46c 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit a9e0a8a8fb8ce0c97dc0ea01698efdd65ee0137f +Subproject commit 93d4f46cdac8ba499cbb2d7819a472d66e209127 diff --git a/utils/boost_1.70_gcc_8.patch b/utils/boost_1.70_gcc_8.patch deleted file mode 100644 index 812eed14..00000000 --- a/utils/boost_1.70_gcc_8.patch +++ /dev/null @@ -1,15 +0,0 @@ -# This patch fixes compilation issue in Boost 1.70-1.71 while it is being compiled by GCC ver >= 8.3 -# -- sowle -# see also: https://github.com/boostorg/thread/pull/297 -# ---- boost/thread/pthread/thread_data.hpp.orig 2023-10-10 20:22:30.860192033 +0000 -+++ boost/thread/pthread/thread_data.hpp 2023-10-10 18:19:22.460764089 +0000 -@@ -57,7 +57,7 @@ - #else - std::size_t page_size = ::sysconf( _SC_PAGESIZE); - #endif --#if PTHREAD_STACK_MIN > 0 -+#ifdef PTHREAD_STACK_MIN - if (size ") - exit(1) - -msg = EmailMessage() -msg['Subject'] = sys.argv[1] -msg['From'] = zs_from -msg['To'] = sys.argv[2] -msg.add_header('Content-Type','text/html') -msg.set_payload(sys.argv[3]) - -s = smtplib.SMTP(zs_addr, zs_port) -s.starttls() -s.login(zs_user, zs_pass) -s.send_message(msg) -s.quit() - -print("e-mail sent.") diff --git a/utils/build_script_linux.sh b/utils/build_script_linux.sh deleted file mode 100755 index 96bf6ea0..00000000 --- a/utils/build_script_linux.sh +++ /dev/null @@ -1,147 +0,0 @@ -#!/bin/bash -x - -# Environment prerequisites: -# 1) QT_PREFIX_PATH should be set to Qt libs folder -# 2) BOOST_ROOT should be set to the root of Boost -# 3) OPENSSL_ROOT_DIR should be set to the root of OpenSSL -# -# for example, place these lines to the end of your ~/.bashrc : -# -# export BOOST_ROOT=/home/user/boost_1_66_0 -# export QT_PREFIX_PATH=/home/user/Qt5.10.1/5.10.1/gcc_64 -# export OPENSSL_ROOT_DIR=/home/user/openssl - -ARCHIVE_NAME_PREFIX=zano-linux-x64- - -: "${BOOST_ROOT:?BOOST_ROOT should be set to the root of Boost, ex.: /home/user/boost_1_66_0}" -: "${QT_PREFIX_PATH:?QT_PREFIX_PATH should be set to Qt libs folder, ex.: /home/user/Qt5.10.1/5.10.1/gcc_64}" -: "${OPENSSL_ROOT_DIR:?OPENSSL_ROOT_DIR should be set to OpenSSL root folder, ex.: /home/user/openssl}" - -if [ -n "$build_prefix" ]; then - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}${build_prefix}- - build_prefix_label="$build_prefix " -fi - -if [ "$testnet" == true ]; then - testnet_def="-D TESTNET=TRUE" - testnet_label="testnet " - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}testnet- -fi - -if [ "$testnet" == true ] || [ -n "$qt_dev_tools" ]; then - copy_qt_dev_tools=true - copy_qt_dev_tools_label="devtools " - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}devtools- -fi - - -prj_root=$(pwd) - -echo "---------------- BUILDING PROJECT ----------------" -echo "--------------------------------------------------" - -echo "Building...." - -rm -rf build; mkdir -p build/release; cd build/release; -cmake $testnet_def -D STATIC=true -D ARCH=x86-64 -D BUILD_GUI=TRUE -D OPENSSL_ROOT_DIR="$OPENSSL_ROOT_DIR" -D CMAKE_PREFIX_PATH="$QT_PREFIX_PATH" -D CMAKE_BUILD_TYPE=Release ../.. -if [ $? -ne 0 ]; then - echo "Failed to run cmake" - exit 1 -fi - -make -j2 daemon simplewallet connectivity_tool -if [ $? -ne 0 ]; then - echo "Failed to make!" - exit 1 -fi - -make -j1 Zano -if [ $? -ne 0 ]; then - echo "Failed to make!" - exit 1 -fi - - -read version_str <<< $(./src/zanod --version | awk '/^Zano/ { print $2 }') -version_str=${version_str} -echo $version_str - -rm -rf Zano; -mkdir -p Zano; - -rsync -a ../../src/gui/qt-daemon/layout/html ./Zano --exclude less --exclude package.json --exclude gulpfile.js -cp -Rv ../../utils/Zano.sh ./Zano -chmod 777 ./Zano/Zano.sh -mkdir ./Zano/lib -cp $QT_PREFIX_PATH/lib/libicudata.so.56 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libicui18n.so.56 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libicuuc.so.56 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Core.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5DBus.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Gui.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Network.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5OpenGL.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Positioning.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5PrintSupport.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Qml.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Quick.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Sensors.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Sql.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5Widgets.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5WebEngine.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5WebEngineCore.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5WebEngineWidgets.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5WebChannel.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5XcbQpa.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/lib/libQt5QuickWidgets.so.5 ./Zano/lib -cp $QT_PREFIX_PATH/libexec/QtWebEngineProcess ./Zano -cp $QT_PREFIX_PATH/resources/qtwebengine_resources.pak ./Zano -cp $QT_PREFIX_PATH/resources/qtwebengine_resources_100p.pak ./Zano -cp $QT_PREFIX_PATH/resources/qtwebengine_resources_200p.pak ./Zano -cp $QT_PREFIX_PATH/resources/icudtl.dat ./Zano - -if [ "$copy_qt_dev_tools" = true ] ; then - cp $QT_PREFIX_PATH/resources/qtwebengine_devtools_resources.pak ./Zano -fi - -mkdir ./Zano/lib/platforms -cp $QT_PREFIX_PATH/plugins/platforms/libqxcb.so ./Zano/lib/platforms -mkdir ./Zano/xcbglintegrations -cp $QT_PREFIX_PATH/plugins/xcbglintegrations/libqxcb-glx-integration.so ./Zano/xcbglintegrations - -cp -Rv src/zanod src/Zano src/simplewallet src/connectivity_tool ./Zano - -package_filename=${ARCHIVE_NAME_PREFIX}${version_str}.tar.bz2 - -rm -f ./$package_filename -tar -cjvf $package_filename Zano -if [ $? -ne 0 ]; then - echo "Failed to pack" - exit 1 -fi - -echo "Build success" - -if [ -z "$upload_build" ]; then - exit 0 -fi - -echo "Uploading..." - -scp $package_filename zano_build_server:/var/www/html/builds -if [ $? -ne 0 ]; then - echo "Failed to upload to remote server" - exit $? -fi - -read checksum <<< $(sha256sum $package_filename | awk '/^/ { print $1 }' ) - -mail_msg="New ${build_prefix_label}${testnet_label}${copy_qt_dev_tools_label}build for linux-x64:
-
https://build.zano.org/builds/$package_filename
-sha256: $checksum" - -echo "$mail_msg" - -python3 ../../utils/build_mail.py "Zano linux-x64 ${build_prefix_label}${testnet_label}${copy_qt_dev_tools_label}build $version_str" "${emails}" "$mail_msg" - -exit 0 diff --git a/utils/build_script_linux_appimage.sh b/utils/build_script_linux_appimage.sh deleted file mode 100755 index 21ffc53e..00000000 --- a/utils/build_script_linux_appimage.sh +++ /dev/null @@ -1,159 +0,0 @@ -#!/bin/bash -x - -# Environment prerequisites: -# 1) QT_PREFIX_PATH should be set to Qt libs folder -# 2) BOOST_ROOT should be set to the root of Boost -# 3) OPENSSL_ROOT_DIR should be set to the root of OpenSSL -# -# for example, place these lines to the end of your ~/.bashrc : -# -# export BOOST_ROOT=/home/user/boost_1_66_0 -# export QT_PREFIX_PATH=/home/user/Qt5.10.1/5.10.1/gcc_64 -# export OPENSSL_ROOT_DIR=/home/user/openssl -# export LINUX_DEPLOY_QT=/home/user/QtDeployment.appimage -# export LINUX_APPIMAGE_TOOL=/home/user/AppImageTool.appimage - - -ARCHIVE_NAME_PREFIX=zano-linux-x64- - -: "${BOOST_ROOT:?BOOST_ROOT should be set to the root of Boost, ex.: /home/user/boost_1_66_0}" -: "${QT_PREFIX_PATH:?QT_PREFIX_PATH should be set to Qt libs folder, ex.: /home/user/Qt5.10.1/5.10.1/gcc_64}" -: "${OPENSSL_ROOT_DIR:?OPENSSL_ROOT_DIR should be set to OpenSSL root folder, ex.: /home/user/openssl}" - -if [ -n "$build_prefix" ]; then - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}${build_prefix}- - build_prefix_label="$build_prefix " -fi - -if [ "$testnet" == true ]; then - testnet_def="-D TESTNET=TRUE" - testnet_label="testnet " - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}testnet- -fi - -if [ "$testnet" == true ] || [ -n "$qt_dev_tools" ]; then - copy_qt_dev_tools=true - copy_qt_dev_tools_label="devtools " - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}devtools- -fi - - -prj_root=$(pwd) - -if [ "$1" == "skip_build" ]; then - echo "Skipping build, only packing..." - cd build/release; -else -echo "---------------- BUILDING PROJECT ----------------" -echo "--------------------------------------------------" - -echo "Building...." - -rm -rf build; mkdir -p build/release; -cd build/release; -cmake $testnet_def -D STATIC=true -D ARCH=x86-64 -D DISABLE_TOR=TRUE -D BUILD_GUI=TRUE -D OPENSSL_ROOT_DIR="$OPENSSL_ROOT_DIR" -D CMAKE_PREFIX_PATH="$QT_PREFIX_PATH" -D CMAKE_BUILD_TYPE=Release ../.. -if [ $? -ne 0 ]; then - echo "Failed to run cmake" - exit 1 -fi - -make -j2 daemon simplewallet connectivity_tool -if [ $? -ne 0 ]; then - echo "Failed to make!" - exit 1 -fi - -make -j1 Zano -if [ $? -ne 0 ]; then - echo "Failed to make!" - exit 1 -fi - -fi - - - -read version_str <<< $(./src/zanod --version | awk '/^Zano/ { print $2 }') -version_str=${version_str} - -read commit_str <<< $(./src/zanod --version | grep -m 1 -P -o "(?<=\[)[0-9a-f]{7}") -commit_str=${commit_str} - -echo $version_str -echo $commit_str - - -rm -rf Zano; -mkdir -p Zano/usr/bin; -mkdir -p Zano/usr/lib; -mkdir -p Zano/usr/share/applications; -mkdir -p Zano/usr/share/icons/hicolor/scalable/apps; -mkdir -p Zano/usr/share/icons/hicolor/256x256/apps; - - -rsync -a ../../src/gui/qt-daemon/layout/html ./Zano/usr/bin --exclude less --exclude package.json --exclude gulpfile.js - -cp -Rv src/zanod src/Zano src/simplewallet src/connectivity_tool ./Zano/usr/bin -cp -Rv ../../utils/Zano.desktop ./Zano/usr/share/applications/Zano.desktop -cp -Rv ../../resources/app_icon.svg ./Zano/usr/share/icons/hicolor/scalable/apps/Zano.svg -cp -Rv ../../resources/app_icon_256.png ./Zano/usr/share/icons/hicolor/256x256/apps/Zano.png - - -echo "Exec=$prj_root/build/release/Zano/usr/bin/Zano" >> ./Zano/usr/share/applications/Zano.desktop -if [ $? -ne 0 ]; then - echo "Failed to append deskyop file" - exit 1 -fi - -$LINUX_DEPLOY_QT ./Zano/usr/share/applications/Zano.desktop -qmake=$QT_PREFIX_PATH/bin/qmake -if [ $? -ne 0 ]; then - echo "Failed to run linuxqtdeployment" - exit 1 -fi - -rm -f $prj_root/build/release/Zano/AppRun -cp -Rv ../../utils/Zano_appimage_wrapper.sh $prj_root/build/release/Zano/AppRun - -package_filename=${ARCHIVE_NAME_PREFIX}${version_str}.AppImage - -$LINUX_APPIMAGE_TOOL ./Zano ./$package_filename -if [ $? -ne 0 ]; then - echo "Failed to run appimagetool" - exit 1 -fi - - - - -#pattern="*.AppImage" -#files=( $pattern ) -#app_image_file=${files[0]} - - -#mv ./$app_image_file ./$package_filename - -echo "Build success" - -if [ -z "$upload_build" ]; then - exit 0 -fi - -echo "Uploading..." - -scp $package_filename zano_build_server:/var/www/html/builds -if [ $? -ne 0 ]; then - echo "Failed to upload to remote server" - exit $? -fi - -read checksum <<< $(sha256sum $package_filename | awk '/^/ { print $1 }' ) - -mail_msg="New ${build_prefix_label}${testnet_label}${copy_qt_dev_tools_label}build for linux-x64:
-https://build.zano.org/builds/$package_filename
-sha256: $checksum" - -echo "$mail_msg" - -python3 ../../utils/build_mail.py "Zano linux-x64 ${build_prefix_label}${testnet_label}${copy_qt_dev_tools_label}build $version_str" "${emails}" "$mail_msg" - -exit 0 diff --git a/utils/build_script_mac_osx.sh b/utils/build_script_mac_osx.sh deleted file mode 100755 index 79d74827..00000000 --- a/utils/build_script_mac_osx.sh +++ /dev/null @@ -1,197 +0,0 @@ -set -x # echo on -set +e # switch off exit on error -curr_path=${BASH_SOURCE%/*} - -# check that all the required environment vars are set -: "${ZANO_QT_PATH:?variable not set, see also macosx_build_config.command}" -: "${ZANO_BOOST_ROOT:?variable not set, see also macosx_build_config.command}" -: "${ZANO_BOOST_LIBS_PATH:?variable not set, see also macosx_build_config.command}" -: "${ZANO_BUILD_DIR:?variable not set, see also macosx_build_config.command}" -: "${CMAKE_OSX_SYSROOT:?CMAKE_OSX_SYSROOT should be set to macOS SDK path, e.g.: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk}" -: "${OPENSSL_ROOT_DIR:?variable not set, see also macosx_build_config.command}" - -ARCHIVE_NAME_PREFIX=zano-macos-x64- - -if [ -n "$build_prefix" ]; then - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}${build_prefix}- - build_prefix_label="$build_prefix " -fi - -if [ "$testnet" == true ]; then - testnet_def="-D TESTNET=TRUE" - testnet_label="testnet " - ARCHIVE_NAME_PREFIX=${ARCHIVE_NAME_PREFIX}testnet- -fi - -######### DEBUG ########## -#cd "$ZANO_BUILD_DIR/release/src" -#rm *.dmg -#if false; then -##### end of DEBUG ###### - -rm -rf $ZANO_BUILD_DIR; mkdir -p "$ZANO_BUILD_DIR/release"; cd "$ZANO_BUILD_DIR/release" - -cmake $testnet_def -D OPENSSL_ROOT_DIR=$OPENSSL_ROOT_DIR -D CMAKE_OSX_SYSROOT=$CMAKE_OSX_SYSROOT -D BUILD_GUI=TRUE -D CMAKE_PREFIX_PATH="$ZANO_QT_PATH/clang_64" -D CMAKE_BUILD_TYPE=Release -D BOOST_ROOT="$ZANO_BOOST_ROOT" -D BOOST_LIBRARYDIR="$ZANO_BOOST_LIBS_PATH" ../.. -if [ $? -ne 0 ]; then - echo "Failed to cmake" - exit 1 -fi - - - -make -j Zano -if [ $? -ne 0 ]; then - echo "Failed to make Zano" - exit 1 -fi - -make -j connectivity_tool daemon simplewallet -if [ $? -ne 0 ]; then - echo "Failed to make binaries!" - exit 1 -fi - - -cd src/ -if [ $? -ne 0 ]; then - echo "Failed to cd src" - exit 1 -fi - -# copy all necessary libs into the bundle in order to workaround El Capitan's SIP restrictions -mkdir -p Zano.app/Contents/Frameworks/boost_libs -cp -R $ZANO_BOOST_LIBS_PATH/*.dylib Zano.app/Contents/Frameworks/boost_libs/ -if [ $? -ne 0 ]; then - echo "Failed to cp workaround to MacOS" - exit 1 -fi - -# rename process name to big letter -mv Zano.app/Contents/MacOS/zano Zano.app/Contents/MacOS/Zano -if [ $? -ne 0 ]; then - echo "Failed to rename process" - exit 1 -fi - -cp zanod simplewallet Zano.app/Contents/MacOS/ -if [ $? -ne 0 ]; then - echo "Failed to copy binaries to Zano.app folder" - exit 1 -fi - -# fix boost libs paths in main executable and libs to workaround El Capitan's SIP restrictions -source ../../../utils/macosx_fix_boost_libs_path.sh -fix_boost_libs_in_binary @executable_path/../Frameworks/boost_libs Zano.app/Contents/MacOS/Zano -fix_boost_libs_in_binary @executable_path/../Frameworks/boost_libs Zano.app/Contents/MacOS/simplewallet -fix_boost_libs_in_binary @executable_path/../Frameworks/boost_libs Zano.app/Contents/MacOS/zanod -#fix_boost_libs_in_libs @executable_path/../Frameworks/boost_libs Zano.app/Contents/Frameworks/boost_libs - - -"$ZANO_QT_PATH/clang_64/bin/macdeployqt" Zano.app -if [ $? -ne 0 ]; then - echo "Failed to macdeployqt Zano.app" - exit 1 -fi - - -rm -rf Zano.app/Contents/Frameworks/libboost*.dylib - - -rsync -a ../../../src/gui/qt-daemon/layout/html Zano.app/Contents/MacOS --exclude less --exclude package.json --exclude gulpfile.js -if [ $? -ne 0 ]; then - echo "Failed to cp html to MacOS" - exit 1 -fi - -cp ../../../src/gui/qt-daemon/app.icns Zano.app/Contents/Resources -if [ $? -ne 0 ]; then - echo "Failed to cp app.icns to resources" - exit 1 -fi - -codesign -s "Developer ID Application: Zano Limited" --timestamp --options runtime -f --entitlements ../../../utils/macos_entitlements.plist --deep ./Zano.app -if [ $? -ne 0 ]; then - echo "Failed to sign Zano.app" - exit 1 -fi - - -read version_str <<< $(DYLD_LIBRARY_PATH=$ZANO_BOOST_LIBS_PATH ./connectivity_tool --version | awk '/^Zano/ { print $2 }') -version_str=${version_str} -echo $version_str - - -echo "############### Prepearing archive... ################" -mkdir package_folder -if [ $? -ne 0 ]; then - echo "Failed to zip app" - exit 1 -fi - -mv Zano.app package_folder -if [ $? -ne 0 ]; then - echo "Failed to top app package" - exit 1 -fi - -#fi - -package_filename=${ARCHIVE_NAME_PREFIX}${version_str}.dmg - -source ../../../utils/macosx_dmg_builder.sh -build_fancy_dmg package_folder $package_filename -if [ $? -ne 0 ]; then - echo "Failed to create fancy dmg" - exit 1 -fi - -echo "Build success" - -echo "############### Uploading... ################" - -package_filepath="$(pwd)/$package_filename" - -#scp $package_filepath zano_build_server:/var/www/html/builds/ -source ../../../utils/macosx_build_uploader.sh -pushd . -upload_build $package_filepath -if [ $? -ne 0 ]; then - echo "Failed to upload to remote server" - exit 1 -fi -popd - - -read checksum <<< $( shasum -a 256 $package_filepath | awk '/^/ { print $1 }' ) - -mail_msg="New ${build_prefix_label}${testnet_label}build for macOS-x64:
-https://build.zano.org/builds/$package_filename
-sha256: $checksum" - -echo "$mail_msg" - -python3 ../../../utils/build_mail.py "Zano macOS-x64 ${build_prefix_label}${testnet_label}build $version_str" "${emails}" "$mail_msg" - -###################### -# notarization -###################### - -cd package_folder - -echo "Notarizing..." - -# creating archive for notarizing -echo "Creating archive for notarizing" -rm -f Zano.zip -/usr/bin/ditto -c -k --keepParent ./Zano.app ./Zano.zip - -tmpfile="tmptmptmp" -#xcrun altool --notarize-app --primary-bundle-id "org.zano.desktop" -u "andrey@zano.org" -p "@keychain:Developer-altool" --file ./Zano.zip > $tmpfile 2>&1 -xcrun notarytool submit --wait --keychain-profile "notarytool-password" ./Zano.zip -RETURN=$? -if [ $RETURN -ne 0 ]; then - echo "Failed to submit for notarization or notarization failed, error code $RETURN" - exit 1 -fi - -echo "Notarization done" diff --git a/utils/build_script_windows.bat b/utils/build_script_windows.bat deleted file mode 100644 index fcd8fe53..00000000 --- a/utils/build_script_windows.bat +++ /dev/null @@ -1,236 +0,0 @@ -call configure_local_paths.cmd - -;; MSVC version-specific paths -SET QT_MSVC_PATH=%QT_PREFIX_PATH%\msvc2017_64 - -SET ACHIVE_NAME_PREFIX=zano-win-x64- -SET MY_PATH=%~dp0 -SET SOURCES_PATH=%MY_PATH:~0,-7% - -IF NOT [%build_prefix%] == [] ( - SET ACHIVE_NAME_PREFIX=%ACHIVE_NAME_PREFIX%%build_prefix%- -) - -IF "%testnet%" == "true" ( - SET TESTNET_DEF=-D TESTNET=TRUE - SET TESTNET_LABEL=testnet - SET ACHIVE_NAME_PREFIX=%ACHIVE_NAME_PREFIX%testnet- -) - -SET PARAM=%~1 -IF "%PARAM%"=="--skip-build" ( GOTO skip_build ) - -@echo on - -set BOOST_ROOT=%LOCAL_BOOST_PATH% -set BOOST_LIBRARYDIR=%LOCAL_BOOST_LIB_PATH% - - - -@echo "---------------- PREPARING BINARIES ---------------------------" -@echo "---------------------------------------------------------------" - - - -cd %SOURCES_PATH% - -@echo "---------------- BUILDING APPLICATIONS ------------------------" -@echo "---------------------------------------------------------------" - - - - -rmdir build /s /q -mkdir build -cd build - -cmake %TESTNET_DEF% -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_MSVC_PATH%" -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib64-msvc-14.2" -G "Visual Studio 16 2019" -A x64 -T host=x64 .. -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - -call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat" x86_amd64 -echo on -cd %SOURCES_PATH%\build - -msbuild version.vcxproj /p:SubSystem="CONSOLE,5.02" /p:Configuration=Release /t:Build -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - -msbuild src/daemon.vcxproj /p:SubSystem="CONSOLE,5.02" /p:Configuration=Release /t:Build -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - -msbuild src/simplewallet.vcxproj /p:SubSystem="CONSOLE,5.02" /p:Configuration=Release /t:Build -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - -msbuild src/Zano.vcxproj /p:SubSystem="WINDOWS,5.02" /p:Configuration=Release /t:Build - -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - -@echo on -echo "sources are built successfully" - - - - -:skip_build -cd %SOURCES_PATH%/build - -set cmd=src\Release\simplewallet.exe --version -FOR /F "tokens=3" %%a IN ('%cmd%') DO set version=%%a -set version=%version:~0,-2% -echo '%version%' - -set build_zip_filename=%ACHIVE_NAME_PREFIX%%version%.zip -set build_zip_path=%BUILDS_PATH%\builds\%build_zip_filename% - -del /F /Q %build_zip_path% - -cd src\release - -call :sign_file Zano.exe || goto error -call :sign_file zanod.exe || goto error -call :sign_file simplewallet.exe || goto error - -@echo on - - -mkdir bunch - -copy /Y Zano.exe bunch -copy /Y zanod.exe bunch -copy /Y simplewallet.exe bunch -copy /Y *.pdb bunch - -%QT_MSVC_PATH%\bin\windeployqt.exe bunch\Zano.exe || goto error - -cd bunch - -zip -r %build_zip_path% *.* -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - -@echo "Add html" - -cd %SOURCES_PATH%\src\gui\qt-daemon\layout -zip -x html/package.json html/gulpfile.js html/less/* -r %build_zip_path% html -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - -@echo "Add runtime stuff" - - -cd %ETC_BINARIES_PATH% -zip -r %build_zip_path% *.* -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - -cd %SOURCES_PATH%\build -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - -@echo "---------------------------------------------------------------" -@echo "-------------------Building installer--------------------------" -@echo "---------------------------------------------------------------" - -mkdir installer_src - - -unzip -o %build_zip_path% -d installer_src -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - -"%INNOSETUP_PATH%" /dBinariesPath=../build/installer_src /DMyAppVersion=%version% /o%BUILDS_PATH%\builds\ /f%ACHIVE_NAME_PREFIX%%version%-installer ..\utils\setup_64.iss -IF %ERRORLEVEL% NEQ 0 ( - goto error -) - - -@echo "---------------------------------------------------------------" -@echo "---------------------------------------------------------------" - -set installer_file=%ACHIVE_NAME_PREFIX%%version%-installer.exe -set installer_path=%BUILDS_PATH%\builds\%installer_file% - -@echo " SIGNING the installer ...." - -call :sign_file %installer_path% || goto error - -@echo " UPLOADING TO SERVER ...." - -pscp -load zano_build_server %installer_path% %ZANO_BUILDS_HOST%:/var/www/html/builds -IF %ERRORLEVEL% NEQ 0 ( - @echo "FAILED TO UPLOAD EXE TO SERVER" - goto error -) -call :sha256 %installer_path% installer_checksum - -pscp -load zano_build_server %build_zip_path% %ZANO_BUILDS_HOST%:/var/www/html/builds -IF %ERRORLEVEL% NEQ 0 ( - @echo "FAILED TO UPLOAD ZIP TO SERVER" - goto error -) -call :sha256 %build_zip_path% build_zip_checksum - -set mail_msg="New %build_prefix% %TESTNET_LABEL%build for win-x64:
INST: https://build.zano.org/builds/%installer_file%
sha256: %installer_checksum%

ZIP: https://build.zano.org/builds/%build_zip_filename%
sha256: %build_zip_checksum%
" - -echo %mail_msg% - -python ../utils/build_mail.py "Zano win-x64 %build_prefix% %TESTNET_LABEL%build %version%" "%emails%" %mail_msg% - -goto success - -:error -echo "BUILD FAILED" -exit /B %ERRORLEVEL% - -:success -echo "BUILD SUCCESS" - -cd .. - -EXIT /B %ERRORLEVEL% - - -:: functions - -:sha256 -@setlocal enabledelayedexpansion -@set /a count=1 -@for /f "skip=1 delims=:" %%a in ('CertUtil -hashfile %1 SHA256') do @( - @if !count! equ 1 set "hash=%%a" - @set /a count+=1 -) -@( - @endlocal - @set "%2=%hash: =% -) -@exit /B 0 - - -:sign_file -@echo Signing %1... -@call %ZANO_SIGN_CMD% %1 -@if %ERRORLEVEL% neq 0 ( - @echo ERROR: failed to sign %1 - @exit /B 1 -) -@exit /B 0 diff --git a/utils/configure_local_paths.cmd.example b/utils/configure_local_paths.cmd.example deleted file mode 100644 index 65c5e891..00000000 --- a/utils/configure_local_paths.cmd.example +++ /dev/null @@ -1,13 +0,0 @@ -@echo off -rem -rem This file contains local path settings for your own personal dev environment. -rem Rename to configure_local_paths.cmd and do not commit. -rem - -set QT_PREFIX_PATH=C:\dev\_sdk\Qt5.11.2\5.11.2 -set INNOSETUP_PATH=C:\Program Files (x86)\Inno Setup 5\ISCC.exe -set ETC_BINARIES_PATH=C:\dev\deploy\etc-binaries -set BUILDS_PATH=C:\dev\deploy\zano -set LOCAL_BOOST_PATH=C:\dev\_sdk\boost_1_70_0 -set OPENSSL_ROOT_DIR=C:\dev\_sdk\OpenSSL-Win64 -set BOOST_ROOT=%LOCAL_BOOST_PATH% diff --git a/utils/configure_local_paths_msvs2019.cmd b/utils/configure_local_paths_msvs2019.cmd deleted file mode 100644 index fa277065..00000000 --- a/utils/configure_local_paths_msvs2019.cmd +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -rem -rem This file contains local path settings for your own personal dev environment. -rem Rename to configure_local_paths.cmd and do not commit. -rem - -set QT_PREFIX_PATH=C:\dev\_sdk\Qt5.15.2\5.15.2 -set BOOST_ROOT=C:\dev\_sdk\boost_1_77_0 -set OPENSSL_ROOT_DIR=C:\dev\_sdk\OpenSSL-Win64 diff --git a/utils/configure_macos_xcodeproj.sh b/utils/configure_macos_xcodeproj.sh deleted file mode 100755 index 394689d4..00000000 --- a/utils/configure_macos_xcodeproj.sh +++ /dev/null @@ -1,19 +0,0 @@ -set -x #echo on -curr_path=${BASH_SOURCE%/*} - -# check that all the required environment vars are set -: "${ZANO_QT_PATH:?variable not set, see also macosx_build_config.command}" -: "${ZANO_BOOST_ROOT:?variable not set, see also macosx_build_config.command}" -: "${ZANO_BOOST_LIBS_PATH:?variable not set, see also macosx_build_config.command}" -: "${ZANO_BUILD_DIR:?variable not set, see also macosx_build_config.command}" -: "${CMAKE_OSX_SYSROOT:?CMAKE_OSX_SYSROOT should be set to macOS SDK path, e.g.: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.13.sdk}" - -BUILD_DIR=$curr_path/../$ZANO_BUILD_DIR/macos_xcodeproj -BUILD_TYPE=Release - -rm -rf $BUILD_DIR -mkdir -p "$BUILD_DIR/$BUILD_TYPE" -cd "$BUILD_DIR/$BUILD_TYPE" - -cmake -D BUILD_GUI=TRUE -D CMAKE_PREFIX_PATH="$ZANO_QT_PATH/clang_64" -D CMAKE_BUILD_TYPE=$BUILD_TYPE -D BOOST_ROOT="$ZANO_BOOST_ROOT" -D BOOST_LIBRARYDIR="$ZANO_BOOST_LIBS_PATH" -G Xcode ../../.. - diff --git a/utils/configure_win32_msvs2015_gui.cmd b/utils/configure_win32_msvs2015_gui.cmd deleted file mode 100644 index f0a84e32..00000000 --- a/utils/configure_win32_msvs2015_gui.cmd +++ /dev/null @@ -1,7 +0,0 @@ -call configure_local_paths.cmd - -cd .. -@mkdir build_msvc2015_32 -cd build_msvc2015_32 - -cmake -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_PREFIX_PATH%"\msvc2015 -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib32-msvc-14.0" -G "Visual Studio 14 2015" ".." diff --git a/utils/configure_win64_msvs2013_gui.cmd b/utils/configure_win64_msvs2013_gui.cmd deleted file mode 100644 index 3e8a8b82..00000000 --- a/utils/configure_win64_msvs2013_gui.cmd +++ /dev/null @@ -1,7 +0,0 @@ -call configure_local_paths.cmd - -cd .. -@mkdir build_msvc2013_64 -cd build_msvc2013_64 - -cmake -D BUILD_TESTS=TRUE -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_PREFIX_PATH%"\msvc2013_64 -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib64-msvc-12.0" -G "Visual Studio 12 2013 Win64" ".." \ No newline at end of file diff --git a/utils/configure_win64_msvs2015_gui.cmd b/utils/configure_win64_msvs2015_gui.cmd deleted file mode 100644 index d365843e..00000000 --- a/utils/configure_win64_msvs2015_gui.cmd +++ /dev/null @@ -1,7 +0,0 @@ -call configure_local_paths.cmd - -cd .. -@mkdir build_msvc2015_64 -cd build_msvc2015_64 - -cmake -D USE_PCH=TRUE -D BUILD_TESTS=TRUE -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_PREFIX_PATH%"\msvc2015_64 -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib64-msvc-14.0" -G "Visual Studio 14 2015 Win64" -T host=x64 ".." \ No newline at end of file diff --git a/utils/configure_win64_msvs2017_gui.cmd b/utils/configure_win64_msvs2017_gui.cmd deleted file mode 100644 index 7b887d75..00000000 --- a/utils/configure_win64_msvs2017_gui.cmd +++ /dev/null @@ -1,7 +0,0 @@ -call configure_local_paths.cmd - -cd .. -@mkdir build_msvc2017_64 -cd build_msvc2017_64 - -cmake -D USE_PCH=TRUE -D BUILD_TESTS=TRUE -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_PREFIX_PATH%"\msvc2017_64 -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib64-msvc-14.1" -G "Visual Studio 15 2017 Win64" -T host=x64 ".." \ No newline at end of file diff --git a/utils/configure_win64_msvs2017_gui_testnet.cmd b/utils/configure_win64_msvs2017_gui_testnet.cmd deleted file mode 100644 index 61d34790..00000000 --- a/utils/configure_win64_msvs2017_gui_testnet.cmd +++ /dev/null @@ -1,7 +0,0 @@ -call configure_local_paths.cmd - -cd .. -@mkdir build_msvc2017_64_tn -cd build_msvc2017_64_tn - -cmake -D TESTNET=TRUE -D USE_PCH=TRUE -D BUILD_TESTS=TRUE -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_PREFIX_PATH%"\msvc2017_64 -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib64-msvc-14.1" -G "Visual Studio 15 2017 Win64" -T host=x64 ".." \ No newline at end of file diff --git a/utils/configure_win64_msvs2019_gui_testnet.cmd b/utils/configure_win64_msvs2019_gui_testnet.cmd deleted file mode 100644 index afc14035..00000000 --- a/utils/configure_win64_msvs2019_gui_testnet.cmd +++ /dev/null @@ -1,7 +0,0 @@ -call configure_local_paths_msvs2019.cmd - -cd .. -@mkdir build_msvc2019_64_tn -cd build_msvc2019_64_tn - -cmake -D TESTNET=TRUE -D USE_PCH=TRUE -D BUILD_TESTS=TRUE -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_PREFIX_PATH%"\msvc2019_64 -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib64-msvc-14.2" -G "Visual Studio 16 2019" -A x64 -T host=x64 ".." diff --git a/utils/configure_win64_msvs2022_gui.cmd b/utils/configure_win64_msvs2022_gui.cmd deleted file mode 100644 index b5dcbbf5..00000000 --- a/utils/configure_win64_msvs2022_gui.cmd +++ /dev/null @@ -1,7 +0,0 @@ -call configure_local_paths_msvs2022.cmd - -cd .. -@mkdir build_msvc2022_64 -cd build_msvc2022_64 - -cmake -D TESTNET=FALSE -D USE_PCH=TRUE -D BUILD_TESTS=TRUE -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_PREFIX_PATH%"\msvc2019_64 -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib64-msvc-14.3" -G "Visual Studio 17 2022" -A x64 -T host=x64 ".." diff --git a/utils/configure_win64_msvs2022_gui_testnet.cmd b/utils/configure_win64_msvs2022_gui_testnet.cmd deleted file mode 100644 index f41547c3..00000000 --- a/utils/configure_win64_msvs2022_gui_testnet.cmd +++ /dev/null @@ -1,7 +0,0 @@ -call configure_local_paths_msvs2022.cmd - -cd .. -@mkdir build_msvc2022_64_tn -cd build_msvc2022_64_tn - -cmake -D TESTNET=TRUE -D USE_PCH=TRUE -D BUILD_TESTS=TRUE -D OPENSSL_ROOT_DIR="%OPENSSL_ROOT_DIR%" -D CMAKE_PREFIX_PATH="%QT_PREFIX_PATH%"\msvc2019_64 -D BUILD_GUI=TRUE -D STATIC=FALSE -DBOOST_ROOT="%BOOST_ROOT%" -DBOOST_LIBRARYDIR="%BOOST_ROOT%\lib64-msvc-14.3" -G "Visual Studio 17 2022" -A x64 -T host=x64 ".." diff --git a/utils/docker/containers/README.md b/utils/docker/containers/README.md new file mode 100644 index 00000000..f50dbf2b --- /dev/null +++ b/utils/docker/containers/README.md @@ -0,0 +1,5 @@ +# Standard Docker Deployments + +You can define a multitude of configurations in code using Docker Compose. Each folder in this directory represents a specific use case with a corresponding reference configuration. + +Instead of writing your own Dockerfile, we recommend that you tailor the stack for your needs by editing one of the existing configurations. If you believe your changes will be useful to others, please submit a patch to improve the reference Dockerfiles. \ No newline at end of file diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile new file mode 100644 index 00000000..d291df97 --- /dev/null +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -0,0 +1,59 @@ +# This is a multi target docker image +FROM ubuntu:24.04 AS builder +LABEL authors="snider" + +ARG THREADS=1 +ARG BUILD_BRANCH=dev-configure-testnet-1 +ARG BUILD_LOCAL=1 +ARG BUILD_REPO=https://github.com/letheanVPN/blockchain.git +ARG BUILD_TARGET=gcc-linux-arm64 +ARG BUILD_FOLDER=build/release +ARG BUILD_TYPE=Release +ARG BUILD_TESTNET=0 + + +ENV CONAN_HOME=/root/sdk +ENV BUILD_TARGET=${BUILD_TARGET} + +RUN apt update && apt -y upgrade + +RUN apt install -y build-essential pkgconf \ + curl ca-certificates \ + g++ llvm clang lld cmake \ + git python3 python3-pip xz-utils gperf + +RUN pip3 install conan --break-system-packages + +WORKDIR / + +# Copy the build context. +COPY . /tmp/local-src +RUN if [ "$BUILD_LOCAL" = "1" ]; then \ + mv /tmp/local-src /code; \ + else \ + rm -rf /tmp/local-src; \ + git clone --recursive --branch ${BUILD_BRANCH} ${BUILD_REPO} code; \ + fi + +WORKDIR /code + +RUN conan profile detect --name=default --force + +RUN conan install . --output-folder=${BUILD_FOLDER} --build=missing -s build_type=${BUILD_TYPE} -pr:h=/code/cmake/profiles/$BUILD_TARGET + +RUN cmake -S /code -B ${BUILD_FOLDER} -DCMAKE_TOOLCHAIN_FILE=${BUILD_FOLDER}/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DTESTNET=${BUILD_TESTNET} + +RUN cmake --build ${BUILD_FOLDER} --config=${BUILD_TYPE} --parallel=${THREADS} + + +FROM scratch AS build-cache +COPY --from=builder ${CONAN_HOME} / + +FROM scratch AS build-artifacts +COPY --from=builder /code/build/release/src/lethean-* / + +#FROM ubuntu:24.04 AS chain-service +# +#COPY --from=build-artifacts --chmod=+x / /bin +# +#RUN lethean-testnet-chain-node --help diff --git a/utils/gpg/zoidberg.asc b/utils/gpg/zoidberg.asc deleted file mode 100644 index 77dde383..00000000 --- a/utils/gpg/zoidberg.asc +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -0588HZ6Q -=Esla ------END PGP PUBLIC KEY BLOCK----- diff --git a/utils/macosx_build_config.command b/utils/macosx_build_config.command deleted file mode 100644 index 89cfe02b..00000000 --- a/utils/macosx_build_config.command +++ /dev/null @@ -1,12 +0,0 @@ -# -# This file contains local path settings for your own personal environment. -# To use in macosx add export entries to your ~/.bash_profile file -# - -set -x #echo on - -export ZANO_QT_PATH="/Users/roky/Qt5.6.0/5.6" -export ZANO_BOOST_ROOT="/Users/roky/boost_1_60_0" -export ZANO_BOOST_LIBS_PATH="$ZANO_BOOST_ROOT/stage/lib" -export ZANO_BUILD_DIR="build_mac_osx_64" -export OPENSSL_ROOT_DIR="/usr/local/opt/openssl" diff --git a/utils/macosx_build_uploader.sh b/utils/macosx_build_uploader.sh deleted file mode 100644 index 45813204..00000000 --- a/utils/macosx_build_uploader.sh +++ /dev/null @@ -1,51 +0,0 @@ -set +e -curr_path=${BASH_SOURCE%/*} - -function upload_build() # $1 - path to the file to be uploaded -{ - if [ -z "$1" ] - then - echo "ERROR: upload_build is called with no or invalid parameters" - return 1 - fi - - # check if the directory contains files - #if [ -n "$(ls -A "$ZANO_BLD_UPL_DIR" 2>/dev/null)" ] - #then - # echo "ERROR: uploading folder contains files" - # return 1 - #fi - - cd "$ZANO_BLD_UPL_DIR" || return 2 - rm -rf ./* || return 3 - #popd || return 4 - - touch WAIT || return 5 - cp $1 . || return 6 - rm WAIT || return 7 - - counter=0 - while [ ! -f DONE ] - do - if [ "$counter" -ge 500 ] - then - echo "ERROR: uploading is taking longer than expected" - touch STOP - return 8 - fi - sleep 2 - echo "waiting..." - counter=$((counter + 1)) - done - - rc=$( " - echo " -- fixes lib paths in binary and libs to relative-to-binary paths, using given lib dir as final lib folder" - exit 1 -fi - -path_to_lib=$1 -path_to_binary=$2 -rel_bin_to_lib=$(rel_path $path_to_lib $path_to_binary) -fix_boost_libs_in_binary @executable_path/$rel_bin_to_lib $path_to_binary -fix_boost_libs_in_libs @executable_path/$rel_bin_to_lib $path_to_lib - -exit 0 diff --git a/utils/macosx_fixup.sh b/utils/macosx_fixup.sh deleted file mode 100644 index 74094166..00000000 --- a/utils/macosx_fixup.sh +++ /dev/null @@ -1,28 +0,0 @@ -#/bin/sh - -INSTALL_DIR=$1 - -function fixup() { - echo $3": "$1" -> "$2 - install_name_tool -change $1 $2 $3 -} - -fixup_lib() { - FROM="\"/opt/local/lib/"$1"\"" - TO="\"@executable_path/lib/"$1"\"" - fixup $FROM $TO $2 -} - -for BIN in $INSTALL_DIR/*; do - if [ ! -d "$BIN" ]; then - fixup_lib "libboost_system-mt.dylib" $BIN - fixup_lib "libboost_filesystem-mt.dylib" $BIN - fixup_lib "libboost_thread-mt.dylib" $BIN - fixup_lib "libboost_date_time-mt.dylib" $BIN - fixup_lib "libboost_chrono-mt.dylib" $BIN - fixup_lib "libboost_regex-mt.dylib" $BIN - fixup_lib "libboost_serialization-mt.dylib" $BIN - fixup_lib "libboost_atomic-mt.dylib" $BIN - fixup_lib "libboost_program_options-mt.dylib" $BIN - fi -done From 938c473c88e0ae9a9366322c914cfcba1d951313 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 02:10:51 +0100 Subject: [PATCH 16/66] Update build targets and artifact paths for consistency Standardized build target names and artifact directory paths across Linux, macOS (Intel and ARM), and Windows GitHub Actions workflows. Updated Dockerfile to use 'gcc-linux-armv8' as the build target and added 'bison' to dependencies for improved build environment consistency. --- .github/workflows/build-linux.yml | 8 ++++---- .github/workflows/build-macos-arm64.yml | 6 +++--- .github/workflows/build-macos-intel.yml | 6 +++--- .github/workflows/build-windows.yml | 6 +++--- utils/docker/images/lthn-chain/Dockerfile | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index d5a19c38..66d0eada 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -1,4 +1,4 @@ -name: build-linux +name: Linux permissions: contents: read on: @@ -12,7 +12,7 @@ on: jobs: build: - name: gcc-linux-amd64-release + name: gcc-linux-x86_64 runs-on: ubuntu-22.04 steps: - name: Checkout Project @@ -31,7 +31,7 @@ jobs: cache_packages: true - name: Compile Release - run: make gcc-linux-amd64-release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make gcc-linux-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts @@ -39,4 +39,4 @@ jobs: chain-network: ${{ inputs.chain-network }} assets: lethean-* asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/gcc-linux-amd64-release/src + asset-directory: ${{ github.workspace }}/build/gcc-linux-x86_64/src diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index 11414e24..e1ac7e3a 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -13,7 +13,7 @@ on: jobs: build-cli: - name: apple-clang-arm64-release + name: apple-clang-armv8 runs-on: macos-15 steps: - name: Checkout Project @@ -29,7 +29,7 @@ jobs: cache_packages: true - name: Compile Release - run: make apple-clang-arm64-release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make apple-clang-armv8 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts @@ -37,4 +37,4 @@ jobs: chain-network: ${{ inputs.chain-network }} assets: lethean-* asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/apple-clang-arm64-release/src \ No newline at end of file + asset-directory: ${{ github.workspace }}/build/apple-clang-armv8/src \ No newline at end of file diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index 48383a53..002094c8 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -12,7 +12,7 @@ on: jobs: build: - name: apple-clang-arm64-release + name: apple-clang-x86_64 runs-on: macos-13 steps: - name: Checkout Project @@ -28,7 +28,7 @@ jobs: cache_packages: true - name: Compile Release - run: make apple-clang-arm64-release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make apple-clang-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts @@ -36,4 +36,4 @@ jobs: chain-network: ${{ inputs.chain-network }} assets: lethean-* asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/apple-clang-arm64-release/src + asset-directory: ${{ github.workspace }}/build/apple-clang-x86_64/src diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index ca934fc9..5c2a60a8 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -12,7 +12,7 @@ on: jobs: build: - name: msvc-194-amd64-release + name: msvc-194-x86_64 runs-on: windows-2022 steps: - name: Checkout Project @@ -28,7 +28,7 @@ jobs: cache_packages: true - name: Compile Release - run: make msvc-194-amd64-release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make msvc-194-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts @@ -36,4 +36,4 @@ jobs: chain-network: ${{ inputs.chain-network }} assets: lethean-* asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/msvc-194-amd64-release/src/Release + asset-directory: ${{ github.workspace }}/build/msvc-194-x86_64/src/Release diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index d291df97..5f263860 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -6,7 +6,7 @@ ARG THREADS=1 ARG BUILD_BRANCH=dev-configure-testnet-1 ARG BUILD_LOCAL=1 ARG BUILD_REPO=https://github.com/letheanVPN/blockchain.git -ARG BUILD_TARGET=gcc-linux-arm64 +ARG BUILD_TARGET=gcc-linux-armv8 ARG BUILD_FOLDER=build/release ARG BUILD_TYPE=Release ARG BUILD_TESTNET=0 @@ -18,7 +18,7 @@ ENV BUILD_TARGET=${BUILD_TARGET} RUN apt update && apt -y upgrade RUN apt install -y build-essential pkgconf \ - curl ca-certificates \ + curl ca-certificates bison \ g++ llvm clang lld cmake \ git python3 python3-pip xz-utils gperf From 4931245348bc1f9066549fa5c06f922e4c906ab0 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 12:40:18 +0100 Subject: [PATCH 17/66] Update Dockerfile and remove Crowdin config Deleted the crowdin.yml configuration file and updated the lthn-chain Dockerfile. The Dockerfile now sets NO_COLOR=1 to disable color escape characters, adds logic to symlink testnet binaries to mainnet names for consistency, and re-enables the chain-service stage using mainnet binary names. --- crowdin.yml | 3 --- utils/docker/images/lthn-chain/Dockerfile | 21 ++++++++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) delete mode 100644 crowdin.yml diff --git a/crowdin.yml b/crowdin.yml deleted file mode 100644 index 4b52ef81..00000000 --- a/crowdin.yml +++ /dev/null @@ -1,3 +0,0 @@ -files: - - source: /**/src/gui/qt-daemon/html_source/src/assets/i18n/en.json - translation: /**/src/gui/qt-daemon/html_source/src/assets/i18n/%two_letters_code%.json diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index 5f263860..f62250c4 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -13,6 +13,8 @@ ARG BUILD_TESTNET=0 ENV CONAN_HOME=/root/sdk +# CONAN: disables the generation of color escape characters. +ENV NO_COLOR=1 ENV BUILD_TARGET=${BUILD_TARGET} RUN apt update && apt -y upgrade @@ -45,6 +47,15 @@ RUN cmake -S /code -B ${BUILD_FOLDER} -DCMAKE_TOOLCHAIN_FILE=${BUILD_FOLDER}/con RUN cmake --build ${BUILD_FOLDER} --config=${BUILD_TYPE} --parallel=${THREADS} +# minor cmd-fu; TESTNEt and MAINNET, in docker context, use MAIINNET binaries names. +# do i like removing `-testnet`, no, but i dislike working around multiple names for ever more, so... +RUN if [ "$BUILD_TESTNET" = "1" ]; then \ + cd ${BUILD_FOLDER}/src && \ + for f in lethean-testnet-*; do \ + ln -s "$f" "${f/-testnet/}"; \ + done; \ + fi + FROM scratch AS build-cache COPY --from=builder ${CONAN_HOME} / @@ -52,8 +63,8 @@ COPY --from=builder ${CONAN_HOME} / FROM scratch AS build-artifacts COPY --from=builder /code/build/release/src/lethean-* / -#FROM ubuntu:24.04 AS chain-service -# -#COPY --from=build-artifacts --chmod=+x / /bin -# -#RUN lethean-testnet-chain-node --help +FROM ubuntu:24.04 AS chain-service + +COPY --from=build-artifacts --chmod=+x / /bin + +RUN lethean-chain-node --help From e8e211878472cb95eb45310620a47c29279be701 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 12:40:54 +0100 Subject: [PATCH 18/66] Make build type configurable in Makefile Added BUILD_TYPE variable to allow specifying build type (e.g., Release, Debug) for all build targets. Updated Conan and CMake commands to use the configurable build type. Cleaned up apple-clang profile files by removing unnecessary user_presets configuration. --- Makefile | 27 ++++++++++++++------------- cmake/profiles/apple-clang-armv8 | 2 +- cmake/profiles/apple-clang-x86_64 | 3 +-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index d8651f48..d3cb096c 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ # Default to “unknown” – will be overwritten below. CPU_CORES := 1 TESTNET ?= 0 +BUILD_TYPE ?=Release # ----------------------------------------------------------------- # Unix‑like systems (Linux, macOS, *BSD, etc.) @@ -73,15 +74,15 @@ CONAN_CPU_COUNT=$(CPU_CORES) PROFILES := $(patsubst cmake/profiles/%,%,$(wildcard cmake/profiles/*)) SORTED_PROFILES := $(sort $(PROFILES)) CONAN_CACHE := $(CURDIR)/build/sdk -DEFAULT_CONAN_PROFILE := $(CONAN_CACHE)/cmake/profiles/default +DEFAULT_CONAN_PROFILE := $(CONAN_CACHE)/profiles/default all: help release: conan-profile-detect @echo "Building profile: release" - CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release --build=missing -s build_type=Release - cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DTESTNET=$(TESTNET) - cmake --build build/release --config=Release --parallel=$(CPU_CORES) + CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release --build=missing -s build_type=$(BUILD_TYPE) + cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DTESTNET=$(TESTNET) + cmake --build build/release --config=$(BUILD_TYPE) --parallel=$(CPU_CORES) debug: conan-profile-detect @echo "Building profile: debug" @@ -92,8 +93,8 @@ debug: conan-profile-detect static: static-release static-release: conan-profile-detect @echo "Building profile: release-static" - CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release-static --build=missing - cmake -S . -B build/release-static -DCMAKE_TOOLCHAIN_FILE=build/release-static/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -D STATIC=ON -DTESTNET=$(TESTNET) + CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release-static --build=missing -s build_type=$(BUILD_TYPE) + cmake -S . -B build/release-static -DCMAKE_TOOLCHAIN_FILE=build/release-static/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -D STATIC=ON -DTESTNET=$(TESTNET) cmake --build build/release-static --config=Release --parallel=$(CPU_CORES) conan-profile-detect: @@ -106,9 +107,9 @@ conan-profile-detect: # Rule for each profile $(PROFILES): conan-profile-detect @echo "Building profile: $@" - CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/$@ --profile=cmake/profiles/$@ --build=missing - cmake -S . -B build/$@ -DCMAKE_TOOLCHAIN_FILE=build/$@/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DTESTNET=$(TESTNET) - cmake --build build/$@ --config=Release --parallel=$(CPU_CORES) + CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/$@ -pr:b=$(DEFAULT_CONAN_PROFILE) -pr:h=cmake/profiles/$@ --build=missing -s build_type=$(BUILD_TYPE) + cmake -S . -B build/$@ -DCMAKE_TOOLCHAIN_FILE=build/$@/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DTESTNET=$(TESTNET) + cmake --build build/$@ --config=$(BUILD_TYPE) --parallel=$(CPU_CORES) help: @echo "Available targets:" @@ -131,22 +132,22 @@ help: test: test-release test-release: @echo "Building profile: test-release" - CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/test-release --build=missing + CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/test-release --build=missing -s build_type=$(BUILD_TYPE) cmake -S . -B build/test-release -DCMAKE_TOOLCHAIN_FILE=build/test-release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release -D BUILD_TESTS=ON cmake --build build/test-release --config=Release --parallel=$(CPU_CORES) $(MAKE) test test-debug: @echo "Building profile: test-debug" - CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/test-debug --build=missing + CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/test-debug --build=missing -s build_type=$(BUILD_TYPE) cmake -S . -B build/test-debug -DCMAKE_TOOLCHAIN_FILE=build/test-debug/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Debug -D BUILD_TESTS=ON cmake --build build/test-debug --config=Debug --parallel=$(CPU_CORES) $(MAKE) test configure: @echo "Running Config: release" - CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release --build=missing -s build_type=Release - cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=Release + CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release --build=missing -s build_type=$(BUILD_TYPE) + cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) docs: configure @echo "Building Documentation" diff --git a/cmake/profiles/apple-clang-armv8 b/cmake/profiles/apple-clang-armv8 index 72a0c026..0f36faa5 100644 --- a/cmake/profiles/apple-clang-armv8 +++ b/cmake/profiles/apple-clang-armv8 @@ -6,4 +6,4 @@ compiler.version=13 compiler.libcxx=libc++ [conf] -tools.cmake.cmaketoolchain:user_presets=False + diff --git a/cmake/profiles/apple-clang-x86_64 b/cmake/profiles/apple-clang-x86_64 index adda230c..9af72645 100644 --- a/cmake/profiles/apple-clang-x86_64 +++ b/cmake/profiles/apple-clang-x86_64 @@ -5,5 +5,4 @@ compiler=apple-clang compiler.version=13 compiler.libcxx=libc++ -[conf] -tools.cmake.cmaketoolchain:user_presets=False \ No newline at end of file +[conf] \ No newline at end of file From ba4b5f4eca3cf2067d90ed2aaf8175ea85b2d8be Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 13:04:23 +0100 Subject: [PATCH 19/66] testing msvc-193 --- .github/workflows/build-windows.yml | 29 ++++++++++++++++++++++++++++- cmake/profiles/msvc-193-x86_64 | 10 ++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 cmake/profiles/msvc-193-x86_64 diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 5c2a60a8..1c179611 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -11,7 +11,7 @@ on: type: string jobs: - build: + msvc-194: name: msvc-194-x86_64 runs-on: windows-2022 steps: @@ -37,3 +37,30 @@ jobs: assets: lethean-* asset-type: 'cli' asset-directory: ${{ github.workspace }}/build/msvc-194-x86_64/src/Release + + msvc-193: + name: msvc-194-x86_64 + runs-on: windows-2022 + steps: + - name: Checkout Project + uses: actions/checkout@v4.2.2 + with: + fetch-depth: 0 + submodules: recursive + + - name: Install Conan + uses: conan-io/setup-conan@v1 + with: + home: ${{ github.workspace }}/build/sdk + cache_packages: true + + - name: Compile Release + run: make msvc-193-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + + - name: CLI Artifacts + uses: ./.github/actions/upload-artifacts + with: + chain-network: ${{ inputs.chain-network }} + assets: lethean-* + asset-type: 'cli' + asset-directory: ${{ github.workspace }}/build/msvc-193-x86_64/src/Release diff --git a/cmake/profiles/msvc-193-x86_64 b/cmake/profiles/msvc-193-x86_64 new file mode 100644 index 00000000..19a699f5 --- /dev/null +++ b/cmake/profiles/msvc-193-x86_64 @@ -0,0 +1,10 @@ +[settings] +arch=x86_64 +compiler=msvc +compiler.cppstd=17 +compiler.runtime=static +compiler.version=193 +os=Windows + +[conf] +tools.cmake.cmaketoolchain:user_presets=False From dc6127eca5cc19231eb5f8b59f11d821d0d38319 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 13:05:20 +0100 Subject: [PATCH 20/66] Update build-windows.yml --- .github/workflows/build-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 1c179611..18fb28cd 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -39,7 +39,7 @@ jobs: asset-directory: ${{ github.workspace }}/build/msvc-194-x86_64/src/Release msvc-193: - name: msvc-194-x86_64 + name: msvc-193-x86_64 runs-on: windows-2022 steps: - name: Checkout Project From 4dfda9a1c762bdb76876096cdaeca8fb210201e7 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 13:11:24 +0100 Subject: [PATCH 21/66] Update build-windows.yml removing the gha for msvc-193 due to breaking changes GHA dosnt have it, but users could have that installed so the profile is valid --- .github/workflows/build-windows.yml | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 18fb28cd..c3f4b173 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -37,30 +37,3 @@ jobs: assets: lethean-* asset-type: 'cli' asset-directory: ${{ github.workspace }}/build/msvc-194-x86_64/src/Release - - msvc-193: - name: msvc-193-x86_64 - runs-on: windows-2022 - steps: - - name: Checkout Project - uses: actions/checkout@v4.2.2 - with: - fetch-depth: 0 - submodules: recursive - - - name: Install Conan - uses: conan-io/setup-conan@v1 - with: - home: ${{ github.workspace }}/build/sdk - cache_packages: true - - - name: Compile Release - run: make msvc-193-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - - name: CLI Artifacts - uses: ./.github/actions/upload-artifacts - with: - chain-network: ${{ inputs.chain-network }} - assets: lethean-* - asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/msvc-193-x86_64/src/Release From 10bdc49525563547fbeb6b3760cef97c1895db3a Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 16:13:21 +0100 Subject: [PATCH 22/66] Add docker build target for lthn-chain node Introduces a new Makefile target 'docker-chain-node' to build the lthn/chain Docker image. Updates the lthn-chain Dockerfile with improved comments, sets BUILD_TESTNET=1 by default, and clarifies multi-stage build targets. Also updates the docs submodule reference. --- Makefile | 5 ++++- docs | 2 +- utils/docker/images/lthn-chain/Dockerfile | 8 +++++--- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index d3cb096c..d6367a04 100644 --- a/Makefile +++ b/Makefile @@ -157,6 +157,9 @@ docs-dev: configure @echo "Building Documentation" cmake --build build/release --target=serve_docs --config=Release +docker-chain-node: + @echo "Building docker image: lthn/chain" + docker build utils/docker/images/lthn-chain -t lthn/chain $(CURDIR) clean: rm -rf build @@ -164,4 +167,4 @@ clean: tags: ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ src contrib tests/gtest -.PHONY: all release debug docs docs-dev configure static static-release test test-release test-debug clean tags conan-profile-detect $(PROFILES) +.PHONY: all release docker-chain-node debug docs docs-dev configure static static-release test test-release test-debug clean tags conan-profile-detect $(PROFILES) diff --git a/docs b/docs index 93d4f46c..8149379b 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 93d4f46cdac8ba499cbb2d7819a472d66e209127 +Subproject commit 8149379b068681eb1d9664b54efe61fafc98b292 diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index f62250c4..0a79e0cc 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -1,4 +1,4 @@ -# This is a multi target docker image +# use --target=builder to return a docker image able to compile the software, probbly used with -v .:/code FROM ubuntu:24.04 AS builder LABEL authors="snider" @@ -9,7 +9,7 @@ ARG BUILD_REPO=https://github.com/letheanVPN/blockchain.git ARG BUILD_TARGET=gcc-linux-armv8 ARG BUILD_FOLDER=build/release ARG BUILD_TYPE=Release -ARG BUILD_TESTNET=0 +ARG BUILD_TESTNET=1 ENV CONAN_HOME=/root/sdk @@ -56,13 +56,15 @@ RUN if [ "$BUILD_TESTNET" = "1" ]; then \ done; \ fi - +# use --target=build-cache to return just the cache files FROM scratch AS build-cache COPY --from=builder ${CONAN_HOME} / +# use --target=build-artifacts to return the binaries FROM scratch AS build-artifacts COPY --from=builder /code/build/release/src/lethean-* / +# use --target=chain-service to return a working chain node FROM ubuntu:24.04 AS chain-service COPY --from=build-artifacts --chmod=+x / /bin From 2bea40337b1872f520de4e4315c36dc18c579336 Mon Sep 17 00:00:00 2001 From: Y-o-D <97780802+Y-o-D@users.noreply.github.com> Date: Sat, 27 Sep 2025 21:26:52 +0600 Subject: [PATCH 23/66] Corrected the value "Lethean wallet address ... for integrated address" (#18) --- src/rpc/core_rpc_server_commands_defs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpc/core_rpc_server_commands_defs.h b/src/rpc/core_rpc_server_commands_defs.h index 3ff81721..41a7aacb 100644 --- a/src/rpc/core_rpc_server_commands_defs.h +++ b/src/rpc/core_rpc_server_commands_defs.h @@ -466,7 +466,7 @@ namespace currency BEGIN_KV_SERIALIZE_MAP() KV_SERIALIZE(payment_id) DOC_DSCR("Hex-encoded Payment ID to be associated with the this address. If empty then wallet would generate new payment id using system random library") DOC_EXMP("1dfe5a88ff9effb3") DOC_END - KV_SERIALIZE(regular_address) DOC_DSCR("Lethean wallet address to be used as a base for integrated address") DOC_EXMP("ZxCSpsGGeJsS8fwvQ4HktDU3qBeauoJTR6j73jAWWZxFXdF7XTbGm4YfS2kXJmAP4Rf5BVsSQ9iZ45XANXEYsrLN2L2W77dH7") DOC_END + KV_SERIALIZE(regular_address) DOC_DSCR("Lethean wallet address to be used as a base for integrated address") DOC_EXMP("iTHNHvUTA2gR7gSb854s58SpAyqtR5aCNcfzBzVHjhvPcw2gQ2PHDiwT48U4ZyLVjtLxev8fAQ7NaGLZe6ihTSgp7gL45MJTCK") DOC_END END_KV_SERIALIZE_MAP() }; From 3307bb09ac4bfdd05388a4e6c815ed01b32d30c5 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 16:40:10 +0100 Subject: [PATCH 24/66] Update docs --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 8149379b..377608cc 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 8149379b068681eb1d9664b54efe61fafc98b292 +Subproject commit 377608cc713a8783dd0c87329449dac93a55861f From f5cd385fb38dc12f38470f32ae89043c4ad2fe79 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:14:12 +0100 Subject: [PATCH 25/66] Add Docker build workflow and update push workflow Introduces a new build-docker.yml GitHub Actions workflow for building and pushing Docker images. Updates the _on-push.yml workflow to include the Docker build job and renames job names for consistency. --- .github/workflows/_on-push.yml | 16 ++++++++---- .github/workflows/build-docker.yml | 41 ++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 .github/workflows/build-docker.yml diff --git a/.github/workflows/_on-push.yml b/.github/workflows/_on-push.yml index f2684ffa..be1ec0eb 100644 --- a/.github/workflows/_on-push.yml +++ b/.github/workflows/_on-push.yml @@ -1,4 +1,4 @@ -name: Push Full Build +name: Push Compile permissions: contents: read on: @@ -16,29 +16,35 @@ concurrency: jobs: build-linux: - name: Compile + name: Chain uses: ./.github/workflows/build-linux.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-windows: - name: Compile + name: Chain uses: ./.github/workflows/build-windows.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-arm64: - name: Compile + name: Chain uses: ./.github/workflows/build-macos-arm64.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-intel: - name: Compile + name: Chain uses: ./.github/workflows/build-macos-intel.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + build-docker: + name: Docker + uses: ./.github/workflows/build-docker.yml + with: + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + build-docs: name: Docs uses: ./.github/workflows/build-docs.yml diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml new file mode 100644 index 00000000..7e4a8dd0 --- /dev/null +++ b/.github/workflows/build-docker.yml @@ -0,0 +1,41 @@ +name: Docker +permissions: + contents: read +on: + workflow_call: + inputs: + chain-network: + description: "The network to use, can either be testnet, stagenet or mainnet" + default: testnet + required: false + type: string + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - name: Checkout Project + uses: actions/checkout@v4.2.2 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + + - name: Build and push + id: docker_build + uses: docker/build-push-action@v5 + with: + file: utils/docker/images/chain-node + context: . + push: true + tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} + From 2783a7c339cb2679b38c96bd0c0e17df95160f85 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:20:29 +0100 Subject: [PATCH 26/66] Add DockerHub secrets to build-docker workflow The build-docker workflow now requires DOCKERHUB_USERNAME and DOCKERHUB_TOKEN secrets, which are inherited in the _on-push workflow. This ensures DockerHub credentials are available for Docker-related actions. --- .github/workflows/_on-push.yml | 1 + .github/workflows/build-docker.yml | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/.github/workflows/_on-push.yml b/.github/workflows/_on-push.yml index be1ec0eb..a24472aa 100644 --- a/.github/workflows/_on-push.yml +++ b/.github/workflows/_on-push.yml @@ -44,6 +44,7 @@ jobs: uses: ./.github/workflows/build-docker.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + secrets: inherit build-docs: name: Docs diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 7e4a8dd0..0ea5650f 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -3,6 +3,11 @@ permissions: contents: read on: workflow_call: + secrets: + DOCKERHUB_USERNAME: + required: true + DOCKERHUB_TOKEN: + required: true inputs: chain-network: description: "The network to use, can either be testnet, stagenet or mainnet" From 6d9792ed3f940e4e40945e2816ae1499b88ac141 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:23:28 +0100 Subject: [PATCH 27/66] Update Docker build workflow with dynamic job name Adds a dynamic job name based on the chain network input and updates Docker build context and file paths to use absolute paths. This improves clarity in workflow runs and ensures correct Dockerfile resolution. --- .github/workflows/build-docker.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 0ea5650f..af1550de 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -17,6 +17,7 @@ on: jobs: build: + name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}" runs-on: ubuntu-22.04 steps: - name: Checkout Project @@ -39,8 +40,8 @@ jobs: id: docker_build uses: docker/build-push-action@v5 with: - file: utils/docker/images/chain-node - context: . + file: ${{ github.workspace }}/utils/docker/images/chain-node/Dockerfile + context: ${{ github.workspace }} push: true tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} From 18c93466f26e87923a7a41f5a0b252a2a1c01fcb Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:31:22 +0100 Subject: [PATCH 28/66] Update Docker and Docs GitHub workflows Bump docker/build-push-action to v6 and update file/context in build-docker.yml. Add job name 'Offline Local Version' to build-docs.yml for clarity. --- .github/workflows/build-docker.yml | 6 +++--- .github/workflows/build-docs.yml | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index af1550de..35a9f772 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -38,10 +38,10 @@ jobs: - name: Build and push id: docker_build - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 with: - file: ${{ github.workspace }}/utils/docker/images/chain-node/Dockerfile - context: ${{ github.workspace }} + file: utils/docker/images/chain-node + context: {{defaultContext}}:${{ github.workspace }} push: true tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index f5662733..bd742fdf 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -6,6 +6,7 @@ on: jobs: deploy: + name: Offline Local Version runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 From 3108260ec9748fecfc710f9951435e82a37f7052 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:32:21 +0100 Subject: [PATCH 29/66] Update build-docker.yml --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 35a9f772..deb76de4 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -41,7 +41,7 @@ jobs: uses: docker/build-push-action@v6 with: file: utils/docker/images/chain-node - context: {{defaultContext}}:${{ github.workspace }} + context: . push: true tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} From 56518a6f96ee07b6a6ecdca11840e513b5f438ab Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:33:39 +0100 Subject: [PATCH 30/66] Update build-docker.yml --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index deb76de4..83b00094 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -40,7 +40,7 @@ jobs: id: docker_build uses: docker/build-push-action@v6 with: - file: utils/docker/images/chain-node + file: utils/docker/images/chain-node/Dockerfile context: . push: true tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} From 67ad7705ee4cd903a1c574ff0a3aa887d1ab5214 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:35:08 +0100 Subject: [PATCH 31/66] Update build-docker.yml --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 83b00094..1cd4b1af 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -40,7 +40,7 @@ jobs: id: docker_build uses: docker/build-push-action@v6 with: - file: utils/docker/images/chain-node/Dockerfile + file: ${{ github.workspace }}/utils/docker/images/chain-node/Dockerfile context: . push: true tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} From 5a5e82974fdd401e343b1657ebcb369fa636ba6d Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:37:47 +0100 Subject: [PATCH 32/66] Update build-docker.yml --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 1cd4b1af..e703fe0b 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -41,7 +41,7 @@ jobs: uses: docker/build-push-action@v6 with: file: ${{ github.workspace }}/utils/docker/images/chain-node/Dockerfile - context: . + context: ${{ github.workspace }} push: true tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} From 91e6904c7de775f187d63d24478ef5702c100265 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:42:23 +0100 Subject: [PATCH 33/66] Update build-docker.yml --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index e703fe0b..050bf329 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -40,7 +40,7 @@ jobs: id: docker_build uses: docker/build-push-action@v6 with: - file: ${{ github.workspace }}/utils/docker/images/chain-node/Dockerfile + file: utils/docker/images/chain-node/Dockerfile context: ${{ github.workspace }} push: true tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} From 7cadbf139ebffbac84888e3842245fc5f0e98a6b Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:53:02 +0100 Subject: [PATCH 34/66] Update build-docker.yml --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 050bf329..dc193070 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -40,7 +40,7 @@ jobs: id: docker_build uses: docker/build-push-action@v6 with: - file: utils/docker/images/chain-node/Dockerfile + file: utils/docker/images/lthn-chain/Dockerfile context: ${{ github.workspace }} push: true tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} From 1ed048d962646ce3d7a4e98a06f46f4338564f72 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 17:57:54 +0100 Subject: [PATCH 35/66] Update Dockerfile build target to gcc-linux-x86_64 Changed the BUILD_TARGET argument in the lthn-chain Dockerfile from gcc-linux-armv8 to gcc-linux-x86_64 to target x86_64 architecture builds. --- utils/docker/images/lthn-chain/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index 0a79e0cc..250b23ec 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -6,7 +6,7 @@ ARG THREADS=1 ARG BUILD_BRANCH=dev-configure-testnet-1 ARG BUILD_LOCAL=1 ARG BUILD_REPO=https://github.com/letheanVPN/blockchain.git -ARG BUILD_TARGET=gcc-linux-armv8 +ARG BUILD_TARGET=gcc-linux-x86_64 ARG BUILD_FOLDER=build/release ARG BUILD_TYPE=Release ARG BUILD_TESTNET=1 From dea8becdd9e10935161758273b66d48b22a9515b Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 18:15:08 +0100 Subject: [PATCH 36/66] Update Docker build args and testnet symlink logic Adds build arguments to the Docker build workflow for testnet, threads, build target, and local build. Updates the Dockerfile to use the 'dev' branch by default and improves the testnet symlink creation logic to use sed for string replacement. --- .github/workflows/build-docker.yml | 5 +++++ utils/docker/images/lthn-chain/Dockerfile | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index dc193070..0a88fab3 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -43,5 +43,10 @@ jobs: file: utils/docker/images/lthn-chain/Dockerfile context: ${{ github.workspace }} push: true + build-args: | + BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + THREADS=2 + BUILD_TARGET=gcc-linux-x86_64 + BUILD_LOCAL=1 tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index 250b23ec..cc730097 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -3,7 +3,7 @@ FROM ubuntu:24.04 AS builder LABEL authors="snider" ARG THREADS=1 -ARG BUILD_BRANCH=dev-configure-testnet-1 +ARG BUILD_BRANCH=dev ARG BUILD_LOCAL=1 ARG BUILD_REPO=https://github.com/letheanVPN/blockchain.git ARG BUILD_TARGET=gcc-linux-x86_64 @@ -52,7 +52,7 @@ RUN cmake --build ${BUILD_FOLDER} --config=${BUILD_TYPE} --parallel=${THREADS} RUN if [ "$BUILD_TESTNET" = "1" ]; then \ cd ${BUILD_FOLDER}/src && \ for f in lethean-testnet-*; do \ - ln -s "$f" "${f/-testnet/}"; \ + ln -s "$f" "$(echo "$f" | sed 's/-testnet//')"; \ done; \ fi From 66a7b597f4e9127c4964a84c70d95bf97b5ae537 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 21:34:30 +0100 Subject: [PATCH 37/66] Add multi-arch Docker build support and Makefile targets This update enhances the Docker build workflow to support multiple architectures (amd64, arm64, armv7, ppc64le, riscv64, s390x) using buildx and matrix builds in GitHub Actions. The Makefile now includes new targets for building and exporting artifacts for each supported architecture. The Dockerfile is updated to allow conditional use of custom Conan profiles via a new USE_CUSTOM_PROFILE build argument. --- .github/workflows/build-docker.yml | 63 +++++++++++++++++++++-- Makefile | 23 ++++++++- utils/docker/images/lthn-chain/Dockerfile | 14 ++++- 3 files changed, 94 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 0a88fab3..f4a49c27 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -1,6 +1,7 @@ name: Docker permissions: contents: read + packages: write on: workflow_call: secrets: @@ -19,6 +20,23 @@ jobs: build: name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}" runs-on: ubuntu-22.04 + strategy: + matrix: + platform: [ linux/amd64, linux/arm64, linux/arm/v7, linux/ppc64le, linux/riscv64, linux/s390x ] + include: + - platform: linux/amd64 + arch_tag: amd64 + - platform: linux/arm64 + arch_tag: arm64 + - platform: linux/arm/v7 + arch_tag: armv7 + - platform: linux/ppc64le + arch_tag: ppc64le + - platform: linux/riscv64 + arch_tag: riscv64 + - platform: linux/s390x + arch_tag: s390x + steps: - name: Checkout Project uses: actions/checkout@v4.2.2 @@ -35,18 +53,55 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Build and push + - name: Build ${{ matrix.platform }} id: docker_build + continue-on-error: true uses: docker/build-push-action@v6 with: file: utils/docker/images/lthn-chain/Dockerfile context: ${{ github.workspace }} + platforms: ${{ matrix.platform }} push: true build-args: | BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} THREADS=2 - BUILD_TARGET=gcc-linux-x86_64 BUILD_LOCAL=1 - tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} + USE_CUSTOM_PROFILE=0 + tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}${{ matrix.arch_tag }} + cache-from: type=gha + cache-to: type=gha,mode=max + finalize_manifest: + needs: build + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + submodules: recursive + + - name: Set up Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Build + id: docker_final + uses: docker/build-push-action@v6 + with: + file: utils/docker/images/lthn-chain/Dockerfile + context: ${{ github.workspace }} + platforms: "linux/amd64, linux/arm64, linux/arm/v7, linux/ppc64le, linux/riscv64, linux/s390x" + push: true + build-args: | + BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + THREADS=2 + BUILD_LOCAL=1 + USE_CUSTOM_PROFILE=0 + tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/Makefile b/Makefile index d6367a04..53b0f495 100644 --- a/Makefile +++ b/Makefile @@ -75,6 +75,7 @@ PROFILES := $(patsubst cmake/profiles/%,%,$(wildcard cmake/profiles/*)) SORTED_PROFILES := $(sort $(PROFILES)) CONAN_CACHE := $(CURDIR)/build/sdk DEFAULT_CONAN_PROFILE := $(CONAN_CACHE)/profiles/default +CC_DOCKER_FILE?=utils/docker/images/lthn-chain/Dockerfile all: help @@ -159,7 +160,27 @@ docs-dev: configure docker-chain-node: @echo "Building docker image: lthn/chain" - docker build utils/docker/images/lthn-chain -t lthn/chain $(CURDIR) + docker buildx build -f $(CC_DOCKER_FILE) -t lthn/chain $(CURDIR) + +docker-cc-linux-amd64: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-amd64 --platform linux/amd64 $(CURDIR) + +docker-cc-linux-armv7: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-armv7 --platform linux/arm/v7 $(CURDIR) + +docker-cc-linux-arm64v8: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-arm64v8 --platform linux/arm64/v8 $(CURDIR) + +docker-cc-linux-ppc64le: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-ppc64le --platform linux/ppc64le $(CURDIR) + +docker-cc-linux-riscv64: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-riscv64 --platform linux/riscv64 $(CURDIR) + +docker-cc-linux-s390x: + docker buildx build -f $(CC_DOCKER_FILE) --target build-artifacts --output type=local,dest=build/cc-linux-s390x --platform linux/s390x $(CURDIR) + + clean: rm -rf build diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index cc730097..1c737e24 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -10,6 +10,7 @@ ARG BUILD_TARGET=gcc-linux-x86_64 ARG BUILD_FOLDER=build/release ARG BUILD_TYPE=Release ARG BUILD_TESTNET=1 +ARG USE_CUSTOM_PROFILE=0 ENV CONAN_HOME=/root/sdk @@ -41,7 +42,18 @@ WORKDIR /code RUN conan profile detect --name=default --force -RUN conan install . --output-folder=${BUILD_FOLDER} --build=missing -s build_type=${BUILD_TYPE} -pr:h=/code/cmake/profiles/$BUILD_TARGET +#RUN conan install . --output-folder=${BUILD_FOLDER} --build=missing -s build_type=${BUILD_TYPE} -pr:h=/code/cmake/profiles/$BUILD_TARGET + +RUN set -eux; \ + BCMD="conan install . \ + --output-folder=${BUILD_FOLDER} \ + --build=missing \ + -s build_type=${BUILD_TYPE}"; \ + if [ "${USE_CUSTOM_PROFILE}" = "1" ]; then \ + BCMD="$BCMD -pr:h=/code/cmake/profiles/${BUILD_TARGET}"; \ + fi; \ + echo "Running: $BCMD"; \ + eval $BCMD; RUN cmake -S /code -B ${BUILD_FOLDER} -DCMAKE_TOOLCHAIN_FILE=${BUILD_FOLDER}/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DTESTNET=${BUILD_TESTNET} From 4506fb88f1a7bfb24dfecaadb9d3cba22c62acd7 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 21:36:42 +0100 Subject: [PATCH 38/66] Update _on-push.yml --- .github/workflows/_on-push.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/_on-push.yml b/.github/workflows/_on-push.yml index a24472aa..036ea78e 100644 --- a/.github/workflows/_on-push.yml +++ b/.github/workflows/_on-push.yml @@ -1,6 +1,7 @@ name: Push Compile permissions: contents: read + packages: write on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From bde5bb44c36317c9e316216d27584e89b1162824 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 21:38:01 +0100 Subject: [PATCH 39/66] Update build-docker.yml --- .github/workflows/build-docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index f4a49c27..75db2168 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -18,7 +18,7 @@ on: jobs: build: - name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}" + name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}${{ matrix.arch_tag }}" runs-on: ubuntu-22.04 strategy: matrix: From a6886700ae3757887b17bae5f0eb5700643572bd Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 21:39:06 +0100 Subject: [PATCH 40/66] Update build-docker.yml --- .github/workflows/build-docker.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 75db2168..c6f3279f 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -73,6 +73,7 @@ jobs: finalize_manifest: needs: build + name: Multi-Arch Image runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 From 73131d0053902edf144d01f27567fa1f56c371f8 Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 22:12:29 +0100 Subject: [PATCH 41/66] Add QEMU setup to Docker workflow and update Dockerfile deps Introduces the docker/setup-qemu-action step in the GitHub Actions workflow to support multi-architecture builds. Also updates the lthn-chain Dockerfile to include autotools-dev and checkinstall in the build dependencies. --- .github/workflows/build-docker.yml | 18 ++++++++++++------ utils/docker/images/lthn-chain/Dockerfile | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index c6f3279f..40a6c2a4 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -44,15 +44,18 @@ jobs: fetch-depth: 0 submodules: recursive - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Buildx + uses: docker/setup-buildx-action@v3 + - name: Build ${{ matrix.platform }} id: docker_build continue-on-error: true @@ -81,15 +84,18 @@ jobs: fetch-depth: 0 submodules: recursive - - name: Set up Buildx - uses: docker/setup-buildx-action@v3 - - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Buildx + uses: docker/setup-buildx-action@v3 + - name: Build id: docker_final uses: docker/build-push-action@v6 diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index 1c737e24..9e8585ff 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -21,7 +21,7 @@ ENV BUILD_TARGET=${BUILD_TARGET} RUN apt update && apt -y upgrade RUN apt install -y build-essential pkgconf \ - curl ca-certificates bison \ + curl ca-certificates bison autotools-dev checkinstall \ g++ llvm clang lld cmake \ git python3 python3-pip xz-utils gperf From 3ad2df6f9ff29a47997219650d4c8557fed4959b Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 22:16:03 +0100 Subject: [PATCH 42/66] Update Dockerfile --- utils/docker/images/lthn-chain/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index 9e8585ff..cd8b2ab1 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -17,6 +17,7 @@ ENV CONAN_HOME=/root/sdk # CONAN: disables the generation of color escape characters. ENV NO_COLOR=1 ENV BUILD_TARGET=${BUILD_TARGET} +ENV DEBIAN_FRONTEND=noninteractive RUN apt update && apt -y upgrade From 7d7cfb7a5bb87b7ff96629c82b97d4c324beda4b Mon Sep 17 00:00:00 2001 From: Snider Date: Sat, 27 Sep 2025 23:10:43 +0100 Subject: [PATCH 43/66] Simplify Docker build workflow and update dependencies Refactored the GitHub Actions workflow to remove the build matrix and multi-arch manifest steps, consolidating the build into a single job targeting a specific build target. Updated the Dockerfile to add python-is-python3 and python3-dev to dependencies for improved Python compatibility. --- .github/workflows/build-docker.yml | 76 +++-------------------- utils/docker/images/lthn-chain/Dockerfile | 4 +- 2 files changed, 9 insertions(+), 71 deletions(-) diff --git a/.github/workflows/build-docker.yml b/.github/workflows/build-docker.yml index 40a6c2a4..0a88fab3 100644 --- a/.github/workflows/build-docker.yml +++ b/.github/workflows/build-docker.yml @@ -1,7 +1,6 @@ name: Docker permissions: contents: read - packages: write on: workflow_call: secrets: @@ -18,25 +17,8 @@ on: jobs: build: - name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}${{ matrix.arch_tag }}" + name: "lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }}" runs-on: ubuntu-22.04 - strategy: - matrix: - platform: [ linux/amd64, linux/arm64, linux/arm/v7, linux/ppc64le, linux/riscv64, linux/s390x ] - include: - - platform: linux/amd64 - arch_tag: amd64 - - platform: linux/arm64 - arch_tag: arm64 - - platform: linux/arm/v7 - arch_tag: armv7 - - platform: linux/ppc64le - arch_tag: ppc64le - - platform: linux/riscv64 - arch_tag: riscv64 - - platform: linux/s390x - arch_tag: s390x - steps: - name: Checkout Project uses: actions/checkout@v4.2.2 @@ -44,71 +26,27 @@ jobs: fetch-depth: 0 submodules: recursive + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build ${{ matrix.platform }} + - name: Build and push id: docker_build - continue-on-error: true uses: docker/build-push-action@v6 with: file: utils/docker/images/lthn-chain/Dockerfile context: ${{ github.workspace }} - platforms: ${{ matrix.platform }} push: true build-args: | BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} THREADS=2 + BUILD_TARGET=gcc-linux-x86_64 BUILD_LOCAL=1 - USE_CUSTOM_PROFILE=0 - tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}${{ matrix.arch_tag }} - cache-from: type=gha - cache-to: type=gha,mode=max - - finalize_manifest: - needs: build - name: Multi-Arch Image - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - submodules: recursive - - - name: Login to DockerHub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - - name: Set up Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build - id: docker_final - uses: docker/build-push-action@v6 - with: - file: utils/docker/images/lthn-chain/Dockerfile - context: ${{ github.workspace }} - platforms: "linux/amd64, linux/arm64, linux/arm/v7, linux/ppc64le, linux/riscv64, linux/s390x" - push: true - build-args: | - BUILD_TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - THREADS=2 - BUILD_LOCAL=1 - USE_CUSTOM_PROFILE=0 tags: lthn/chain:${{ inputs.chain-network == 'testnet' && 'testnet' || 'latest' }} - cache-from: type=gha - cache-to: type=gha,mode=max + diff --git a/utils/docker/images/lthn-chain/Dockerfile b/utils/docker/images/lthn-chain/Dockerfile index cd8b2ab1..f32c9603 100644 --- a/utils/docker/images/lthn-chain/Dockerfile +++ b/utils/docker/images/lthn-chain/Dockerfile @@ -23,8 +23,8 @@ RUN apt update && apt -y upgrade RUN apt install -y build-essential pkgconf \ curl ca-certificates bison autotools-dev checkinstall \ - g++ llvm clang lld cmake \ - git python3 python3-pip xz-utils gperf + g++ llvm clang lld cmake python-is-python3 \ + git python3 python3-pip python3-dev xz-utils gperf RUN pip3 install conan --break-system-packages From 9412c22166c67424fb700ea2217e8f7b563251bb Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 28 Sep 2025 14:35:11 +0100 Subject: [PATCH 44/66] Add CPack packaging and update build system Introduces CPack-based packaging with a new CPackConfig.cmake and related configuration variables. Updates Makefile and CMakeLists.txt to support packaging, renames project to Lethean, and adjusts workflow files to use unified 'release' build and artifact upload. Also adds install rules for main binaries and comments out install steps in libmdbx submodules. --- .github/workflows/build-macos-arm64.yml | 24 ++++-- .github/workflows/build-windows.yml | 21 +++-- CMakeLists.txt | 6 +- LICENSE => LICENSE.txt | 0 Makefile | 5 +- cmake/CPackConfig.cmake | 79 +++++++++++++++++++ cmake/config-vars.cmake | 16 ++++ .../db/libmdbx/packages/rpm/CMakeLists.txt | 6 +- contrib/db/libmdbx/src/CMakeLists.txt | 12 +-- contrib/db/libmdbx/src/tools/CMakeLists.txt | 4 +- src/CMakeLists.txt | 3 + 11 files changed, 146 insertions(+), 30 deletions(-) rename LICENSE => LICENSE.txt (100%) create mode 100644 cmake/CPackConfig.cmake diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index e1ac7e3a..d718ac43 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -28,13 +28,21 @@ jobs: home: ${{ github.workspace }}/build/sdk cache_packages: true - - name: Compile Release - run: make apple-clang-armv8 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} +# - name: Compile Release +# run: make apple-clang-armv8 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - name: CLI Artifacts - uses: ./.github/actions/upload-artifacts + - name: Compile Release + run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + + - uses: actions/upload-artifact@v4 with: - chain-network: ${{ inputs.chain-network }} - assets: lethean-* - asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/apple-clang-armv8/src \ No newline at end of file + name: "${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}apple-clang-armv8" + path: ${{ github.workspace }}/build/release/packages/lethean-* + +# - name: CLI Artifacts +# uses: ./.github/actions/upload-artifacts +# with: +# chain-network: ${{ inputs.chain-network }} +# assets: lethean-* +# asset-type: 'cli' +# asset-directory: ${{ github.workspace }}/build/apple-clang-armv8/src \ No newline at end of file diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index c3f4b173..75c5b2b5 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -28,12 +28,19 @@ jobs: cache_packages: true - name: Compile Release - run: make msvc-194-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} +# +# - name: Compile Release +# run: make msvc-194-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - name: CLI Artifacts - uses: ./.github/actions/upload-artifacts + - uses: actions/upload-artifact@v4 with: - chain-network: ${{ inputs.chain-network }} - assets: lethean-* - asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/msvc-194-x86_64/src/Release + name: "${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}cli-msvc-194-x86_64" + path: ${{ github.workspace }}/build/release/packages/lethean-* +# - name: CLI Artifacts +# uses: ./.github/actions/upload-artifacts +# with: +# chain-network: ${{ inputs.chain-network }} +# assets: lethean-* +# asset-type: 'cli' +# asset-directory: ${{ github.workspace }}/build/release/packages diff --git a/CMakeLists.txt b/CMakeLists.txt index e72515a9..9ac781f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.16) set(DISABLE_TOR TRUE CACHE BOOL "Disable TOR library(and related tor-connect submodule)") -PROJECT(Zano) +PROJECT(Lethean) set(VERSION "1.0") message("OPENSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}") @@ -297,7 +297,7 @@ else() endif() endif() -set(BUILD_TESTS FALSE CACHE BOOL "Build Zano tests") +set(BUILD_TESTS FALSE CACHE BOOL "Build Lethean tests") set(DISABLE_MDBX FALSE CACHE BOOL "Exclude mdbx from build(need for a first time)") if(NOT DISABLE_MDBX) add_definitions(-DENABLED_ENGINE_MDBX) @@ -310,3 +310,5 @@ add_subdirectory(src) if (BUILD_TESTS) add_subdirectory(tests) endif() + +include(CPackConfig) \ No newline at end of file diff --git a/LICENSE b/LICENSE.txt similarity index 100% rename from LICENSE rename to LICENSE.txt diff --git a/Makefile b/Makefile index 53b0f495..12acefab 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ # Default to “unknown” – will be overwritten below. CPU_CORES := 1 -TESTNET ?= 0 +TESTNET:= 0 BUILD_TYPE ?=Release # ----------------------------------------------------------------- @@ -80,10 +80,11 @@ CC_DOCKER_FILE?=utils/docker/images/lthn-chain/Dockerfile all: help release: conan-profile-detect - @echo "Building profile: release" + @echo "Building profile: release $(TESTNET)" CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release --build=missing -s build_type=$(BUILD_TYPE) cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DTESTNET=$(TESTNET) cmake --build build/release --config=$(BUILD_TYPE) --parallel=$(CPU_CORES) + (cd build/release && cpack) debug: conan-profile-detect @echo "Building profile: debug" diff --git a/cmake/CPackConfig.cmake b/cmake/CPackConfig.cmake new file mode 100644 index 00000000..08a4ab4c --- /dev/null +++ b/cmake/CPackConfig.cmake @@ -0,0 +1,79 @@ +include(${CMAKE_SOURCE_DIR}/cmake/config-vars.cmake) + +if(CMAKE_BUILD_TYPE STREQUAL "Release") + set(CPACK_PACKAGE_NAME "${package_name}") + set(CPACK_PACKAGE_VENDOR "${package_vendor}") + set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${package_description}") + set(CPACK_PACKAGE_VERSION "${package_version}") + set(CPACK_PACKAGE_CONTACT "${package_contact}") + set(CPACK_PACKAGE_HOMEPAGE_URL "${package_website}") + +# set(CPACK_PACKAGING_INSTALL_PREFIX "/usr/local") # Linux/macOS default +# if(WIN32) +# set(CPACK_PACKAGING_INSTALL_PREFIX "C:/Program Files/${PROJECT_NAME}") +# endif() + + if(APPLE) + if("${package_macos_installer}" STREQUAL "DMG") + set(CPACK_GENERATOR "DragNDrop") +# set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/resources/dmg_background.png") + set(CPACK_DMG_VOLUME_NAME "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}") + message("Registered CPACK_GENERATOR: DragNDrop") + else () + set(CPACK_GENERATOR "productbuild") + set(CPACK_PRODUCTBUILD_IDENTIFIER "${package_macos_pkg_productbuild_identifier}") +# set(CPACK_PRODUCTBUILD_SIGNING_IDENTITY "Developer ID Installer: Your Company (TEAMID)") + message("Registered CPACK_GENERATOR: productbuild") + endif () + elseif(WIN32) + set(CPACK_GENERATOR "WIX") + message("Registered CPACK_GENERATOR: WIX") +# set(CPACK_WIX_PRODUCT_ICON "${CMAKE_SOURCE_DIR}/resources/windows_icon.ico") +# set(CPACK_WIX_LICENSE_RTF "${CMAKE_SOURCE_DIR}/LICENSE.rtf") +# set(CPACK_WIX_UPGRADE_GUID "D3F5A9C1-4B2E-4F5A-9C71-123456789ABC") # change once per major version + else() + set(CPACK_GENERATOR "DEB") + message("Registered CPACK_GENERATOR: deb") + set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${package_contact}") + set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.28)") + set(CPACK_DEBIAN_PACKAGE_SECTION "utils") + set(CPACK_DEBIAN_ARCHITECTURE "${CMAKE_SYSTEM_PROCESSOR}") + # post‑install script (e.g., to register a systemd service) +# set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA +# "${CMAKE_SOURCE_DIR}/scripts/postinstall.sh") + endif() + + list(APPEND CPACK_GENERATOR "TXZ" "ZIP") + message( "Registered CPACK_GENERATOR: tgz") + message( "Registered CPACK_GENERATOR: zip") + set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) + set(CPACK_ARCHIVE_COMPONENT_INSTALL OFF) + set(CPACK_COMPONENTS_ALL) + set(CPACK_GENERATE_SHASUM ON) + set(CPACK_SHASUM_ALGORITHM SHA256) + message( "Using SHA256 Checksums") + + set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") +# set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") + + set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/packages") + + install(FILES README.md LICENSE.txt + DESTINATION . + ) + + set(_arch "${CMAKE_SYSTEM_PROCESSOR}") + + if(_arch MATCHES "AMD64|x86_64") + set(_arch "x86_64") + elseif(_arch MATCHES "arm64|aarch64") + set(_arch "arm64") + endif() + + string(TOLOWER "${CMAKE_SYSTEM_NAME}" _sys_name_lc) + + set(CPACK_PACKAGE_FILE_NAME + "${package_name}-${CPACK_PACKAGE_VERSION}-${_sys_name_lc}-${_arch}") + + include(CPack) +endif() \ No newline at end of file diff --git a/cmake/config-vars.cmake b/cmake/config-vars.cmake index fd96c731..5b48dce0 100644 --- a/cmake/config-vars.cmake +++ b/cmake/config-vars.cmake @@ -10,6 +10,8 @@ set(currency_display_decimal_point 12 CACHE STRING "CURRENCY_DISPLAY_DECIMAL_POI set(currency_name_abr "LTHN" CACHE STRING "CURRENCY_NAME_ABR" ) set(currency_name_base "Lethean" CACHE STRING "CURRENCY_NAME_BASE" ) set(currency_name_short_base "Lethean" CACHE STRING "CURRENCY_NAME_SHORT_BASE" ) + + # prefix is 'iT', non auditable wallets then use 'H', auditable wallets use 'h'; 'N' is a base addr, 'n' is a sub address, set(address_prefix 0x1eaf7 CACHE STRING "CURRENCY_PUBLIC_ADDRESS_BASE58_PREFIX" ) # addresses start with 'iTHN' set(address_prefix_integrated 0xdeaf7 CACHE STRING "CURRENCY_PUBLIC_INTEG_ADDRESS_V2_BASE58_PREFIX" ) # integrated addresses start with 'iTHn' @@ -29,8 +31,22 @@ if (TESTNET) set(p2p_default_port 36942 CACHE STRING "P2P_DEFAULT_PORT" ) set(rpc_default_port 36941 CACHE STRING "RPC_DEFAULT_PORT" ) set(stratum_default_port 36940 CACHE STRING "STRATUM_DEFAULT_PORT" ) + set(package_name "lethean-testnet-cli" CACHE STRING "CPACK_PACKAGE_NAME" ) else () + message(CHECK_FAIL "bad") set(p2p_default_port 36942 CACHE STRING "P2P_DEFAULT_PORT" ) set(rpc_default_port 36941 CACHE STRING "RPC_DEFAULT_PORT" ) set(stratum_default_port 36940 CACHE STRING "STRATUM_DEFAULT_PORT" ) + set(package_name "lethean-cli" CACHE STRING "CPACK_PACKAGE_NAME" ) endif () +# installer config +set(package_vendor "Lethean Community" CACHE STRING "CPACK_PACKAGE_VENDOR" ) +set(package_description "A privacy‑preserving blockchain node" CACHE STRING "CPACK_PACKAGE_DESCRIPTION_SUMMARY" ) +set(package_version "1.0.0" CACHE STRING "CPACK_PACKAGE_VERSION" ) +set(package_contact "support@lt.hn" CACHE STRING "CPACK_PACKAGE_CONTACT" ) +set(package_website "https://github.com/letheanVPN/blockchain" CACHE STRING "CPACK_PACKAGE_HOMEPAGE_URL" ) +set(package_macos_installer "PKG" CACHE STRING "CPACK_GENERATOR" ) +set(package_macos_dmg_background "DMG" CACHE STRING "CPACK_DMG_BACKGROUND_IMAGE" ) +set(package_macos_pkg_productbuild_identifier "com.lethean.blockchainnode" CACHE STRING "CPACK_PRODUCTBUILD_IDENTIFIER" ) +set(package_macos_pkg_productbuild_signer "Developer ID Installer: Your Company (TEAMID)" CACHE STRING "CPACK_PRODUCTBUILD_SIGNING_IDENTITY" ) + diff --git a/contrib/db/libmdbx/packages/rpm/CMakeLists.txt b/contrib/db/libmdbx/packages/rpm/CMakeLists.txt index 5949e9f0..39befcb7 100644 --- a/contrib/db/libmdbx/packages/rpm/CMakeLists.txt +++ b/contrib/db/libmdbx/packages/rpm/CMakeLists.txt @@ -126,9 +126,9 @@ if(UNIX AND NOT APPLE) target_link_libraries(${TARGET}_SHARED rt) endif() -install(TARGETS ${TARGET}_STATIC DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx) -install(TARGETS ${TARGET}_SHARED DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx) -install(FILES mdbx.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include COMPONENT mdbx-devel) +#install(TARGETS ${TARGET}_STATIC DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx) +#install(TARGETS ${TARGET}_SHARED DESTINATION ${CMAKE_INSTALL_PREFIX}/lib64 COMPONENT mdbx) +#install(FILES mdbx.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include COMPONENT mdbx-devel) add_subdirectory(src/tools) add_subdirectory(test) diff --git a/contrib/db/libmdbx/src/CMakeLists.txt b/contrib/db/libmdbx/src/CMakeLists.txt index 7dfc94aa..5e39f344 100644 --- a/contrib/db/libmdbx/src/CMakeLists.txt +++ b/contrib/db/libmdbx/src/CMakeLists.txt @@ -61,12 +61,12 @@ if(CC_HAS_VISIBILITY) target_compile_options(mdbx PRIVATE "-fvisibility=hidden") endif() -install(TARGETS mdbx - LIBRARY DESTINATION lib COMPONENT runtime - RUNTIME DESTINATION bin COMPONENT runtime - ARCHIVE DESTINATION lib/static COMPONENT devel - PUBLIC_HEADER DESTINATION include - INCLUDES DESTINATION include COMPONENT devel) +#install(TARGETS mdbx +# LIBRARY DESTINATION lib COMPONENT runtime +# RUNTIME DESTINATION bin COMPONENT runtime +# ARCHIVE DESTINATION lib/static COMPONENT devel +# PUBLIC_HEADER DESTINATION include +# INCLUDES DESTINATION include COMPONENT devel) ################################################################################ # diff --git a/contrib/db/libmdbx/src/tools/CMakeLists.txt b/contrib/db/libmdbx/src/tools/CMakeLists.txt index 01ecd7dd..fe5197b0 100644 --- a/contrib/db/libmdbx/src/tools/CMakeLists.txt +++ b/contrib/db/libmdbx/src/tools/CMakeLists.txt @@ -32,8 +32,8 @@ foreach(TOOL ${MDBX_TOOLS}) C_STANDARD ${MDBX_C_STANDARD} C_STANDARD_REQUIRED ON INTERPROCEDURAL_OPTIMIZATION $) - install(TARGETS ${TOOL} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT mdbx) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../man1/${TOOL}.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/man/man1 COMPONENT mdbx) +# install(TARGETS ${TOOL} DESTINATION ${CMAKE_INSTALL_PREFIX}/bin COMPONENT mdbx) +# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../man1/${TOOL}.1 DESTINATION ${CMAKE_INSTALL_PREFIX}/man/man1 COMPONENT mdbx) endforeach() if(LIB_MATH) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4cfb615f..e98dab7a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -189,3 +189,6 @@ else () set_property(TARGET connectivity_tool PROPERTY OUTPUT_NAME "lethean-testnet-chain-tool") endif () +install(TARGETS daemon simplewallet + RUNTIME DESTINATION bin) + From 36c38ab9c84b13394ef5c0e73675684568ce7af5 Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 28 Sep 2025 16:33:18 +0100 Subject: [PATCH 45/66] Update build system and version to 6.0.0 Refactored GitHub Actions workflows to upload specific package formats for each platform and standardized the release build process. Updated CMake and Makefile to support a configurable build version, now set to 6.0.0. Adjusted config and version headers to reflect the new versioning scheme and improved package configuration. --- .github/workflows/build-linux.yml | 18 +++++++++++------- .github/workflows/build-macos-arm64.yml | 11 +++++++++-- .github/workflows/build-macos-intel.yml | 19 ++++++++++++------- .github/workflows/build-windows.yml | 15 ++++++++++----- CMakeLists.txt | 10 +++++----- Makefile | 3 ++- cmake/ChainConfig.cmake | 2 +- cmake/config-vars.cmake | 2 +- src/CMakeLists.txt | 1 - src/version.h.in | 8 ++++---- 10 files changed, 55 insertions(+), 34 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 66d0eada..4a07e594 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -31,12 +31,16 @@ jobs: cache_packages: true - name: Compile Release - run: make gcc-linux-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - name: CLI Artifacts - uses: ./.github/actions/upload-artifacts + - uses: actions/upload-artifact@v4 with: - chain-network: ${{ inputs.chain-network }} - assets: lethean-* - asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/gcc-linux-x86_64/src + path: ${{ github.workspace }}/build/release/packages/lethean-*.deb + + - uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/build/release/packages/lethean-*.tar.xz + + - uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/build/release/packages/lethean-*.zip diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index d718ac43..004d94dc 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -36,8 +36,15 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: "${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}apple-clang-armv8" - path: ${{ github.workspace }}/build/release/packages/lethean-* + path: ${{ github.workspace }}/build/release/packages/lethean-*.pkg + + - uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/build/release/packages/lethean-*.tar.xz + + - uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/build/release/packages/lethean-*.zip # - name: CLI Artifacts # uses: ./.github/actions/upload-artifacts diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index 002094c8..ef4dbbf9 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -28,12 +28,17 @@ jobs: cache_packages: true - name: Compile Release - run: make apple-clang-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - name: CLI Artifacts - uses: ./.github/actions/upload-artifacts + - uses: actions/upload-artifact@v4 with: - chain-network: ${{ inputs.chain-network }} - assets: lethean-* - asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/apple-clang-x86_64/src + path: ${{ github.workspace }}/build/release/packages/lethean-*.pkg + + - uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/build/release/packages/lethean-*.tar.xz + + - uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/build/release/packages/lethean-*.zip + diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index 75c5b2b5..e95b57ba 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -29,14 +29,19 @@ jobs: - name: Compile Release run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} -# -# - name: Compile Release -# run: make msvc-194-x86_64 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - uses: actions/upload-artifact@v4 with: - name: "${{ inputs.chain-network == 'testnet' && 'testnet-' || '' }}cli-msvc-194-x86_64" - path: ${{ github.workspace }}/build/release/packages/lethean-* + path: ${{ github.workspace }}/build/release/packages/lethean-*.msi + + - uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/build/release/packages/lethean-*.tar.xz + + - uses: actions/upload-artifact@v4 + with: + path: ${{ github.workspace }}/build/release/packages/lethean-*.zip + # - name: CLI Artifacts # uses: ./.github/actions/upload-artifacts # with: diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ac781f4..1f00c0f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,9 @@ cmake_minimum_required(VERSION 3.16) set(DISABLE_TOR TRUE CACHE BOOL "Disable TOR library(and related tor-connect submodule)") PROJECT(Lethean) -set(VERSION "1.0") + +set(VERSION "1.0" CACHE STRING "Build version") + message("OPENSSL_INCLUDE_DIR: ${OPENSSL_INCLUDE_DIR}") message("OPENSSL_CRYPTO_LIBRARY: ${OPENSSL_CRYPTO_LIBRARY}") @@ -266,10 +268,6 @@ elseif(NOT MSVC AND NOT APPLE AND NOT CAKEWALLET AND STATIC) list(APPEND Boost_LIBRARIES icui18n.a icuuc.a icudata.a dl) endif() -if(BUILD_GUI) - find_package(Qt6 REQUIRED COMPONENTS Core5Compat Widgets WebEngineWidgets WebChannel PrintSupport) - message(STATUS "Found QT Packages") -endif() set(COMMIT_ID_IN_VERSION ON CACHE BOOL "Include commit ID in version") file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/version") @@ -297,6 +295,8 @@ else() endif() endif() +include(ChainConfig) + set(BUILD_TESTS FALSE CACHE BOOL "Build Lethean tests") set(DISABLE_MDBX FALSE CACHE BOOL "Exclude mdbx from build(need for a first time)") if(NOT DISABLE_MDBX) diff --git a/Makefile b/Makefile index 12acefab..4004b639 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,7 @@ CPU_CORES := 1 TESTNET:= 0 BUILD_TYPE ?=Release +BUILD_VERSION:=6.0.0 # ----------------------------------------------------------------- # Unix‑like systems (Linux, macOS, *BSD, etc.) @@ -82,7 +83,7 @@ all: help release: conan-profile-detect @echo "Building profile: release $(TESTNET)" CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release --build=missing -s build_type=$(BUILD_TYPE) - cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DTESTNET=$(TESTNET) + cmake -S . -B build/release -DCMAKE_TOOLCHAIN_FILE=build/release/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -DTESTNET=$(TESTNET) -DBUILD_VERSION=$(BUILD_VERSION) cmake --build build/release --config=$(BUILD_TYPE) --parallel=$(CPU_CORES) (cd build/release && cpack) diff --git a/cmake/ChainConfig.cmake b/cmake/ChainConfig.cmake index 89d6823f..3eb3716c 100644 --- a/cmake/ChainConfig.cmake +++ b/cmake/ChainConfig.cmake @@ -4,7 +4,7 @@ include_directories (${CMAKE_BINARY_DIR}/src ${CMAKE_BINARY_DIR}/src/currency_co include(${CMAKE_SOURCE_DIR}/cmake/config-vars.cmake) #include(${CMAKE_SOURCE_DIR}/cmake/currency_configs/example.cmake) include(${CMAKE_SOURCE_DIR}/cmake/check-config-vars.cmake) -configure_file("currency_core/currency_config.h.in" "currency_core/currency_config.h") +configure_file("src/currency_core/currency_config.h.in" "src/currency_core/currency_config.h") # CAUTION - wallet generation will only work properly in UNIX line environment set(GENERATE_FRESH_GENESIS OFF CACHE BOOL "Generate new genesis block") diff --git a/cmake/config-vars.cmake b/cmake/config-vars.cmake index 5b48dce0..1a5e62b7 100644 --- a/cmake/config-vars.cmake +++ b/cmake/config-vars.cmake @@ -42,7 +42,7 @@ endif () # installer config set(package_vendor "Lethean Community" CACHE STRING "CPACK_PACKAGE_VENDOR" ) set(package_description "A privacy‑preserving blockchain node" CACHE STRING "CPACK_PACKAGE_DESCRIPTION_SUMMARY" ) -set(package_version "1.0.0" CACHE STRING "CPACK_PACKAGE_VERSION" ) +set(package_version "${BUILD_VERSION}" CACHE STRING "CPACK_PACKAGE_VERSION" ) set(package_contact "support@lt.hn" CACHE STRING "CPACK_PACKAGE_CONTACT" ) set(package_website "https://github.com/letheanVPN/blockchain" CACHE STRING "CPACK_PACKAGE_HOMEPAGE_URL" ) set(package_macos_installer "PKG" CACHE STRING "CPACK_GENERATOR" ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e98dab7a..f989e9f6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -50,7 +50,6 @@ MACRO(ENABLE_SHARED_PCH_EXECUTABLE target) ENDMACRO(ENABLE_SHARED_PCH_EXECUTABLE) ##### End of Precompiled Headers macros ###### -include(ChainConfig) file(GLOB_RECURSE PCH pch/*) file(GLOB_RECURSE COMMON common/*) diff --git a/src/version.h.in b/src/version.h.in index 3112b961..8149ce53 100644 --- a/src/version.h.in +++ b/src/version.h.in @@ -3,11 +3,11 @@ #define BUILD_COMMIT_ID "@VERSION@" -#define PROJECT_MAJOR_VERSION "2" -#define PROJECT_MINOR_VERSION "1" -#define PROJECT_REVISION "8" +#define PROJECT_MAJOR_VERSION "6" +#define PROJECT_MINOR_VERSION "0" +#define PROJECT_REVISION "0" #define PROJECT_VERSION PROJECT_MAJOR_VERSION "." PROJECT_MINOR_VERSION "." PROJECT_REVISION -#define PROJECT_VERSION_BUILD_NO 428 +#define PROJECT_VERSION_BUILD_NO 1 #define PROJECT_VERSION_BUILD_NO_STR STRINGIFY_EXPAND(PROJECT_VERSION_BUILD_NO) #define PROJECT_VERSION_LONG PROJECT_VERSION "." PROJECT_VERSION_BUILD_NO_STR "[" BUILD_COMMIT_ID "]" From 261b300f4fe10652ea339ba7218ad5b219291a1e Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 28 Sep 2025 16:48:25 +0100 Subject: [PATCH 46/66] Refactor artifact upload in build workflows Replaces multiple uses of actions/upload-artifact with a single custom upload-artifacts action in Linux, macOS, and Windows build workflows. This change simplifies artifact handling and standardizes the upload process across platforms. --- .github/workflows/build-linux.yml | 16 ++++++---------- .github/workflows/build-macos-arm64.yml | 23 ++++++----------------- .github/workflows/build-macos-intel.yml | 17 ++++++----------- .github/workflows/build-windows.yml | 24 ++++++------------------ 4 files changed, 24 insertions(+), 56 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 4a07e594..6a5debf2 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -33,14 +33,10 @@ jobs: - name: Compile Release run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - uses: actions/upload-artifact@v4 + - name: CLI Artifacts + uses: ./.github/actions/upload-artifacts with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.deb - - - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.tar.xz - - - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.zip + chain-network: ${{ inputs.chain-network }} + assets: lethean-* + asset-type: 'cli' + asset-directory: ${{ github.workspace }}/build/release/packages diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index 004d94dc..28cdb67a 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -34,22 +34,11 @@ jobs: - name: Compile Release run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.pkg - - uses: actions/upload-artifact@v4 + - name: CLI Artifacts + uses: ./.github/actions/upload-artifacts with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.tar.xz - - - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.zip - -# - name: CLI Artifacts -# uses: ./.github/actions/upload-artifacts -# with: -# chain-network: ${{ inputs.chain-network }} -# assets: lethean-* -# asset-type: 'cli' -# asset-directory: ${{ github.workspace }}/build/apple-clang-armv8/src \ No newline at end of file + chain-network: ${{ inputs.chain-network }} + assets: lethean-* + asset-type: 'cli' + asset-directory: ${{ github.workspace }}/build/release/packages diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index ef4dbbf9..28ccd11a 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -30,15 +30,10 @@ jobs: - name: Compile Release run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - uses: actions/upload-artifact@v4 + - name: CLI Artifacts + uses: ./.github/actions/upload-artifacts with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.pkg - - - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.tar.xz - - - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.zip - + chain-network: ${{ inputs.chain-network }} + assets: lethean-* + asset-type: 'cli' + asset-directory: ${{ github.workspace }}/build/release/packages diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index e95b57ba..b9a86dc0 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -30,22 +30,10 @@ jobs: - name: Compile Release run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - uses: actions/upload-artifact@v4 + - name: CLI Artifacts + uses: ./.github/actions/upload-artifacts with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.msi - - - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.tar.xz - - - uses: actions/upload-artifact@v4 - with: - path: ${{ github.workspace }}/build/release/packages/lethean-*.zip - -# - name: CLI Artifacts -# uses: ./.github/actions/upload-artifacts -# with: -# chain-network: ${{ inputs.chain-network }} -# assets: lethean-* -# asset-type: 'cli' -# asset-directory: ${{ github.workspace }}/build/release/packages + chain-network: ${{ inputs.chain-network }} + assets: lethean-* + asset-type: 'cli' + asset-directory: ${{ github.workspace }}/build/release/packages From 4ed552d33211b232e850bd659374c2d7944aec7e Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 28 Sep 2025 17:33:37 +0100 Subject: [PATCH 47/66] Update CMake configs and improve packaging messages Changed release build flags in CMakeLists.txt to suppress all warnings with '-w'. Updated CPackConfig.cmake to use 'message(STATUS ...)' for clearer status output and improved consistency. Removed unused COMPONENT argument from documentation install step in DocBuilder.cmake. --- CMakeLists.txt | 2 +- cmake/CPackConfig.cmake | 14 +++++++------- cmake/DocBuilder.cmake | 3 +-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1f00c0f5..95c6a913 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -212,7 +212,7 @@ else() else() set(DEBUG_FLAGS "-g3 -O0") endif() - set(RELEASE_FLAGS "-O3 -ffast-math -DNDEBUG -Wno-unused-variable") + set(RELEASE_FLAGS "-O3 -ffast-math -DNDEBUG -w") if(NOT APPLE AND NOT (CMAKE_SYSTEM_NAME STREQUAL "Android")) set(RELEASE_FLAGS "${RELEASE_FLAGS} -flto=auto -g3") diff --git a/cmake/CPackConfig.cmake b/cmake/CPackConfig.cmake index 08a4ab4c..e5f43fe7 100644 --- a/cmake/CPackConfig.cmake +++ b/cmake/CPackConfig.cmake @@ -18,22 +18,22 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CPACK_GENERATOR "DragNDrop") # set(CPACK_DMG_BACKGROUND_IMAGE "${CMAKE_SOURCE_DIR}/resources/dmg_background.png") set(CPACK_DMG_VOLUME_NAME "${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}") - message("Registered CPACK_GENERATOR: DragNDrop") + message(STATUS "Registered CPACK_GENERATOR: DragNDrop") else () set(CPACK_GENERATOR "productbuild") set(CPACK_PRODUCTBUILD_IDENTIFIER "${package_macos_pkg_productbuild_identifier}") # set(CPACK_PRODUCTBUILD_SIGNING_IDENTITY "Developer ID Installer: Your Company (TEAMID)") - message("Registered CPACK_GENERATOR: productbuild") + message(STATUS "Registered CPACK_GENERATOR: productbuild") endif () elseif(WIN32) set(CPACK_GENERATOR "WIX") - message("Registered CPACK_GENERATOR: WIX") + message(STATUS "Registered CPACK_GENERATOR: WIX") # set(CPACK_WIX_PRODUCT_ICON "${CMAKE_SOURCE_DIR}/resources/windows_icon.ico") # set(CPACK_WIX_LICENSE_RTF "${CMAKE_SOURCE_DIR}/LICENSE.rtf") # set(CPACK_WIX_UPGRADE_GUID "D3F5A9C1-4B2E-4F5A-9C71-123456789ABC") # change once per major version else() set(CPACK_GENERATOR "DEB") - message("Registered CPACK_GENERATOR: deb") + message(STATUS "Registered CPACK_GENERATOR: deb") set(CPACK_DEBIAN_PACKAGE_MAINTAINER "${package_contact}") set(CPACK_DEBIAN_PACKAGE_DEPENDS "libc6 (>= 2.28)") set(CPACK_DEBIAN_PACKAGE_SECTION "utils") @@ -44,14 +44,14 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release") endif() list(APPEND CPACK_GENERATOR "TXZ" "ZIP") - message( "Registered CPACK_GENERATOR: tgz") - message( "Registered CPACK_GENERATOR: zip") + message(STATUS "Registered CPACK_GENERATOR: tgz") + message(STATUS "Registered CPACK_GENERATOR: zip") set(CPACK_INCLUDE_TOPLEVEL_DIRECTORY OFF) set(CPACK_ARCHIVE_COMPONENT_INSTALL OFF) set(CPACK_COMPONENTS_ALL) set(CPACK_GENERATE_SHASUM ON) set(CPACK_SHASUM_ALGORITHM SHA256) - message( "Using SHA256 Checksums") + message(STATUS "Using SHA256 Checksums") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE.txt") # set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") diff --git a/cmake/DocBuilder.cmake b/cmake/DocBuilder.cmake index c5b13c31..c02ad658 100644 --- a/cmake/DocBuilder.cmake +++ b/cmake/DocBuilder.cmake @@ -18,8 +18,7 @@ add_custom_target(docs # Optional install step install(DIRECTORY "${MKDOCS_OUT}/" - DESTINATION "share/doc/${PROJECT_NAME}" - COMPONENT docs) + DESTINATION "share/doc/${PROJECT_NAME}") add_custom_target(install-docs DEPENDS docs From ef016f50fbe0191b2a93e7e70cdbe5b345e334e1 Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 28 Sep 2025 17:49:17 +0100 Subject: [PATCH 48/66] Add SDK folder caching to build workflows Introduces actions/cache to cache the build/sdk folder in Linux, macOS (Intel and ARM64), and Windows GitHub Actions workflows. Disables Conan's internal package caching in favor of the new cache step to improve build performance and consistency. --- .github/workflows/build-linux.yml | 8 +++++++- .github/workflows/build-macos-arm64.yml | 9 ++++++++- .github/workflows/build-macos-intel.yml | 9 ++++++++- .github/workflows/build-windows.yml | 8 +++++++- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 6a5debf2..89094a1b 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -24,11 +24,17 @@ jobs: - name: install dependencies run: sudo apt-get install -y autotools-dev git build-essential + - name: Cache SDK Folder + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/build/sdk + key: ${{ runner.os }}-sdk + - name: Install Conan uses: conan-io/setup-conan@v1 with: home: ${{ github.workspace }}/build/sdk - cache_packages: true + cache_packages: false - name: Compile Release run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index 28cdb67a..c549e0f7 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -22,11 +22,18 @@ jobs: fetch-depth: 0 submodules: recursive + + - name: Cache SDK Folder + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/build/sdk + key: ${{ runner.os }}-sdk + - name: Install Conan uses: conan-io/setup-conan@v1 with: home: ${{ github.workspace }}/build/sdk - cache_packages: true + cache_packages: false # - name: Compile Release # run: make apple-clang-armv8 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index 28ccd11a..c664a3ce 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -21,11 +21,18 @@ jobs: fetch-depth: 0 submodules: recursive + + - name: Cache SDK Folder + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/build/sdk + key: ${{ runner.os }}-sdk + - name: Install Conan uses: conan-io/setup-conan@v1 with: home: ${{ github.workspace }}/build/sdk - cache_packages: true + cache_packages: false - name: Compile Release run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows.yml index b9a86dc0..ba6db426 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows.yml @@ -21,11 +21,17 @@ jobs: fetch-depth: 0 submodules: recursive + - name: Cache SDK Folder + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/build/sdk + key: ${{ runner.os }}-sdk + - name: Install Conan uses: conan-io/setup-conan@v1 with: home: ${{ github.workspace }}/build/sdk - cache_packages: true + cache_packages: false - name: Compile Release run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} From 76d33a74b1bfc01d1430d563fdac891b93275031 Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 28 Sep 2025 18:34:57 +0100 Subject: [PATCH 49/66] Add ARM64 build workflows and refactor CI for multi-arch Introduced separate build workflows for Linux and Windows ARM64 architectures. Renamed existing Intel build workflows for clarity and updated the main workflow to trigger both Intel and ARM64 builds for Linux and Windows. Improved caching by including architecture in cache keys and set CPU_CORES for release builds across all platforms. --- .github/workflows/_on-push.yml | 20 ++++++-- .github/workflows/build-linux-arm64.yml | 48 +++++++++++++++++++ ...{build-linux.yml => build-linux-intel.yml} | 4 +- .github/workflows/build-macos-arm64.yml | 4 +- .github/workflows/build-macos-intel.yml | 4 +- .github/workflows/build-windows-arm64.yml | 45 +++++++++++++++++ ...ld-windows.yml => build-windows-intel.yml} | 4 +- 7 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/build-linux-arm64.yml rename .github/workflows/{build-linux.yml => build-linux-intel.yml} (88%) create mode 100644 .github/workflows/build-windows-arm64.yml rename .github/workflows/{build-windows.yml => build-windows-intel.yml} (87%) diff --git a/.github/workflows/_on-push.yml b/.github/workflows/_on-push.yml index 036ea78e..6af0f647 100644 --- a/.github/workflows/_on-push.yml +++ b/.github/workflows/_on-push.yml @@ -16,15 +16,27 @@ concurrency: cancel-in-progress: true jobs: - build-linux: + build-linux-intel: name: Chain - uses: ./.github/workflows/build-linux.yml + uses: ./.github/workflows/build-linux-intel.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} - build-windows: + build-linux-arm: name: Chain - uses: ./.github/workflows/build-windows.yml + uses: ./.github/workflows/build-linux-arm64.yml + with: + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + + build-windows-intel: + name: Chain + uses: ./.github/workflows/build-windows-intel.yml + with: + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + + build-windows-arm: + name: Chain + uses: ./.github/workflows/build-windows-arm64.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} diff --git a/.github/workflows/build-linux-arm64.yml b/.github/workflows/build-linux-arm64.yml new file mode 100644 index 00000000..8e27fa66 --- /dev/null +++ b/.github/workflows/build-linux-arm64.yml @@ -0,0 +1,48 @@ +name: Linux +permissions: + contents: read +on: + workflow_call: + inputs: + chain-network: + description: "The network to use, can either be testnet, stagenet or mainnet" + default: testnet + required: false + type: string + +jobs: + build: + name: gcc-linux-arm64 + runs-on: ubuntu-22.04-arm + steps: + - name: Checkout Project + uses: actions/checkout@v4.2.2 + with: + fetch-depth: 0 + submodules: recursive + + - name: install dependencies + run: sudo apt-get install -y autotools-dev git build-essential + + - name: Cache SDK Folder + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/build/sdk + key: ${{ runner.os }}-${{ runner.arch }}-sdk + + - name: Install Conan + uses: conan-io/setup-conan@v1 + with: + home: ${{ github.workspace }}/build/sdk + cache_packages: false + + - name: Compile Release + run: make release CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + + - name: CLI Artifacts + uses: ./.github/actions/upload-artifacts + with: + chain-network: ${{ inputs.chain-network }} + assets: lethean-* + asset-type: 'cli' + asset-directory: ${{ github.workspace }}/build/release/packages diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux-intel.yml similarity index 88% rename from .github/workflows/build-linux.yml rename to .github/workflows/build-linux-intel.yml index 89094a1b..63390528 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux-intel.yml @@ -28,7 +28,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ github.workspace }}/build/sdk - key: ${{ runner.os }}-sdk + key: ${{ runner.os }}-${{ runner.arch }}-sdk - name: Install Conan uses: conan-io/setup-conan@v1 @@ -37,7 +37,7 @@ jobs: cache_packages: false - name: Compile Release - run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make release CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index c549e0f7..de10e2fb 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -27,7 +27,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ github.workspace }}/build/sdk - key: ${{ runner.os }}-sdk + key: ${{ runner.os }}-${{ runner.arch }}-sdk - name: Install Conan uses: conan-io/setup-conan@v1 @@ -39,7 +39,7 @@ jobs: # run: make apple-clang-armv8 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: Compile Release - run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make release CPU_CORES=3 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index c664a3ce..72913593 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -26,7 +26,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ github.workspace }}/build/sdk - key: ${{ runner.os }}-sdk + key: ${{ runner.os }}-${{ runner.arch }}-sdk - name: Install Conan uses: conan-io/setup-conan@v1 @@ -35,7 +35,7 @@ jobs: cache_packages: false - name: Compile Release - run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make release CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts diff --git a/.github/workflows/build-windows-arm64.yml b/.github/workflows/build-windows-arm64.yml new file mode 100644 index 00000000..c48559f4 --- /dev/null +++ b/.github/workflows/build-windows-arm64.yml @@ -0,0 +1,45 @@ +name: build-windows +permissions: + contents: read +on: + workflow_call: + inputs: + chain-network: + description: "The network to use, can either be testnet, stagenet or mainnet" + default: testnet + required: false + type: string + +jobs: + msvc-194: + name: msvc-194-arm64 + runs-on: windows-11-arm + steps: + - name: Checkout Project + uses: actions/checkout@v4.2.2 + with: + fetch-depth: 0 + submodules: recursive + + - name: Cache SDK Folder + uses: actions/cache@v4 + with: + path: ${{ github.workspace }}/build/sdk + key: ${{ runner.os }}-${{ runner.arch }}-sdk + + - name: Install Conan + uses: conan-io/setup-conan@v1 + with: + home: ${{ github.workspace }}/build/sdk + cache_packages: false + + - name: Compile Release + run: make release CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + + - name: CLI Artifacts + uses: ./.github/actions/upload-artifacts + with: + chain-network: ${{ inputs.chain-network }} + assets: lethean-* + asset-type: 'cli' + asset-directory: ${{ github.workspace }}/build/release/packages diff --git a/.github/workflows/build-windows.yml b/.github/workflows/build-windows-intel.yml similarity index 87% rename from .github/workflows/build-windows.yml rename to .github/workflows/build-windows-intel.yml index ba6db426..66c9ab1e 100644 --- a/.github/workflows/build-windows.yml +++ b/.github/workflows/build-windows-intel.yml @@ -25,7 +25,7 @@ jobs: uses: actions/cache@v4 with: path: ${{ github.workspace }}/build/sdk - key: ${{ runner.os }}-sdk + key: ${{ runner.os }}-${{ runner.arch }}-sdk - name: Install Conan uses: conan-io/setup-conan@v1 @@ -34,7 +34,7 @@ jobs: cache_packages: false - name: Compile Release - run: make release TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} + run: make release CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - name: CLI Artifacts uses: ./.github/actions/upload-artifacts From fa721d18372b2edd2f42c14efdc46f20ffe163cc Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 28 Sep 2025 19:23:40 +0100 Subject: [PATCH 50/66] Remove Windows ARM64 build workflow Deleted the build-windows-arm64.yml workflow and its invocation from _on-push.yml. This removes support for building on Windows ARM64, possibly due to deprecation or lack of necessity. --- .github/workflows/_on-push.yml | 6 --- .github/workflows/build-windows-arm64.yml | 45 ----------------------- 2 files changed, 51 deletions(-) delete mode 100644 .github/workflows/build-windows-arm64.yml diff --git a/.github/workflows/_on-push.yml b/.github/workflows/_on-push.yml index 6af0f647..eb13681b 100644 --- a/.github/workflows/_on-push.yml +++ b/.github/workflows/_on-push.yml @@ -34,12 +34,6 @@ jobs: with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} - build-windows-arm: - name: Chain - uses: ./.github/workflows/build-windows-arm64.yml - with: - chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} - build-macos-arm64: name: Chain uses: ./.github/workflows/build-macos-arm64.yml diff --git a/.github/workflows/build-windows-arm64.yml b/.github/workflows/build-windows-arm64.yml deleted file mode 100644 index c48559f4..00000000 --- a/.github/workflows/build-windows-arm64.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: build-windows -permissions: - contents: read -on: - workflow_call: - inputs: - chain-network: - description: "The network to use, can either be testnet, stagenet or mainnet" - default: testnet - required: false - type: string - -jobs: - msvc-194: - name: msvc-194-arm64 - runs-on: windows-11-arm - steps: - - name: Checkout Project - uses: actions/checkout@v4.2.2 - with: - fetch-depth: 0 - submodules: recursive - - - name: Cache SDK Folder - uses: actions/cache@v4 - with: - path: ${{ github.workspace }}/build/sdk - key: ${{ runner.os }}-${{ runner.arch }}-sdk - - - name: Install Conan - uses: conan-io/setup-conan@v1 - with: - home: ${{ github.workspace }}/build/sdk - cache_packages: false - - - name: Compile Release - run: make release CPU_CORES=4 TESTNET=${{ inputs.chain-network == 'testnet' && '1' || '0' }} - - - name: CLI Artifacts - uses: ./.github/actions/upload-artifacts - with: - chain-network: ${{ inputs.chain-network }} - assets: lethean-* - asset-type: 'cli' - asset-directory: ${{ github.workspace }}/build/release/packages From c001204629371a4d7b2b85791b234a1eb3720f79 Mon Sep 17 00:00:00 2001 From: Snider Date: Sun, 28 Sep 2025 20:00:04 +0100 Subject: [PATCH 51/66] Update LICENSE.txt --- LICENSE.txt | 289 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 284 insertions(+), 5 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 171d1de5..de0a6513 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,9 +1,288 @@ -Copyright (C) 2024 Zano project + EUROPEAN UNION PUBLIC LICENCE v. 1.2 + EUPL © the European Union 2007, 2016 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined +below) which is provided under the terms of this Licence. Any use of the Work, +other than as authorised under this Licence is prohibited (to the extent such +use is covered by a right of the copyright holder of the Work). -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +The Work is provided under the terms of this Licence when the Licensor (as +defined below) has placed the following notice immediately following the +copyright notice for the Work: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ZANO PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + Licensed under the EUPL + +or has expressed by any other means his willingness to license under the EUPL. + +1. Definitions + +In this Licence, the following terms have the following meaning: + +- ‘The Licence’: this Licence. + +- ‘The Original Work’: the work or software distributed or communicated by the + Licensor under this Licence, available as Source Code and also as Executable + Code as the case may be. + +- ‘Derivative Works’: the works or software that could be created by the + Licensee, based upon the Original Work or modifications thereof. This Licence + does not define the extent of modification or dependence on the Original Work + required in order to classify a work as a Derivative Work; this extent is + determined by copyright law applicable in the country mentioned in Article 15. + +- ‘The Work’: the Original Work or its Derivative Works. + +- ‘The Source Code’: the human-readable form of the Work which is the most + convenient for people to study and modify. + +- ‘The Executable Code’: any code which has generally been compiled and which is + meant to be interpreted by a computer as a program. + +- ‘The Licensor’: the natural or legal person that distributes or communicates + the Work under the Licence. + +- ‘Contributor(s)’: any natural or legal person who modifies the Work under the + Licence, or otherwise contributes to the creation of a Derivative Work. + +- ‘The Licensee’ or ‘You’: any natural or legal person who makes any usage of + the Work under the terms of the Licence. + +- ‘Distribution’ or ‘Communication’: any act of selling, giving, lending, + renting, distributing, communicating, transmitting, or otherwise making + available, online or offline, copies of the Work or providing access to its + essential functionalities at the disposal of any other natural or legal + person. + +2. Scope of the rights granted by the Licence + +The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +sublicensable licence to do the following, for the duration of copyright vested +in the Original Work: + +- use the Work in any circumstance and for all usage, +- reproduce the Work, +- modify the Work, and make Derivative Works based upon the Work, +- communicate to the public, including the right to make available or display + the Work or copies thereof to the public and perform publicly, as the case may + be, the Work, +- distribute the Work or copies thereof, +- lend and rent the Work or copies thereof, +- sublicense rights in the Work or copies thereof. + +Those rights can be exercised on any media, supports and formats, whether now +known or later invented, as far as the applicable law permits so. + +In the countries where moral rights apply, the Licensor waives his right to +exercise his moral right to the extent allowed by law in order to make effective +the licence of the economic rights here above listed. + +The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to +any patents held by the Licensor, to the extent necessary to make use of the +rights granted on the Work under this Licence. + +3. Communication of the Source Code + +The Licensor may provide the Work either in its Source Code form, or as +Executable Code. If the Work is provided as Executable Code, the Licensor +provides in addition a machine-readable copy of the Source Code of the Work +along with each copy of the Work that the Licensor distributes or indicates, in +a notice following the copyright notice attached to the Work, a repository where +the Source Code is easily and freely accessible for as long as the Licensor +continues to distribute or communicate the Work. + +4. Limitations on copyright + +Nothing in this Licence is intended to deprive the Licensee of the benefits from +any exception or limitation to the exclusive rights of the rights owners in the +Work, of the exhaustion of those rights or of other applicable limitations +thereto. + +5. Obligations of the Licensee + +The grant of the rights mentioned above is subject to some restrictions and +obligations imposed on the Licensee. Those obligations are the following: + +Attribution right: The Licensee shall keep intact all copyright, patent or +trademarks notices and all notices that refer to the Licence and to the +disclaimer of warranties. The Licensee must include a copy of such notices and a +copy of the Licence with every copy of the Work he/she distributes or +communicates. The Licensee must cause any Derivative Work to carry prominent +notices stating that the Work has been modified and the date of modification. + +Copyleft clause: If the Licensee distributes or communicates copies of the +Original Works or Derivative Works, this Distribution or Communication will be +done under the terms of this Licence or of a later version of this Licence +unless the Original Work is expressly distributed only under this version of the +Licence — for example by communicating ‘EUPL v. 1.2 only’. The Licensee +(becoming Licensor) cannot offer or impose any additional terms or conditions on +the Work or Derivative Work that alter or restrict the terms of the Licence. + +Compatibility clause: If the Licensee Distributes or Communicates Derivative +Works or copies thereof based upon both the Work and another work licensed under +a Compatible Licence, this Distribution or Communication can be done under the +terms of this Compatible Licence. For the sake of this clause, ‘Compatible +Licence’ refers to the licences listed in the appendix attached to this Licence. +Should the Licensee's obligations under the Compatible Licence conflict with +his/her obligations under this Licence, the obligations of the Compatible +Licence shall prevail. + +Provision of Source Code: When distributing or communicating copies of the Work, +the Licensee will provide a machine-readable copy of the Source Code or indicate +a repository where this Source will be easily and freely available for as long +as the Licensee continues to distribute or communicate the Work. + +Legal Protection: This Licence does not grant permission to use the trade names, +trademarks, service marks, or names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the copyright notice. + +6. Chain of Authorship + +The original Licensor warrants that the copyright in the Original Work granted +hereunder is owned by him/her or licensed to him/her and that he/she has the +power and authority to grant the Licence. + +Each Contributor warrants that the copyright in the modifications he/she brings +to the Work are owned by him/her or licensed to him/her and that he/she has the +power and authority to grant the Licence. + +Each time You accept the Licence, the original Licensor and subsequent +Contributors grant You a licence to their contributions to the Work, under the +terms of this Licence. + +7. Disclaimer of Warranty + +The Work is a work in progress, which is continuously improved by numerous +Contributors. It is not a finished work and may therefore contain defects or +‘bugs’ inherent to this type of development. + +For the above reason, the Work is provided under the Licence on an ‘as is’ basis +and without warranties of any kind concerning the Work, including without +limitation merchantability, fitness for a particular purpose, absence of defects +or errors, accuracy, non-infringement of intellectual property rights other than +copyright as stated in Article 6 of this Licence. + +This disclaimer of warranty is an essential part of the Licence and a condition +for the grant of any rights to the Work. + +8. Disclaimer of Liability + +Except in the cases of wilful misconduct or damages directly caused to natural +persons, the Licensor will in no event be liable for any direct or indirect, +material or moral, damages of any kind, arising out of the Licence or of the use +of the Work, including without limitation, damages for loss of goodwill, work +stoppage, computer failure or malfunction, loss of data or any commercial +damage, even if the Licensor has been advised of the possibility of such damage. +However, the Licensor will be liable under statutory product liability laws as +far such laws apply to the Work. + +9. Additional agreements + +While distributing the Work, You may choose to conclude an additional agreement, +defining obligations or services consistent with this Licence. However, if +accepting obligations, You may act only on your own behalf and on your sole +responsibility, not on behalf of the original Licensor or any other Contributor, +and only if You agree to indemnify, defend, and hold each Contributor harmless +for any liability incurred by, or claims asserted against such Contributor by +the fact You have accepted any warranty or additional liability. + +10. Acceptance of the Licence + +The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ +placed under the bottom of a window displaying the text of this Licence or by +affirming consent in any other similar way, in accordance with the rules of +applicable law. Clicking on that icon indicates your clear and irrevocable +acceptance of this Licence and all of its terms and conditions. + +Similarly, you irrevocably accept this Licence and all of its terms and +conditions by exercising any rights granted to You by Article 2 of this Licence, +such as the use of the Work, the creation by You of a Derivative Work or the +Distribution or Communication by You of the Work or copies thereof. + +11. Information to the public + +In case of any Distribution or Communication of the Work by means of electronic +communication by You (for example, by offering to download the Work from a +remote location) the distribution channel or media (for example, a website) must +at least provide to the public the information requested by the applicable law +regarding the Licensor, the Licence and the way it may be accessible, concluded, +stored and reproduced by the Licensee. + +12. Termination of the Licence + +The Licence and the rights granted hereunder will terminate automatically upon +any breach by the Licensee of the terms of the Licence. + +Such a termination will not terminate the licences of any person who has +received the Work from the Licensee under the Licence, provided such persons +remain in full compliance with the Licence. + +13. Miscellaneous + +Without prejudice of Article 9 above, the Licence represents the complete +agreement between the Parties as to the Work. + +If any provision of the Licence is invalid or unenforceable under applicable +law, this will not affect the validity or enforceability of the Licence as a +whole. Such provision will be construed or reformed so as necessary to make it +valid and enforceable. + +The European Commission may publish other linguistic versions or new versions of +this Licence or updated versions of the Appendix, so far this is required and +reasonable, without reducing the scope of the rights granted by the Licence. New +versions of the Licence will be published with a unique version number. + +All linguistic versions of this Licence, approved by the European Commission, +have identical value. Parties can take advantage of the linguistic version of +their choice. + +14. Jurisdiction + +Without prejudice to specific agreement between parties, + +- any litigation resulting from the interpretation of this License, arising + between the European Union institutions, bodies, offices or agencies, as a + Licensor, and any Licensee, will be subject to the jurisdiction of the Court + of Justice of the European Union, as laid down in article 272 of the Treaty on + the Functioning of the European Union, + +- any litigation arising between other parties and resulting from the + interpretation of this License, will be subject to the exclusive jurisdiction + of the competent court where the Licensor resides or conducts its primary + business. + +15. Applicable Law + +Without prejudice to specific agreement between parties, + +- this Licence shall be governed by the law of the European Union Member State + where the Licensor has his seat, resides or has his registered office, + +- this licence shall be governed by Belgian law if the Licensor has no seat, + residence or registered office inside a European Union Member State. + +Appendix + +‘Compatible Licences’ according to Article 5 EUPL are: + +- GNU General Public License (GPL) v. 2, v. 3 +- GNU Affero General Public License (AGPL) v. 3 +- Open Software License (OSL) v. 2.1, v. 3.0 +- Eclipse Public License (EPL) v. 1.0 +- CeCILL v. 2.0, v. 2.1 +- Mozilla Public Licence (MPL) v. 2 +- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 +- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for + works other than software +- European Union Public Licence (EUPL) v. 1.1, v. 1.2 +- Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong + Reciprocity (LiLiQ-R+). + +The European Commission may update this Appendix to later versions of the above +licences without producing a new version of the EUPL, as long as they provide +the rights granted in Article 2 of this Licence and protect the covered Source +Code from exclusive appropriation. + +All other changes or additions to this Appendix require the production of a new +EUPL version. -Except as contained in this notice, the name of Zano project shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Zano project. From 6a7b6dd2dfe4f989006b326a3552ebd45f0d6c79 Mon Sep 17 00:00:00 2001 From: Snider Date: Mon, 29 Sep 2025 19:04:52 +0100 Subject: [PATCH 52/66] Refactor config system and move currency_config.h Moved currency_config.h and related CMake/config files to a new src/config directory, creating a dedicated config CMake target. Updated all includes and build scripts to reference the new config location. Removed obsolete cmake/ChainConfig.cmake and example currency config, and restructured genesis generator and premine wallet logic into the new config system for improved modularity and maintainability. --- CMakeLists.txt | 4 +- cmake/CPackConfig.cmake | 2 +- cmake/ChainConfig.cmake | 64 ------------------- cmake/currency_configs/example.cmake | 20 ------ src/CMakeLists.txt | 36 ++++++----- src/common/command_line.cpp | 2 +- src/common/db_backend_selector.cpp | 2 +- src/common/miniupnp_helper.h | 2 +- src/common/util.cpp | 2 +- src/config/CMakeLists.txt | 63 ++++++++++++++++++ .../config/check-config.cmake | 0 .../currency_config.h.in | 0 .../config/default.cmake | 1 - src/crypto/one_out_of_many_proofs.cpp | 2 +- src/currency_core/basic_pow_helpers.cpp | 2 +- src/currency_core/blockchain_storage.cpp | 2 +- src/currency_core/currency_basic.h | 2 +- src/currency_core/currency_core.cpp | 2 +- src/currency_core/currency_format_utils.cpp | 2 +- src/currency_core/difficulty.cpp | 2 +- src/currency_core/tx_pool.cpp | 2 +- src/genesis_generator/CMakeLists.txt | 37 +++++++++++ src/p2p/net_node.h | 2 +- src/p2p/net_peerlist.h | 2 +- src/p2p/p2p_protocol_defs.h | 2 +- src/stratum/stratum_server.cpp | 2 +- src/wallet/plain_wallet_api.cpp | 2 +- 27 files changed, 139 insertions(+), 122 deletions(-) delete mode 100644 cmake/ChainConfig.cmake delete mode 100644 cmake/currency_configs/example.cmake create mode 100644 src/config/CMakeLists.txt rename cmake/check-config-vars.cmake => src/config/check-config.cmake (100%) rename src/{currency_core => config}/currency_config.h.in (100%) rename cmake/config-vars.cmake => src/config/default.cmake (99%) create mode 100644 src/genesis_generator/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 95c6a913..4e301d0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -295,8 +295,6 @@ else() endif() endif() -include(ChainConfig) - set(BUILD_TESTS FALSE CACHE BOOL "Build Lethean tests") set(DISABLE_MDBX FALSE CACHE BOOL "Exclude mdbx from build(need for a first time)") if(NOT DISABLE_MDBX) @@ -311,4 +309,4 @@ if (BUILD_TESTS) add_subdirectory(tests) endif() -include(CPackConfig) \ No newline at end of file +include(CPackConfig) diff --git a/cmake/CPackConfig.cmake b/cmake/CPackConfig.cmake index e5f43fe7..983dd181 100644 --- a/cmake/CPackConfig.cmake +++ b/cmake/CPackConfig.cmake @@ -1,4 +1,4 @@ -include(${CMAKE_SOURCE_DIR}/cmake/config-vars.cmake) +#include(${CMAKE_SOURCE_DIR}/cmake/config-vars.cmake) if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CPACK_PACKAGE_NAME "${package_name}") diff --git a/cmake/ChainConfig.cmake b/cmake/ChainConfig.cmake deleted file mode 100644 index 3eb3716c..00000000 --- a/cmake/ChainConfig.cmake +++ /dev/null @@ -1,64 +0,0 @@ - - -include_directories (${CMAKE_BINARY_DIR}/src ${CMAKE_BINARY_DIR}/src/currency_core) -include(${CMAKE_SOURCE_DIR}/cmake/config-vars.cmake) -#include(${CMAKE_SOURCE_DIR}/cmake/currency_configs/example.cmake) -include(${CMAKE_SOURCE_DIR}/cmake/check-config-vars.cmake) -configure_file("src/currency_core/currency_config.h.in" "src/currency_core/currency_config.h") - -# CAUTION - wallet generation will only work properly in UNIX line environment -set(GENERATE_FRESH_GENESIS OFF CACHE BOOL "Generate new genesis block") - -set(GENESIS_PREMINE_ADDRESS "" CACHE STRING "Premine wallet address") -set(GENESIS_PROOF "" CACHE STRING "Genesis proof string") - -set(GENERATE_PREMINE_WALLET OFF CACHE BOOL "Generate premine wallet") -set(PREMINE_WALLET_PASSWORD "" CACHE STRING "Premine wallet password") - -if (GENERATE_PREMINE_WALLET AND GENERATE_FRESH_GENESIS) - message(FATAL_ERROR "Genesis can not be generated together with premine wallet") -endif() - -if (GENERATE_PREMINE_WALLET) - unset(GENERATE_PREMINE_WALLET CACHE) - message(WARNING "Generating premine wallet") - - if (NOT DEFINED PREMINE_WALLET_PASSWORD OR PREMINE_WALLET_PASSWORD STREQUAL "") - message(FATAL_ERROR "set PREMINE_WALLET_PASSWORD or GENESIS_PREMINE_ADDRESS to generate genesis block") - endif() - - # Make wallet directory - add_custom_target( - premine_wallet - "${CMAKE_COMMAND}" -E make_directory "${CMAKE_SOURCE_DIR}/premine_wallet" - COMMENT "Creating premine wallet directory" - ) - - # Generate wallet - add_custom_command(TARGET premine_wallet POST_BUILD - COMMAND echo ${PREMINE_WALLET_PASSWORD} | ${CMAKE_BINARY_DIR}/src/lethean-wallet-cli --generate-new-wallet ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet - COMMENT "Generating premine wallet in ${CMAKE_SOURCE_DIR}/premine_wallet" - ) - - add_dependencies(premine_wallet simplewallet) -endif() - -if (GENERATE_FRESH_GENESIS) - unset(GENERATE_FRESH_GENESIS CACHE) - add_executable(genesis_generator ${GENESIS_GENERATOR}) - target_link_libraries(genesis_generator currency_core crypto common zlibstatic ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) - - if (NOT DEFINED GENESIS_PREMINE_ADDRESS OR GENESIS_PREMINE_ADDRESS STREQUAL "") - message(WARNING "GENESIS_PREMINE_ADDRESS not set, loading from ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet.address") - file(READ "${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet.address" GENESIS_PREMINE_ADDRESS) - if (NOT DEFINED GENESIS_PREMINE_ADDRESS OR GENESIS_PREMINE_ADDRESS STREQUAL "") - message(FATAL_ERROR "GENESIS_PREMINE_ADDRESS not set") - endif() - else() - add_custom_command(TARGET genesis_generator POST_BUILD - COMMAND ${CMAKE_BINARY_DIR}/src/genesis_generator --address ${GENESIS_PREMINE_ADDRESS} --proof ${GENESIS_PROOF} --output ${CMAKE_SOURCE_DIR}/src/currency_core/generated/ - COMMENT "Generating genesis data in ${CMAKE_SOURCE_DIR}/src/currency_core/" - ) - endif() - -endif() \ No newline at end of file diff --git a/cmake/currency_configs/example.cmake b/cmake/currency_configs/example.cmake deleted file mode 100644 index e9359b55..00000000 --- a/cmake/currency_configs/example.cmake +++ /dev/null @@ -1,20 +0,0 @@ -set(currency_display_decimal_point 12) -set(coin 1000000000000) -set(base_reward_dust_threshold 1000000) -set(default_dust_threshold 0) -set(tx_default_fee 10000000000) -set(tx_minimum_fee 10000000000) -set(difficulty_pow_starter 1) -set(difficulty_pos_target 120) -set(difficulty_pow_target 120) -set(difficulty_window 720) -set(difficulty_lag 15) -set(difficulty_cut 60) -set(p2p_default_port 36942) -set(rpc_default_port 36941) -set(stratum_default_port 36940) -set(p2p_maintainers_pub_key "8f138bb73f6d663a3746a542770781a09579a7b84cb4125249e95530824ee607") -set(currency_name_abr "NF") -set(currency_name_base "NotFake") -set(currency_name_short_base "NotFake") -set(premine_amount 4000000000000000000) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f989e9f6..77dd4a58 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -65,7 +65,6 @@ file(GLOB_RECURSE SIMPLEWALLET simplewallet/*) file(GLOB_RECURSE CONN_TOOL connectivity_tool/*) file(GLOB_RECURSE WALLET wallet/*) file(GLOB_RECURSE MINER miner/*) -file(GLOB_RECURSE GENESIS_GENERATOR genesis_generator/*) source_group(pch FILES ${PCH}) @@ -80,14 +79,16 @@ source_group(stratum FILES ${STRATUM}) source_group(simplewallet FILES ${SIMPLEWALLET}) source_group(connectivity-tool FILES ${CONN_TOOL}) source_group(wallet FILES ${WALLET}) -source_group(genesis_generator FILES ${GENESIS_GENERATOR}) INIT_SHARED_PCH() +add_subdirectory(config) +add_subdirectory(genesis_generator) + add_library(common ${COMMON}) -add_dependencies(common version ${PCH_LIB_NAME}) -target_link_libraries(common PUBLIC ${Boost_LIBRARIES}) +add_dependencies(common version config ${PCH_LIB_NAME}) +target_link_libraries(common PUBLIC ${Boost_LIBRARIES} config) ENABLE_SHARED_PCH(common COMMON) if(NOT MSVC AND NOT APPLE AND NOT CLANG) # TODO(unassigned): do we really need the clang equivalent? @@ -107,15 +108,16 @@ endif() add_library(crypto ${CRYPTO}) if(USE_BITCOIN_SECP256K1_FOR_ECDSA) - add_dependencies(crypto secp256k1) - target_link_libraries(crypto secp256k1 ${BCRYPT_LIB}) + add_dependencies(crypto secp256k1 config) + target_link_libraries(crypto config secp256k1 ${BCRYPT_LIB}) else() - add_dependencies(crypto OpenSSL::Crypto) - target_link_libraries(crypto OpenSSL::Crypto ${BCRYPT_LIB}) + add_dependencies(crypto OpenSSL::Crypto config) + target_link_libraries(crypto PUBLIC config OpenSSL::Crypto ${BCRYPT_LIB}) endif() add_library(currency_core ${CURRENCY_CORE}) -add_dependencies(currency_core version ${PCH_LIB_NAME}) +add_dependencies(currency_core version config ${PCH_LIB_NAME}) +target_link_libraries(currency_core config) ENABLE_SHARED_PCH(currency_core CURRENCY_CORE) add_library(wallet ${WALLET}) @@ -123,7 +125,8 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Android" ) add_dependencies(wallet version ${PCH_LIB_NAME}) target_link_libraries(wallet currency_core crypto common ZLIB::ZLIB ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} android log OpenSSL::SSL OpenSSL::Crypto) else() - add_dependencies(wallet version ${PCH_LIB_NAME}) + add_dependencies(wallet version config ${PCH_LIB_NAME}) + target_link_libraries(wallet config) ENABLE_SHARED_PCH(wallet WALLET) endif() @@ -146,25 +149,27 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Android") endif() add_library(rpc ${RPC}) -add_dependencies(rpc version ${PCH_LIB_NAME}) +add_dependencies(rpc version config ${PCH_LIB_NAME}) +target_link_libraries(rpc config) ENABLE_SHARED_PCH(rpc RPC) add_library(stratum ${STRATUM}) -add_dependencies(stratum version ${PCH_LIB_NAME}) +add_dependencies(stratum version config ${PCH_LIB_NAME}) +target_link_libraries(stratum config) ENABLE_SHARED_PCH(stratum STRATUM) -target_link_libraries(currency_core lmdb mdbx) +target_link_libraries(currency_core config lmdb mdbx) add_executable(daemon ${DAEMON} ${P2P} ${CURRENCY_PROTOCOL}) add_dependencies(daemon version) -target_link_libraries(daemon rpc stratum currency_core crypto common miniupnpc::miniupnpc ZLIB::ZLIB ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) +target_link_libraries(daemon rpc stratum currency_core crypto common miniupnpc::miniupnpc ZLIB::ZLIB ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) ENABLE_SHARED_PCH(daemon DAEMON) ENABLE_SHARED_PCH_EXECUTABLE(daemon) add_executable(connectivity_tool ${CONN_TOOL}) add_dependencies(connectivity_tool version) -target_link_libraries(connectivity_tool currency_core crypto common ZLIB::ZLIB ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) +target_link_libraries(connectivity_tool currency_core crypto common ZLIB::ZLIB ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) ENABLE_SHARED_PCH(connectivity_tool CONN_TOOL) ENABLE_SHARED_PCH_EXECUTABLE(connectivity_tool) @@ -190,4 +195,3 @@ endif () install(TARGETS daemon simplewallet RUNTIME DESTINATION bin) - diff --git a/src/common/command_line.cpp b/src/common/command_line.cpp index 5897165c..7711110c 100644 --- a/src/common/command_line.cpp +++ b/src/common/command_line.cpp @@ -17,7 +17,7 @@ #include "command_line.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" namespace command_line { diff --git a/src/common/db_backend_selector.cpp b/src/common/db_backend_selector.cpp index f88fa73d..ea11e898 100644 --- a/src/common/db_backend_selector.cpp +++ b/src/common/db_backend_selector.cpp @@ -16,7 +16,7 @@ // #include "db_backend_selector.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "command_line.h" #include "db_backend_lmdb.h" #include "db_backend_mdbx.h" diff --git a/src/common/miniupnp_helper.h b/src/common/miniupnp_helper.h index 453f9035..6d0353e3 100644 --- a/src/common/miniupnp_helper.h +++ b/src/common/miniupnp_helper.h @@ -28,7 +28,7 @@ extern "C" { } #include "misc_language.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "version.h" namespace tools diff --git a/src/common/util.cpp b/src/common/util.cpp index 619b50cd..3f0d1cfc 100644 --- a/src/common/util.cpp +++ b/src/common/util.cpp @@ -20,7 +20,7 @@ using namespace epee; #include "util.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "version.h" #define UTF_CPP_CPLUSPLUS 201703L #include "utf8.h" diff --git a/src/config/CMakeLists.txt b/src/config/CMakeLists.txt new file mode 100644 index 00000000..cf21f253 --- /dev/null +++ b/src/config/CMakeLists.txt @@ -0,0 +1,63 @@ +# This file is responsible for generating currency_config.h +# and providing it to other targets. +add_library(config INTERFACE) + +include(${CMAKE_CURRENT_SOURCE_DIR}/default.cmake) +include(${CMAKE_CURRENT_SOURCE_DIR}/check-config.cmake) + +# This generates the header file from the template. +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/currency_config.h.in" + "${CMAKE_BINARY_DIR}/src/config/currency_config.h" +) + +# This tells any target linking against 'config' where to find headers. +target_include_directories(config INTERFACE + # For targets within this build tree, add the directory containing the *generated* header. + $ + # Also add the main 'src' directory for other headers. + $ +) + +#add_custom_target(gen_config_header +# DEPENDS "${CMAKE_BINARY_DIR}/src/config/currency_config.h" +#) + +file(WRITE "${CMAKE_BINARY_DIR}/src/config/currency_config_dummy.cpp" "") + +add_library(currency_config OBJECT + "${CMAKE_BINARY_DIR}/src/config/currency_config.h" + "${CMAKE_BINARY_DIR}/src/config/currency_config_dummy.cpp" +) +add_dependencies(currency_config config) + +set(GENERATE_PREMINE_WALLET OFF CACHE BOOL "Generate premine wallet") +set(PREMINE_WALLET_PASSWORD "" CACHE STRING "Premine wallet password") + +if (GENERATE_PREMINE_WALLET AND GENERATE_FRESH_GENESIS) + message(FATAL_ERROR "Genesis can not be generated together with premine wallet") +endif() + +if (GENERATE_PREMINE_WALLET) + unset(GENERATE_PREMINE_WALLET CACHE) + message(WARNING "Generating premine wallet") + + if (NOT DEFINED PREMINE_WALLET_PASSWORD OR PREMINE_WALLET_PASSWORD STREQUAL "") + message(FATAL_ERROR "set PREMINE_WALLET_PASSWORD or GENESIS_PREMINE_ADDRESS to generate genesis block") + endif() + + # Make wallet directory + add_custom_target( + premine_wallet + "${CMAKE_COMMAND}" -E make_directory "${CMAKE_SOURCE_DIR}/premine_wallet" + COMMENT "Creating premine wallet directory" + ) + + # Generate wallet + add_custom_command(TARGET premine_wallet POST_BUILD + COMMAND echo ${PREMINE_WALLET_PASSWORD} | $ --generate-new-wallet ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet + COMMENT "Generating premine wallet in ${CMAKE_SOURCE_DIR}/premine_wallet" + ) + + add_dependencies(premine_wallet simplewallet) +endif() diff --git a/cmake/check-config-vars.cmake b/src/config/check-config.cmake similarity index 100% rename from cmake/check-config-vars.cmake rename to src/config/check-config.cmake diff --git a/src/currency_core/currency_config.h.in b/src/config/currency_config.h.in similarity index 100% rename from src/currency_core/currency_config.h.in rename to src/config/currency_config.h.in diff --git a/cmake/config-vars.cmake b/src/config/default.cmake similarity index 99% rename from cmake/config-vars.cmake rename to src/config/default.cmake index 1a5e62b7..ab52cc1f 100644 --- a/cmake/config-vars.cmake +++ b/src/config/default.cmake @@ -49,4 +49,3 @@ set(package_macos_installer "PKG" CACHE STRING "CPACK_GENERATOR" ) set(package_macos_dmg_background "DMG" CACHE STRING "CPACK_DMG_BACKGROUND_IMAGE" ) set(package_macos_pkg_productbuild_identifier "com.lethean.blockchainnode" CACHE STRING "CPACK_PRODUCTBUILD_IDENTIFIER" ) set(package_macos_pkg_productbuild_signer "Developer ID Installer: Your Company (TEAMID)" CACHE STRING "CPACK_PRODUCTBUILD_SIGNING_IDENTITY" ) - diff --git a/src/crypto/one_out_of_many_proofs.cpp b/src/crypto/one_out_of_many_proofs.cpp index 4eec6b60..89028f2e 100644 --- a/src/crypto/one_out_of_many_proofs.cpp +++ b/src/crypto/one_out_of_many_proofs.cpp @@ -16,7 +16,7 @@ // #include "one_out_of_many_proofs.h" #include "../currency_core/crypto_config.h" -#include "../currency_core/currency_config.h" // for static asset checks +#include "config/currency_config.h" // for static asset checks #include "epee/include/misc_log_ex.h" //DISABLE_GCC_AND_CLANG_WARNING(unused-function) diff --git a/src/currency_core/basic_pow_helpers.cpp b/src/currency_core/basic_pow_helpers.cpp index 29f314c0..d0afcc7b 100644 --- a/src/currency_core/basic_pow_helpers.cpp +++ b/src/currency_core/basic_pow_helpers.cpp @@ -23,7 +23,7 @@ using namespace epee; #include "currency_format_utils.h" #include "serialization/binary_utils.h" #include "serialization/stl_containers.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "crypto/crypto.h" #include "crypto/hash.h" #include "common/int-util.h" diff --git a/src/currency_core/blockchain_storage.cpp b/src/currency_core/blockchain_storage.cpp index 39423725..62a43393 100644 --- a/src/currency_core/blockchain_storage.cpp +++ b/src/currency_core/blockchain_storage.cpp @@ -32,7 +32,7 @@ #include "blockchain_storage.h" #include "currency_format_utils.h" #include "currency_boost_serialization.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "miner.h" #include "misc_language.h" #include "profile_tools.h" diff --git a/src/currency_core/currency_basic.h b/src/currency_core/currency_basic.h index cc64e5e8..9d5abcb3 100644 --- a/src/currency_core/currency_basic.h +++ b/src/currency_core/currency_basic.h @@ -46,7 +46,7 @@ #include "serialization/debug_archive.h" #include "serialization/keyvalue_serialization.h" // epee key-value serialization #include "string_tools.h" -#include "currency_config.h" +#include "config/currency_config.h" #include "crypto/crypto.h" #include "crypto/hash.h" #include "crypto/range_proofs.h" diff --git a/src/currency_core/currency_core.cpp b/src/currency_core/currency_core.cpp index 378ca9c7..b589e469 100644 --- a/src/currency_core/currency_core.cpp +++ b/src/currency_core/currency_core.cpp @@ -25,7 +25,7 @@ using namespace epee; #include "common/util.h" #include "warnings.h" #include "crypto/crypto.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "currency_format_utils.h" #include "misc_language.h" #include "string_coding.h" diff --git a/src/currency_core/currency_format_utils.cpp b/src/currency_core/currency_format_utils.cpp index 0d05887a..a3688cf3 100644 --- a/src/currency_core/currency_format_utils.cpp +++ b/src/currency_core/currency_format_utils.cpp @@ -27,7 +27,7 @@ using namespace epee; #include "currency_format_utils_transactions.h" #include "serialization/binary_utils.h" #include "serialization/stl_containers.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "miner.h" #include "crypto/crypto.h" #include "crypto/hash.h" diff --git a/src/currency_core/difficulty.cpp b/src/currency_core/difficulty.cpp index 3f4a3df9..592b3be7 100644 --- a/src/currency_core/difficulty.cpp +++ b/src/currency_core/difficulty.cpp @@ -25,7 +25,7 @@ #include "common/int-util.h" #include "crypto/hash.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "difficulty.h" #include "profile_tools.h" diff --git a/src/currency_core/tx_pool.cpp b/src/currency_core/tx_pool.cpp index cb856cef..c80d94ef 100644 --- a/src/currency_core/tx_pool.cpp +++ b/src/currency_core/tx_pool.cpp @@ -23,7 +23,7 @@ #include "common/db_backend_selector.h" #include "tx_pool.h" #include "currency_boost_serialization.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "blockchain_storage.h" #include "common/boost_serialization_helper.h" #include "common/int-util.h" diff --git a/src/genesis_generator/CMakeLists.txt b/src/genesis_generator/CMakeLists.txt new file mode 100644 index 00000000..e8e6ae3a --- /dev/null +++ b/src/genesis_generator/CMakeLists.txt @@ -0,0 +1,37 @@ +add_executable(genesis_generator EXCLUDE_FROM_ALL generate_test_genesis.cpp) + +target_link_libraries(genesis_generator + PRIVATE + config + currency_core + crypto + common + zlibstatic + ${CMAKE_THREAD_LIBS_INIT} + ${Boost_LIBRARIES} + OpenSSL::SSL + OpenSSL::Crypto +) + +set_property(TARGET genesis_generator PROPERTY FOLDER "prog") + +if (GENERATE_FRESH_GENESIS) + if (NOT DEFINED GENESIS_PREMINE_ADDRESS OR GENESIS_PREMINE_ADDRESS STREQUAL "") + set(address_file "${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet.address") + message(STATUS "GENESIS_PREMINE_ADDRESS not set, attempting to load from ${address_file}") + if(EXISTS "${address_file}") + file(READ "${address_file}" GENESIS_PREMINE_ADDRESS) + string(STRIP "${GENESIS_PREMINE_ADDRESS}" GENESIS_PREMINE_ADDRESS) + endif() + endif() + + if (NOT DEFINED GENESIS_PREMINE_ADDRESS OR GENESIS_PREMINE_ADDRESS STREQUAL "") + message(FATAL_ERROR "GENESIS_PREMINE_ADDRESS is not set and could not be read from file. Please set it via -DGENESIS_PREMINE_ADDRESS=

") + else() + add_custom_command(TARGET genesis_generator POST_BUILD + COMMAND $ --address ${GENESIS_PREMINE_ADDRESS} --proof "${GENESIS_PROOF}" --output "${CMAKE_SOURCE_DIR}/src/currency_core/generated/" + COMMENT "Generating genesis data..." + VERBATIM + ) + endif() +endif() diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h index 1e257bca..dba2f284 100644 --- a/src/p2p/net_node.h +++ b/src/p2p/net_node.h @@ -38,7 +38,7 @@ #include "math_helper.h" #include "net_node_common.h" #include "maintainers_info_boost_serialization.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" using namespace epee; #undef LOG_DEFAULT_CHANNEL diff --git a/src/p2p/net_peerlist.h b/src/p2p/net_peerlist.h index fe6c1c03..2e0ac37d 100644 --- a/src/p2p/net_peerlist.h +++ b/src/p2p/net_peerlist.h @@ -35,7 +35,7 @@ #include "syncobj.h" #include "net/local_ip.h" #include "p2p_protocol_defs.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "net_peerlist_boost_serialization.h" #include "common/boost_serialization_helper.h" diff --git a/src/p2p/p2p_protocol_defs.h b/src/p2p/p2p_protocol_defs.h index 0ce23bd0..48812e0b 100644 --- a/src/p2p/p2p_protocol_defs.h +++ b/src/p2p/p2p_protocol_defs.h @@ -20,7 +20,7 @@ #include #include "serialization/keyvalue_serialization.h" #include "misc_language.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "crypto/crypto.h" namespace nodetool diff --git a/src/stratum/stratum_server.cpp b/src/stratum/stratum_server.cpp index 4d5a01dd..05e1c6cc 100644 --- a/src/stratum/stratum_server.cpp +++ b/src/stratum/stratum_server.cpp @@ -18,7 +18,7 @@ #include "stratum_server.h" #include "stratum_helpers.h" #include "net/abstract_tcp_server2.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "currency_core/currency_core.h" #include "common/command_line.h" #include "common/int-util.h" diff --git a/src/wallet/plain_wallet_api.cpp b/src/wallet/plain_wallet_api.cpp index b023d73b..d45dce26 100644 --- a/src/wallet/plain_wallet_api.cpp +++ b/src/wallet/plain_wallet_api.cpp @@ -21,7 +21,7 @@ #endif #include "plain_wallet_api.h" #include "plain_wallet_api_defs.h" -#include "currency_core/currency_config.h" +#include "config/currency_config.h" #include "version.h" #include "string_tools.h" #include "currency_core/currency_format_utils.h" From 6e4d8f76832f741663f10e045e5eea10ae66b623 Mon Sep 17 00:00:00 2001 From: Snider Date: Mon, 29 Sep 2025 20:21:33 +0100 Subject: [PATCH 53/66] Refactor genesis files and update CMake targets Moved genesis-related generated files and logic from currency_core/generated and genesis_generator to a new src/genesis directory. Updated CMakeLists and include paths to reflect the new structure. Adjusted test and db build scripts to use ZLIB::ZLIB and miniupnpc::miniupnpc targets. Added README with instructions for genesis block updates. Removed premine wallet generation logic from config CMakeLists. --- src/CMakeLists.txt | 2 +- src/config/CMakeLists.txt | 36 +-------------- src/currency_core/genesis.cpp | 4 +- src/currency_core/genesis.h | 4 +- src/currency_core/genesis_acc.cpp | 4 +- .../CMakeLists.txt | 2 +- src/genesis/README.md | 44 +++++++++++++++++++ .../generated => genesis}/_genesis.cpp.gen | 0 .../generated => genesis}/_genesis.h.gen | 0 .../_genesis_acc.cpp.gen | 0 .../_genesis_acc_tn.cpp.gen | 0 .../generated => genesis}/_genesis_tn.cpp.gen | 0 .../generated => genesis}/_genesis_tn.h.gen | 0 .../generate_test_genesis.cpp | 0 tests/CMakeLists.txt | 8 ++-- tests/db_tests/CMakeLists.txt | 2 +- 16 files changed, 58 insertions(+), 48 deletions(-) rename src/{genesis_generator => genesis}/CMakeLists.txt (96%) create mode 100644 src/genesis/README.md rename src/{currency_core/generated => genesis}/_genesis.cpp.gen (100%) rename src/{currency_core/generated => genesis}/_genesis.h.gen (100%) rename src/{currency_core/generated => genesis}/_genesis_acc.cpp.gen (100%) rename src/{currency_core/generated => genesis}/_genesis_acc_tn.cpp.gen (100%) rename src/{currency_core/generated => genesis}/_genesis_tn.cpp.gen (100%) rename src/{currency_core/generated => genesis}/_genesis_tn.h.gen (100%) rename src/{genesis_generator => genesis}/generate_test_genesis.cpp (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 77dd4a58..541dc852 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -84,7 +84,7 @@ source_group(wallet FILES ${WALLET}) INIT_SHARED_PCH() add_subdirectory(config) -add_subdirectory(genesis_generator) +add_subdirectory(genesis) add_library(common ${COMMON}) add_dependencies(common version config ${PCH_LIB_NAME}) diff --git a/src/config/CMakeLists.txt b/src/config/CMakeLists.txt index cf21f253..0228b42a 100644 --- a/src/config/CMakeLists.txt +++ b/src/config/CMakeLists.txt @@ -19,45 +19,11 @@ target_include_directories(config INTERFACE $ ) -#add_custom_target(gen_config_header -# DEPENDS "${CMAKE_BINARY_DIR}/src/config/currency_config.h" -#) + file(WRITE "${CMAKE_BINARY_DIR}/src/config/currency_config_dummy.cpp" "") - add_library(currency_config OBJECT "${CMAKE_BINARY_DIR}/src/config/currency_config.h" "${CMAKE_BINARY_DIR}/src/config/currency_config_dummy.cpp" ) add_dependencies(currency_config config) - -set(GENERATE_PREMINE_WALLET OFF CACHE BOOL "Generate premine wallet") -set(PREMINE_WALLET_PASSWORD "" CACHE STRING "Premine wallet password") - -if (GENERATE_PREMINE_WALLET AND GENERATE_FRESH_GENESIS) - message(FATAL_ERROR "Genesis can not be generated together with premine wallet") -endif() - -if (GENERATE_PREMINE_WALLET) - unset(GENERATE_PREMINE_WALLET CACHE) - message(WARNING "Generating premine wallet") - - if (NOT DEFINED PREMINE_WALLET_PASSWORD OR PREMINE_WALLET_PASSWORD STREQUAL "") - message(FATAL_ERROR "set PREMINE_WALLET_PASSWORD or GENESIS_PREMINE_ADDRESS to generate genesis block") - endif() - - # Make wallet directory - add_custom_target( - premine_wallet - "${CMAKE_COMMAND}" -E make_directory "${CMAKE_SOURCE_DIR}/premine_wallet" - COMMENT "Creating premine wallet directory" - ) - - # Generate wallet - add_custom_command(TARGET premine_wallet POST_BUILD - COMMAND echo ${PREMINE_WALLET_PASSWORD} | $ --generate-new-wallet ${CMAKE_SOURCE_DIR}/premine_wallet/premine_wallet - COMMENT "Generating premine wallet in ${CMAKE_SOURCE_DIR}/premine_wallet" - ) - - add_dependencies(premine_wallet simplewallet) -endif() diff --git a/src/currency_core/genesis.cpp b/src/currency_core/genesis.cpp index d8828a24..63ec554a 100644 --- a/src/currency_core/genesis.cpp +++ b/src/currency_core/genesis.cpp @@ -19,8 +19,8 @@ namespace currency { #ifndef TESTNET -#include "generated/_genesis.cpp.gen" +#include "../genesis/_genesis.cpp.gen" #else -#include "generated/_genesis_tn.cpp.gen" +#include "../genesis/_genesis_tn.cpp.gen" #endif } diff --git a/src/currency_core/genesis.h b/src/currency_core/genesis.h index f7de99c0..2f83ac91 100644 --- a/src/currency_core/genesis.h +++ b/src/currency_core/genesis.h @@ -22,9 +22,9 @@ namespace currency { #pragma pack(push, 1) #ifndef TESTNET -#include "generated/_genesis.h.gen" +#include "../genesis/_genesis.h.gen" #else -#include "generated/_genesis_tn.h.gen" +#include "../genesis/_genesis_tn.h.gen" #endif #pragma pack(pop) extern const genesis_tx_raw_data ggenesis_tx_raw; diff --git a/src/currency_core/genesis_acc.cpp b/src/currency_core/genesis_acc.cpp index 92a59773..2e79f008 100644 --- a/src/currency_core/genesis_acc.cpp +++ b/src/currency_core/genesis_acc.cpp @@ -21,8 +21,8 @@ namespace currency { #ifndef TESTNET -#include "generated/_genesis_acc.cpp.gen" +#include "../genesis/_genesis_acc.cpp.gen" #else -#include "generated/_genesis_acc_tn.cpp.gen" +#include "../genesis/_genesis_acc_tn.cpp.gen" #endif } diff --git a/src/genesis_generator/CMakeLists.txt b/src/genesis/CMakeLists.txt similarity index 96% rename from src/genesis_generator/CMakeLists.txt rename to src/genesis/CMakeLists.txt index e8e6ae3a..cf2115c7 100644 --- a/src/genesis_generator/CMakeLists.txt +++ b/src/genesis/CMakeLists.txt @@ -29,7 +29,7 @@ if (GENERATE_FRESH_GENESIS) message(FATAL_ERROR "GENESIS_PREMINE_ADDRESS is not set and could not be read from file. Please set it via -DGENESIS_PREMINE_ADDRESS=
") else() add_custom_command(TARGET genesis_generator POST_BUILD - COMMAND $ --address ${GENESIS_PREMINE_ADDRESS} --proof "${GENESIS_PROOF}" --output "${CMAKE_SOURCE_DIR}/src/currency_core/generated/" + COMMAND $ --address ${GENESIS_PREMINE_ADDRESS} --proof "${GENESIS_PROOF}" --output "${CMAKE_SOURCE_DIR}/src/genesis/" COMMENT "Generating genesis data..." VERBATIM ) diff --git a/src/genesis/README.md b/src/genesis/README.md new file mode 100644 index 00000000..2c49a676 --- /dev/null +++ b/src/genesis/README.md @@ -0,0 +1,44 @@ +# Genesis Block Update Instructions + +This document outlines the steps to trigger a genesis block update. The following instructions are based on the provided Makefile snippet. + +## Prerequisites + +* CMake +* Make + +## Steps + +1. **Generate Premine Wallet (Optional):** + + This step generates a premine wallet. It sets the `GENERATE_PREMINE_WALLET` CMake option to `1` and the `PREMINE_WALLET_PASSWORD` to `12345678`. + + ```bash + cmake -DGENERATE_PREMINE_WALLET=1 -DPREMINE_WALLET_PASSWORD=12345678 + cmake --build ./src --target premine_wallet + ``` + +2. **Generate Fresh Genesis Block:** + + This step generates a fresh genesis block. It sets the `GENERATE_FRESH_GENESIS` CMake option to `1`. + + ```bash + cmake -DGENERATE_FRESH_GENESIS=1 + cmake --build ./src --target genesis_generator + ``` + +3. **Build the Project:** + + This step builds the entire project. + + ```bash + cmake + make + ``` + +## Notes + +* Replace `` and `` with the actual values used in your environment. These are likely variables defined elsewhere in the Makefile. +* The `|| true` at the end of the `premine_wallet` build command ensures that the script continues even if the build fails. +* This process assumes that the `CMAKE` macro and other variables like `dir_release` are properly defined in the Makefile. +* The exact impact of these steps on the genesis block update depends on the codebase. Consult the source code for more details. diff --git a/src/currency_core/generated/_genesis.cpp.gen b/src/genesis/_genesis.cpp.gen similarity index 100% rename from src/currency_core/generated/_genesis.cpp.gen rename to src/genesis/_genesis.cpp.gen diff --git a/src/currency_core/generated/_genesis.h.gen b/src/genesis/_genesis.h.gen similarity index 100% rename from src/currency_core/generated/_genesis.h.gen rename to src/genesis/_genesis.h.gen diff --git a/src/currency_core/generated/_genesis_acc.cpp.gen b/src/genesis/_genesis_acc.cpp.gen similarity index 100% rename from src/currency_core/generated/_genesis_acc.cpp.gen rename to src/genesis/_genesis_acc.cpp.gen diff --git a/src/currency_core/generated/_genesis_acc_tn.cpp.gen b/src/genesis/_genesis_acc_tn.cpp.gen similarity index 100% rename from src/currency_core/generated/_genesis_acc_tn.cpp.gen rename to src/genesis/_genesis_acc_tn.cpp.gen diff --git a/src/currency_core/generated/_genesis_tn.cpp.gen b/src/genesis/_genesis_tn.cpp.gen similarity index 100% rename from src/currency_core/generated/_genesis_tn.cpp.gen rename to src/genesis/_genesis_tn.cpp.gen diff --git a/src/currency_core/generated/_genesis_tn.h.gen b/src/genesis/_genesis_tn.h.gen similarity index 100% rename from src/currency_core/generated/_genesis_tn.h.gen rename to src/genesis/_genesis_tn.h.gen diff --git a/src/genesis_generator/generate_test_genesis.cpp b/src/genesis/generate_test_genesis.cpp similarity index 100% rename from src/genesis_generator/generate_test_genesis.cpp rename to src/genesis/generate_test_genesis.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index fb38a979..812dca5d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -28,12 +28,12 @@ add_executable(net_load_tests_srv net_load_tests/srv.cpp) add_dependencies(coretests version) -target_link_libraries(coretests rpc wallet currency_core common crypto zlibstatic ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) -target_link_libraries(functional_tests rpc wallet currency_core crypto common zlibstatic ethash libminiupnpc-static ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) +target_link_libraries(coretests rpc wallet currency_core common crypto ZLIB::ZLIB ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) +target_link_libraries(functional_tests rpc wallet currency_core crypto common ZLIB::ZLIB ethash miniupnpc::miniupnpc ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) target_link_libraries(hash-tests crypto ethash) target_link_libraries(hash-target-tests crypto currency_core ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) -target_link_libraries(performance_tests wallet rpc currency_core common crypto zlibstatic ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) -target_link_libraries(unit_tests wallet currency_core common crypto gtest_main zlibstatic ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) +target_link_libraries(performance_tests wallet rpc currency_core common crypto ZLIB::ZLIB ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) +target_link_libraries(unit_tests wallet currency_core common crypto gtest_main ZLIB::ZLIB ethash ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL OpenSSL::Crypto) target_link_libraries(net_load_tests_clt currency_core common crypto gtest_main ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) target_link_libraries(net_load_tests_srv currency_core common crypto gtest_main ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) diff --git a/tests/db_tests/CMakeLists.txt b/tests/db_tests/CMakeLists.txt index 50d0e9df..4203961e 100644 --- a/tests/db_tests/CMakeLists.txt +++ b/tests/db_tests/CMakeLists.txt @@ -1,3 +1,3 @@ add_executable(db_tests db_tests.cpp) -target_link_libraries(db_tests crypto common lmdb zlibstatic ${Boost_LIBRARIES}) +target_link_libraries(db_tests crypto common lmdb ZLIB::ZLIB ${Boost_LIBRARIES}) From 90417401abb258e0a5d351c76fd8143f6a36c55c Mon Sep 17 00:00:00 2001 From: Snider Date: Mon, 29 Sep 2025 20:45:11 +0100 Subject: [PATCH 54/66] Refactor CI workflows and update CPack config Split build jobs by architecture and OS in GitHub Actions workflows, add Docker and docs build jobs, and update artifact upload to create GitHub releases. Also update CPackConfig.cmake to use BUILD_VERSION for package versioning. --- .github/actions/upload-artifacts/action.yml | 9 +++++ .github/workflows/_on-pr.yml | 37 +++++++++++++---- .github/workflows/_on-push.yml | 1 - .github/workflows/_on-release.yml | 45 +++++++++++++-------- cmake/CPackConfig.cmake | 4 +- 5 files changed, 69 insertions(+), 27 deletions(-) diff --git a/.github/actions/upload-artifacts/action.yml b/.github/actions/upload-artifacts/action.yml index 927df0b1..98951cc9 100644 --- a/.github/actions/upload-artifacts/action.yml +++ b/.github/actions/upload-artifacts/action.yml @@ -58,3 +58,12 @@ runs: with: name: ${{ steps.asset.outputs.key }} path: ${{ steps.asset.outputs.paths }} + + - name: Make Release + uses: softprops/action-gh-release@v2 + continue-on-error: true + with: + tag_name: ${{ inputs.chain-network }}-${{ inputs.release-tag }} + prerelease: contains(inputs.chain-network, 'testnet') + files: ${{ inputs.asset-directory }}/lethean-* + target_commitish: ${{ github.sha }} \ No newline at end of file diff --git a/.github/workflows/_on-pr.yml b/.github/workflows/_on-pr.yml index c465d570..1ba8089e 100644 --- a/.github/workflows/_on-pr.yml +++ b/.github/workflows/_on-pr.yml @@ -14,30 +14,51 @@ concurrency: cancel-in-progress: true jobs: - build-linux: - name: Compile + build-linux-intel: + name: Chain if: github.event.review.state == 'approved' && !github.event.pull_request.draft - uses: ./.github/workflows/build-linux.yml + uses: ./.github/workflows/build-linux-intel.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} - build-windows: - name: Compile + build-linux-arm: + name: Chain if: github.event.review.state == 'approved' && !github.event.pull_request.draft - uses: ./.github/workflows/build-windows.yml + uses: ./.github/workflows/build-linux-arm64.yml + with: + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + + build-windows-intel: + name: Chain + if: github.event.review.state == 'approved' && !github.event.pull_request.draft + uses: ./.github/workflows/build-windows-intel.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-arm64: - name: Compile + name: Chain + if: github.event.review.state == 'approved' && !github.event.pull_request.draft uses: ./.github/workflows/build-macos-arm64.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-intel: - name: Compile + name: Chain if: github.event.review.state == 'approved' && !github.event.pull_request.draft uses: ./.github/workflows/build-macos-intel.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + build-docker: + name: Docker + if: github.event.review.state == 'approved' && !github.event.pull_request.draft + uses: ./.github/workflows/build-docker.yml + with: + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + secrets: inherit + + build-docs: + + if: github.event.review.state == 'approved' && !github.event.pull_request.draft + name: Docs + uses: ./.github/workflows/build-docs.yml diff --git a/.github/workflows/_on-push.yml b/.github/workflows/_on-push.yml index eb13681b..28fd723c 100644 --- a/.github/workflows/_on-push.yml +++ b/.github/workflows/_on-push.yml @@ -8,7 +8,6 @@ on: push: branches: - 'dev' - - 'dev-*' - 'main' concurrency: diff --git a/.github/workflows/_on-release.yml b/.github/workflows/_on-release.yml index c89cace9..495c0595 100644 --- a/.github/workflows/_on-release.yml +++ b/.github/workflows/_on-release.yml @@ -37,30 +37,43 @@ jobs: echo "Source Branch: $SOURCE_BRANCH" echo "Chain Network: ${{ steps.get_branch.outputs.chain_network }}" - build-linux: - name: Compile - needs: determine-network - uses: ./.github/workflows/build-linux.yml + build-linux-intel: + name: Chain + uses: ./.github/workflows/build-linux-intel.yml with: - chain-network: ${{ needs.determine-network.outputs.chain-network }} + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} - build-windows: - name: Compile - needs: determine-network - uses: ./.github/workflows/build-windows.yml + build-linux-arm: + name: Chain + uses: ./.github/workflows/build-linux-arm64.yml with: - chain-network: ${{ needs.determine-network.outputs.chain-network }} + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + + build-windows-intel: + name: Chain + uses: ./.github/workflows/build-windows-intel.yml + with: + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-arm64: - name: Compile - needs: determine-network + name: Chain uses: ./.github/workflows/build-macos-arm64.yml with: - chain-network: ${{ needs.determine-network.outputs.chain-network }} + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-intel: - name: Compile - needs: determine-network + name: Chain uses: ./.github/workflows/build-macos-intel.yml with: - chain-network: ${{ needs.determine-network.outputs.chain-network }} + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + + build-docker: + name: Docker + uses: ./.github/workflows/build-docker.yml + with: + chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} + secrets: inherit + + build-docs: + name: Docs + uses: ./.github/workflows/build-docs.yml diff --git a/cmake/CPackConfig.cmake b/cmake/CPackConfig.cmake index 983dd181..a55201a7 100644 --- a/cmake/CPackConfig.cmake +++ b/cmake/CPackConfig.cmake @@ -1,10 +1,10 @@ -#include(${CMAKE_SOURCE_DIR}/cmake/config-vars.cmake) + if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CPACK_PACKAGE_NAME "${package_name}") set(CPACK_PACKAGE_VENDOR "${package_vendor}") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${package_description}") - set(CPACK_PACKAGE_VERSION "${package_version}") + set(CPACK_PACKAGE_VERSION "${BUILD_VERSION}") set(CPACK_PACKAGE_CONTACT "${package_contact}") set(CPACK_PACKAGE_HOMEPAGE_URL "${package_website}") From 248ba5e4bf6ff598e30173c3363321d42642f934 Mon Sep 17 00:00:00 2001 From: Snider Date: Mon, 29 Sep 2025 22:40:12 +0100 Subject: [PATCH 55/66] tn 1 genesis --- src/genesis/.genesis.txt | 1 + src/genesis/CMakeLists.txt | 2 +- src/genesis/_genesis_acc_tn.cpp.gen | 4 ++-- src/genesis/_genesis_tn.cpp.gen | 2 +- src/genesis/_genesis_tn.h.gen | 2 +- 5 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 src/genesis/.genesis.txt diff --git a/src/genesis/.genesis.txt b/src/genesis/.genesis.txt new file mode 100644 index 00000000..99d5bea0 --- /dev/null +++ b/src/genesis/.genesis.txt @@ -0,0 +1 @@ +01010000018080a0cfc8e0c8e38a0103858421a2d287027bdde3db5e385b0c728f598ad1647c8e17036d3ef63f61bb98000516f971f914382e875df5655f591c8df7b126d95f5e8331613ba3f5c797f541839c136b49742074616b657320616476616e74616765206f6620746865206e6174757265206f6620696e666f726d6174696f6e206265696e67206561737920746f2073707265616420627574206861726420746f20737469666c652e202d205361746f736869204e616b616d6f746f15000b02660d0e0a0000 \ No newline at end of file diff --git a/src/genesis/CMakeLists.txt b/src/genesis/CMakeLists.txt index cf2115c7..49470223 100644 --- a/src/genesis/CMakeLists.txt +++ b/src/genesis/CMakeLists.txt @@ -6,7 +6,7 @@ target_link_libraries(genesis_generator currency_core crypto common - zlibstatic + ZLIB::ZLIB ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} OpenSSL::SSL diff --git a/src/genesis/_genesis_acc_tn.cpp.gen b/src/genesis/_genesis_acc_tn.cpp.gen index fc0eb6f3..6add48fe 100644 --- a/src/genesis/_genesis_acc_tn.cpp.gen +++ b/src/genesis/_genesis_acc_tn.cpp.gen @@ -1,6 +1,6 @@ -const std::string ggenesis_tx_pub_key_str = "e6e4c44e117ea47e355ad871cbbf0d0a8aed15c8cd44b9d02a21c90b8831e7f6"; +const std::string ggenesis_tx_pub_key_str = "f971f914382e875df5655f591c8df7b126d95f5e8331613ba3f5c797f541839c"; const crypto::public_key ggenesis_tx_pub_key = epee::string_tools::parse_tpod_from_hex_string(ggenesis_tx_pub_key_str); extern const genesis_tx_dictionary_entry ggenesis_dict[1]; const genesis_tx_dictionary_entry ggenesis_dict[1] = { -{12209970162623619798ULL,0} +{16303433277431939751ULL,0} }; diff --git a/src/genesis/_genesis_tn.cpp.gen b/src/genesis/_genesis_tn.cpp.gen index fc699deb..55bc3608 100644 --- a/src/genesis/_genesis_tn.cpp.gen +++ b/src/genesis/_genesis_tn.cpp.gen @@ -1,3 +1,3 @@ const genesis_tx_raw_data ggenesis_tx_raw = {{ -0xc080800100000101,0x8c0337c1b6d9e9ec,0x4e22a822e89151ed,0x945d81f56c551f9e,0x5a84b14938248553,0x00671298a0463d3a,0x7e114ec4e4e61605,0xbfcb71d85a357ea4,0x44cdc815ed8a0a0d,0x31880bc9212ad0b9,0x6d776f770c13f6e7,0x666f6f7270686375,0x0a0e36ce020b0015}, +0xa080800100000101,0x03018ae3c8e0c8cf,0x7b0287d2a2218485,0x720c5b385edbe3dd,0x178e7c64d18a598f,0x98bb613ff63e6d03,0x3814f971f9160500,0x1c595f65f55d872e,0x835e5fd926b1f78d,0xf597c7f5a33b6131,0x2074496b139c8341,0x64612073656b6174,0x20656761746e6176,0x6e2065687420666f,0x666f206572757461,0x616d726f666e6920,0x696562206e6f6974,0x207973616520676e,0x6165727073206f74,0x6168207475622064,0x7473206f74206472,0x202d202e656c6669,0x206968736f746153,0x6f746f6d616b614e,0x0a0e0d66020b0015}, {0x00,0x00}}; diff --git a/src/genesis/_genesis_tn.h.gen b/src/genesis/_genesis_tn.h.gen index 4fb4f441..050061a1 100644 --- a/src/genesis/_genesis_tn.h.gen +++ b/src/genesis/_genesis_tn.h.gen @@ -1,5 +1,5 @@ struct genesis_tx_raw_data { - uint64_t const v[13]; + uint64_t const v[25]; uint8_t const r[2]; }; From ba6252ed58d875cb61e27420dbcb900dc42ee01b Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 12:01:38 +0100 Subject: [PATCH 56/66] AI Code Review Fixes --- Makefile | 2 +- cmake/CPackConfig.cmake | 2 +- src/config/default.cmake | 1 - src/p2p/net_node.inl | 6 +++--- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 4004b639..45ff0799 100644 --- a/Makefile +++ b/Makefile @@ -98,7 +98,7 @@ static-release: conan-profile-detect @echo "Building profile: release-static" CONAN_HOME=$(CONAN_CACHE) conan install . --output-folder=build/release-static --build=missing -s build_type=$(BUILD_TYPE) cmake -S . -B build/release-static -DCMAKE_TOOLCHAIN_FILE=build/release-static/conan_toolchain.cmake -DCMAKE_BUILD_TYPE=$(BUILD_TYPE) -D STATIC=ON -DTESTNET=$(TESTNET) - cmake --build build/release-static --config=Release --parallel=$(CPU_CORES) + cmake --build build/release-static --config=$(BUILD_TYPE) --parallel=$(CPU_CORES) conan-profile-detect: @if [ ! -f "$(DEFAULT_CONAN_PROFILE)" ]; then \ diff --git a/cmake/CPackConfig.cmake b/cmake/CPackConfig.cmake index a55201a7..4140328c 100644 --- a/cmake/CPackConfig.cmake +++ b/cmake/CPackConfig.cmake @@ -59,7 +59,7 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/packages") install(FILES README.md LICENSE.txt - DESTINATION . + DESTINATION "share/doc/${CPACK_PACKAGE_NAME}" ) set(_arch "${CMAKE_SYSTEM_PROCESSOR}") diff --git a/src/config/default.cmake b/src/config/default.cmake index ab52cc1f..5c9fbe1f 100644 --- a/src/config/default.cmake +++ b/src/config/default.cmake @@ -33,7 +33,6 @@ if (TESTNET) set(stratum_default_port 36940 CACHE STRING "STRATUM_DEFAULT_PORT" ) set(package_name "lethean-testnet-cli" CACHE STRING "CPACK_PACKAGE_NAME" ) else () - message(CHECK_FAIL "bad") set(p2p_default_port 36942 CACHE STRING "P2P_DEFAULT_PORT" ) set(rpc_default_port 36941 CACHE STRING "RPC_DEFAULT_PORT" ) set(stratum_default_port 36940 CACHE STRING "STRATUM_DEFAULT_PORT" ) diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl index aa09c384..2f1df0e2 100644 --- a/src/p2p/net_node.inl +++ b/src/p2p/net_node.inl @@ -434,8 +434,8 @@ namespace nodetool { #ifndef TESTNET //TODO: - //ADD_HARDCODED_SEED_NODE(std::string("0.0.0.0:") + std::to_string(P2P_DEFAULT_PORT)); - //ADD_HARDCODED_SEED_NODE("95.217.43.225", P2P_DEFAULT_PORT); + ADD_HARDCODED_SEED_NODE(std::string("0.0.0.0:") + std::to_string(P2P_DEFAULT_PORT)); + ADD_HARDCODED_SEED_NODE("116.202.82.115", P2P_DEFAULT_PORT); //ADD_HARDCODED_SEED_NODE("94.130.137.230", P2P_DEFAULT_PORT); //ADD_HARDCODED_SEED_NODE("95.217.42.247", P2P_DEFAULT_PORT); //ADD_HARDCODED_SEED_NODE("94.130.160.115", P2P_DEFAULT_PORT); @@ -445,7 +445,7 @@ namespace nodetool //ADD_HARDCODED_SEED_NODE("144.76.183.143", P2P_DEFAULT_PORT); #else // TESTNET - //ADD_HARDCODED_SEED_NODE("95.217.43.225", P2P_DEFAULT_PORT); + ADD_HARDCODED_SEED_NODE("116.202.82.115", P2P_DEFAULT_PORT); //ADD_HARDCODED_SEED_NODE("94.130.137.230", P2P_DEFAULT_PORT); //ADD_HARDCODED_SEED_NODE("95.217.42.247", P2P_DEFAULT_PORT); //ADD_HARDCODED_SEED_NODE("94.130.160.115", P2P_DEFAULT_PORT); From 9875287811c8a3e5fda82ebdd3629a2d97eaaa35 Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 12:12:11 +0100 Subject: [PATCH 57/66] Update workflow conditions and release action config Allows user 'Snider' to trigger build jobs on PRs they author, in addition to the existing approval-based condition. Removes 'continue-on-error: true' from the release step in the upload-artifacts action to ensure failures are not ignored. --- .github/actions/upload-artifacts/action.yml | 1 - .github/workflows/_on-pr.yml | 29 +++++++++++++++------ 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/.github/actions/upload-artifacts/action.yml b/.github/actions/upload-artifacts/action.yml index 98951cc9..40d0e886 100644 --- a/.github/actions/upload-artifacts/action.yml +++ b/.github/actions/upload-artifacts/action.yml @@ -61,7 +61,6 @@ runs: - name: Make Release uses: softprops/action-gh-release@v2 - continue-on-error: true with: tag_name: ${{ inputs.chain-network }}-${{ inputs.release-tag }} prerelease: contains(inputs.chain-network, 'testnet') diff --git a/.github/workflows/_on-pr.yml b/.github/workflows/_on-pr.yml index 1ba8089e..779d2e8c 100644 --- a/.github/workflows/_on-pr.yml +++ b/.github/workflows/_on-pr.yml @@ -16,49 +16,62 @@ concurrency: jobs: build-linux-intel: name: Chain - if: github.event.review.state == 'approved' && !github.event.pull_request.draft + if: | + (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || + (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-linux-intel.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-linux-arm: name: Chain - if: github.event.review.state == 'approved' && !github.event.pull_request.draft + if: | + (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || + (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-linux-arm64.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-windows-intel: name: Chain - if: github.event.review.state == 'approved' && !github.event.pull_request.draft + if: | + (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || + (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-windows-intel.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-arm64: name: Chain - if: github.event.review.state == 'approved' && !github.event.pull_request.draft + if: | + (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || + (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-macos-arm64.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-intel: name: Chain - if: github.event.review.state == 'approved' && !github.event.pull_request.draft + if: | + (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || + (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-macos-intel.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-docker: name: Docker - if: github.event.review.state == 'approved' && !github.event.pull_request.draft + if: | + (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || + (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-docker.yml with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} secrets: inherit build-docs: - - if: github.event.review.state == 'approved' && !github.event.pull_request.draft name: Docs + if: | + (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || + (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-docs.yml From a500d6bf255804ae510fde4e967d63faba34868d Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 14:02:06 +0100 Subject: [PATCH 58/66] Update docs --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 377608cc..dc408eb5 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 377608cc713a8783dd0c87329449dac93a55861f +Subproject commit dc408eb5140a1b5a3776d60f52217eb3e5128276 From 3dd7d82b624d51baf0b830f3e0ef371e358c9571 Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 14:08:20 +0100 Subject: [PATCH 59/66] Update docs --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index dc408eb5..88250363 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit dc408eb5140a1b5a3776d60f52217eb3e5128276 +Subproject commit 88250363a6f5c374b88b75f03fccb7e5e6e0be88 From 6fa9487476737c7a03aafd3ebbc765dd6362237c Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 14:26:25 +0100 Subject: [PATCH 60/66] Inherit secrets in build workflow jobs Added 'secrets: inherit' to all reusable workflow job calls in _on-pr.yml and _on-release.yml to ensure secrets are properly passed to downstream workflows. This change improves security and consistency in CI/CD processes. --- .github/workflows/_on-pr.yml | 7 ++++++- .github/workflows/_on-release.yml | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/workflows/_on-pr.yml b/.github/workflows/_on-pr.yml index 779d2e8c..dc2002b3 100644 --- a/.github/workflows/_on-pr.yml +++ b/.github/workflows/_on-pr.yml @@ -20,6 +20,7 @@ jobs: (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-linux-intel.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} @@ -29,6 +30,7 @@ jobs: (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-linux-arm64.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} @@ -38,6 +40,7 @@ jobs: (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-windows-intel.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} @@ -47,6 +50,7 @@ jobs: (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-macos-arm64.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} @@ -56,6 +60,7 @@ jobs: (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-macos-intel.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} @@ -65,9 +70,9 @@ jobs: (github.actor == 'Snider' && github.event.pull_request.user.login == 'Snider') || (github.event.review.state == 'approved' && !github.event.pull_request.draft) uses: ./.github/workflows/build-docker.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} - secrets: inherit build-docs: name: Docs diff --git a/.github/workflows/_on-release.yml b/.github/workflows/_on-release.yml index 495c0595..bef4d946 100644 --- a/.github/workflows/_on-release.yml +++ b/.github/workflows/_on-release.yml @@ -40,12 +40,14 @@ jobs: build-linux-intel: name: Chain uses: ./.github/workflows/build-linux-intel.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-linux-arm: name: Chain uses: ./.github/workflows/build-linux-arm64.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} @@ -58,21 +60,23 @@ jobs: build-macos-arm64: name: Chain uses: ./.github/workflows/build-macos-arm64.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-macos-intel: name: Chain uses: ./.github/workflows/build-macos-intel.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} build-docker: name: Docker uses: ./.github/workflows/build-docker.yml + secrets: inherit with: chain-network: ${{ github.ref_name == 'main' && 'mainnet' || 'testnet' }} - secrets: inherit build-docs: name: Docs From 23af6b9caac3f2fd0166ac16aede12d3c731012f Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 14:45:55 +0100 Subject: [PATCH 61/66] Update workflow permissions to contents: write Changed GitHub Actions workflow permissions from 'contents: read' to 'contents: write' for all build workflows. This allows workflows to perform write operations on repository contents, which may be required for publishing artifacts or releases. --- .github/workflows/build-linux-arm64.yml | 2 +- .github/workflows/build-linux-intel.yml | 2 +- .github/workflows/build-macos-arm64.yml | 2 +- .github/workflows/build-macos-intel.yml | 2 +- .github/workflows/build-windows-intel.yml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build-linux-arm64.yml b/.github/workflows/build-linux-arm64.yml index 8e27fa66..4269e3db 100644 --- a/.github/workflows/build-linux-arm64.yml +++ b/.github/workflows/build-linux-arm64.yml @@ -1,6 +1,6 @@ name: Linux permissions: - contents: read + contents: write on: workflow_call: inputs: diff --git a/.github/workflows/build-linux-intel.yml b/.github/workflows/build-linux-intel.yml index 63390528..e5125b98 100644 --- a/.github/workflows/build-linux-intel.yml +++ b/.github/workflows/build-linux-intel.yml @@ -1,6 +1,6 @@ name: Linux permissions: - contents: read + contents: write on: workflow_call: inputs: diff --git a/.github/workflows/build-macos-arm64.yml b/.github/workflows/build-macos-arm64.yml index de10e2fb..dd53cb1e 100644 --- a/.github/workflows/build-macos-arm64.yml +++ b/.github/workflows/build-macos-arm64.yml @@ -1,6 +1,6 @@ name: build-macos-arm64 permissions: - contents: read + contents: write on: workflow_call: inputs: diff --git a/.github/workflows/build-macos-intel.yml b/.github/workflows/build-macos-intel.yml index 72913593..802e3834 100644 --- a/.github/workflows/build-macos-intel.yml +++ b/.github/workflows/build-macos-intel.yml @@ -1,6 +1,6 @@ name: build-macos-intel permissions: - contents: read + contents: write on: workflow_call: inputs: diff --git a/.github/workflows/build-windows-intel.yml b/.github/workflows/build-windows-intel.yml index 66c9ab1e..2f00e6c6 100644 --- a/.github/workflows/build-windows-intel.yml +++ b/.github/workflows/build-windows-intel.yml @@ -1,6 +1,6 @@ name: build-windows permissions: - contents: read + contents: write on: workflow_call: inputs: From aad1b72b3d3aab888f6a52af69a5577f766b12e9 Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 15:13:43 +0100 Subject: [PATCH 62/66] Update workflow permissions to contents: write Changed GitHub Actions workflow permissions from 'contents: read' to 'contents: write' in all relevant workflow files. This allows workflows to perform write operations on repository contents, which may be required for certain actions or automation steps. --- .github/workflows/_on-pr-fast.yml | 2 +- .github/workflows/_on-pr.yml | 2 +- .github/workflows/_on-push.yml | 2 +- .github/workflows/_on-release.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/_on-pr-fast.yml b/.github/workflows/_on-pr-fast.yml index a0cb7ec3..87d0734b 100644 --- a/.github/workflows/_on-pr-fast.yml +++ b/.github/workflows/_on-pr-fast.yml @@ -1,6 +1,6 @@ name: PR Fast permissions: - contents: read + contents: write on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.github/workflows/_on-pr.yml b/.github/workflows/_on-pr.yml index dc2002b3..4a23b8d1 100644 --- a/.github/workflows/_on-pr.yml +++ b/.github/workflows/_on-pr.yml @@ -1,6 +1,6 @@ name: PR permissions: - contents: read + contents: write on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: diff --git a/.github/workflows/_on-push.yml b/.github/workflows/_on-push.yml index 28fd723c..38d9fb4c 100644 --- a/.github/workflows/_on-push.yml +++ b/.github/workflows/_on-push.yml @@ -1,6 +1,6 @@ name: Push Compile permissions: - contents: read + contents: write packages: write on: # Allows you to run this workflow manually from the Actions tab diff --git a/.github/workflows/_on-release.yml b/.github/workflows/_on-release.yml index bef4d946..7c83d56a 100644 --- a/.github/workflows/_on-release.yml +++ b/.github/workflows/_on-release.yml @@ -1,6 +1,6 @@ name: Push Full Build permissions: - contents: read + contents: write on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: From 93463e043d63f90ca3afb086a1d1c7b4aa8c2b3a Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 15:36:22 +0100 Subject: [PATCH 63/66] Update release tag to use only chain-network input Modified the GitHub Actions workflow to set the release tag name to only use the 'chain-network' input, removing the 'release-tag' input from the tag name. --- .github/actions/upload-artifacts/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/upload-artifacts/action.yml b/.github/actions/upload-artifacts/action.yml index 40d0e886..1d4d9ea8 100644 --- a/.github/actions/upload-artifacts/action.yml +++ b/.github/actions/upload-artifacts/action.yml @@ -62,7 +62,7 @@ runs: - name: Make Release uses: softprops/action-gh-release@v2 with: - tag_name: ${{ inputs.chain-network }}-${{ inputs.release-tag }} + tag_name: ${{ inputs.chain-network }} prerelease: contains(inputs.chain-network, 'testnet') files: ${{ inputs.asset-directory }}/lethean-* target_commitish: ${{ github.sha }} \ No newline at end of file From 737cbb7a8aea38f85fdadd5ca7f9979e9c9d0a68 Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 15:44:10 +0100 Subject: [PATCH 64/66] Extract and use BUILD_VERSION for release tag The workflow now extracts BUILD_VERSION from the Makefile and uses it as the release tag name instead of the chain network. This ensures that releases are tagged with the correct version, and adds error handling if the version is not found. --- .github/actions/upload-artifacts/action.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/actions/upload-artifacts/action.yml b/.github/actions/upload-artifacts/action.yml index 1d4d9ea8..4a733c11 100644 --- a/.github/actions/upload-artifacts/action.yml +++ b/.github/actions/upload-artifacts/action.yml @@ -29,6 +29,14 @@ runs: FILENAME="${{ inputs.chain-network }}-${{ inputs.asset-type }}-${TARGET_OS}-${LOWERCASE_ARCH}" echo "key=$FILENAME" >> $GITHUB_OUTPUT + VERSION=$(grep '^BUILD_VERSION:=' Makefile | cut -d'=' -f2) + # Check if a version was found + if [ -z "$VERSION" ]; then + echo "Error: BUILD_VERSION could not be found in the Makefile." >&2 + exit 1 + fi + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" + # Format the output to be a multi-line string. # This is the correct way to pass a multi-line string in GITHUB_OUTPUT. echo "paths<> "$GITHUB_OUTPUT" @@ -62,7 +70,7 @@ runs: - name: Make Release uses: softprops/action-gh-release@v2 with: - tag_name: ${{ inputs.chain-network }} + tag_name: ${{ steps.asset.outputs.version }} prerelease: contains(inputs.chain-network, 'testnet') files: ${{ inputs.asset-directory }}/lethean-* target_commitish: ${{ github.sha }} \ No newline at end of file From 044a2e0f61108f7e995d0377f1c5dc094b54dd59 Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 15:56:08 +0100 Subject: [PATCH 65/66] Fix prerelease expression in upload-artifacts action Corrects the syntax for the 'prerelease' field in the upload-artifacts GitHub Action to use proper expression evaluation. Also updates the docs submodule to the latest commit. --- .github/actions/upload-artifacts/action.yml | 2 +- docs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/upload-artifacts/action.yml b/.github/actions/upload-artifacts/action.yml index 4a733c11..04b131e0 100644 --- a/.github/actions/upload-artifacts/action.yml +++ b/.github/actions/upload-artifacts/action.yml @@ -71,6 +71,6 @@ runs: uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.asset.outputs.version }} - prerelease: contains(inputs.chain-network, 'testnet') + prerelease: ${{ contains(inputs.chain-network, 'testnet') }} files: ${{ inputs.asset-directory }}/lethean-* target_commitish: ${{ github.sha }} \ No newline at end of file diff --git a/docs b/docs index 88250363..e73dfdd5 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 88250363a6f5c374b88b75f03fccb7e5e6e0be88 +Subproject commit e73dfdd55a5d4d4a128dd2c992b9484ee908bc46 From 8579b67ac69d1f98bb4ba6fa2c39eda7b53e9612 Mon Sep 17 00:00:00 2001 From: Snider Date: Tue, 30 Sep 2025 16:28:21 +0100 Subject: [PATCH 66/66] Bump version to 6.0.1 Updated version numbers in Makefile and src/version.h.in to 6.0.1 and incremented build number. Also updated docs submodule to latest commit. --- Makefile | 2 +- docs | 2 +- src/version.h.in | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 45ff0799..88b0a5c1 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ CPU_CORES := 1 TESTNET:= 0 BUILD_TYPE ?=Release -BUILD_VERSION:=6.0.0 +BUILD_VERSION:=6.0.1 # ----------------------------------------------------------------- # Unix‑like systems (Linux, macOS, *BSD, etc.) diff --git a/docs b/docs index e73dfdd5..12e20efc 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit e73dfdd55a5d4d4a128dd2c992b9484ee908bc46 +Subproject commit 12e20efce7eaf51e38d8953c318633b1c5189256 diff --git a/src/version.h.in b/src/version.h.in index 8149ce53..52a6c7de 100644 --- a/src/version.h.in +++ b/src/version.h.in @@ -5,9 +5,9 @@ #define PROJECT_MAJOR_VERSION "6" #define PROJECT_MINOR_VERSION "0" -#define PROJECT_REVISION "0" +#define PROJECT_REVISION "1" #define PROJECT_VERSION PROJECT_MAJOR_VERSION "." PROJECT_MINOR_VERSION "." PROJECT_REVISION -#define PROJECT_VERSION_BUILD_NO 1 +#define PROJECT_VERSION_BUILD_NO 2 #define PROJECT_VERSION_BUILD_NO_STR STRINGIFY_EXPAND(PROJECT_VERSION_BUILD_NO) #define PROJECT_VERSION_LONG PROJECT_VERSION "." PROJECT_VERSION_BUILD_NO_STR "[" BUILD_COMMIT_ID "]"