Compare commits

..

23 Commits

Author SHA1 Message Date
Gregory Tsipenyuk
5ec090b258 Merge branch 'develop' into gregtatcam/mpt/assorted-fixes-dev 2026-04-22 06:35:21 -04:00
Gregory Tsipenyuk
35890680bf Merge branch 'develop' into gregtatcam/mpt/assorted-fixes-dev 2026-04-21 11:12:32 -04:00
Gregory Tsipenyuk
d3e22a1251 Add testAutoCreateReserve() unit-test to verify MPT/IOU consistent in not checking the reserves when creating MPToken or Trustline on partial offer crossing. 2026-04-21 11:07:20 -04:00
Gregory Tsipenyuk
0f262a56cf Add comments 2026-04-20 07:51:51 -04:00
Gregory Tsipenyuk
392e69ae67 Fix clang-tidy errors. 2026-04-19 15:14:34 -04:00
Gregory Tsipenyuk
080830c4ae Fix clang-tidy errors. 2026-04-19 14:27:17 -04:00
Gregory Tsipenyuk
940dcef212 Merge branch 'develop' into gregtatcam/mpt/assorted-fixes-dev 2026-04-18 10:36:05 -04:00
Gregory Tsipenyuk
62bdfc6bf6 Add MPT to ValidAMM invariant. Add ValidAMM invariant unit-tests. 2026-04-18 10:29:51 -04:00
Gregory Tsipenyuk
e85f010ef0 Fix AMMClawback return code on AllowTrustLineClawback and NoFreeze check. 2026-04-15 15:49:55 -04:00
Gregory Tsipenyuk
af17ab2642 Merge branch 'develop' into gregtatcam/mpt/assorted-fixes-dev 2026-04-15 14:46:56 -04:00
Gregory Tsipenyuk
70fa0d7f79 Refactor requireAuth handling in ValidMPTTransfer.
* Combine frozen and reqAuth.
* Check senders and receivers for reqAuth.
2026-04-14 09:16:48 -04:00
Gregory Tsipenyuk
a2ab6c79ac Add requireAuth invariant 2026-04-13 15:22:49 -04:00
Gregory Tsipenyuk
5439264bdb Fix MPTInvariant refactoring 2026-04-13 13:39:20 -04:00
Gregory Tsipenyuk
62921eb913 Update src/libxrpl/tx/invariants/MPTInvariant.cpp
Co-authored-by: Shawn Xie <35279399+shawnxie999@users.noreply.github.com>
2026-04-13 13:29:04 -04:00
Gregory Tsipenyuk
50cacddcf8 Add CheckCash can't transfer failure unit-test. 2026-04-10 12:25:01 -04:00
Gregory Tsipenyuk
a839b8b92a Add ValidMPTTransfer invariant unit-tests. 2026-04-10 11:49:43 -04:00
Gregory Tsipenyuk
1a2c0e7d32 Improve ValidMPTTransfer::finalize() 2026-04-10 09:20:56 -04:00
Gregory Tsipenyuk
77df21b485 Address AI review 2026-04-09 17:25:17 -04:00
Gregory Tsipenyuk
63f270f00e Update src/libxrpl/tx/invariants/MPTInvariant.cpp
Co-authored-by: xrplf-ai-reviewer[bot] <266832837+xrplf-ai-reviewer[bot]@users.noreply.github.com>
2026-04-09 14:35:38 -04:00
Gregory Tsipenyuk
0a896b7957 Fix double adjustOwnerCount() in AMMWithdraw. 2026-04-09 13:06:28 -04:00
Gregory Tsipenyuk
12eb050bf8 Change tecFROZEN to tecLOCKED for locked MPT.
Replace checkMPTTxAllowed() with canMPTTradeAndTransfer().
2026-04-09 11:54:15 -04:00
Gregory Tsipenyuk
d26d93130e Replace canTrade with canTransfer in CheckCreate/Cash (Check is not DEX tx). 2026-04-09 11:52:55 -04:00
Gregory Tsipenyuk
a91e8ddad7 Add ValidMPTTransfer invariant. 2026-04-09 11:52:38 -04:00
505 changed files with 3415 additions and 5770 deletions

View File

@@ -66,14 +66,14 @@ Checks: "-*,
bugprone-terminating-continue,
bugprone-throw-keyword-missing,
bugprone-too-small-loop-variable,
bugprone-unchecked-optional-access,
# bugprone-unchecked-optional-access, # see https://github.com/XRPLF/rippled/pull/6502
bugprone-undefined-memory-manipulation,
bugprone-undelegated-constructor,
bugprone-unhandled-exception-at-new,
bugprone-unhandled-self-assignment,
bugprone-unique-ptr-array-mismatch,
bugprone-unsafe-functions,
bugprone-use-after-move,
bugprone-use-after-move, # has issues
bugprone-unused-raii,
bugprone-unused-return-value,
bugprone-unused-local-non-trivial-variable,
@@ -106,7 +106,6 @@ Checks: "-*,
modernize-use-emplace,
modernize-use-equals-default,
modernize-use-equals-delete,
modernize-use-nodiscard,
modernize-use-override,
modernize-use-ranges,
modernize-use-starts-ends-with,

View File

@@ -93,7 +93,6 @@ test.core > xrpl.basics
test.core > xrpl.core
test.core > xrpld.core
test.core > xrpl.json
test.core > xrpl.protocol
test.core > xrpl.rdb
test.core > xrpl.server
test.csf > xrpl.basics

View File

@@ -6,11 +6,11 @@ set -e
# On MacOS, ensure that GNU sed is installed and available as `gsed`.
SED_COMMAND=sed
if [[ "${OSTYPE}" == 'darwin'* ]]; then
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
fi
# This script changes the binary name from `rippled` to `xrpld`, and reverses

View File

@@ -8,16 +8,16 @@ set -e
SED_COMMAND=sed
HEAD_COMMAND=head
if [[ "${OSTYPE}" == 'darwin'* ]]; then
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
if ! command -v ghead &> /dev/null; then
echo "Error: ghead is not installed. Please install it using 'brew install coreutils'."
exit 1
fi
HEAD_COMMAND=ghead
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
if ! command -v ghead &> /dev/null; then
echo "Error: ghead is not installed. Please install it using 'brew install coreutils'."
exit 1
fi
HEAD_COMMAND=ghead
fi
# This script renames CMake files from `RippleXXX.cmake` or `RippledXXX.cmake`
@@ -44,10 +44,10 @@ pushd "${DIRECTORY}"
find cmake -type f -name 'Rippled*.cmake' -exec bash -c 'mv "${1}" "${1/Rippled/Xrpl}"' - {} \;
find cmake -type f -name 'Ripple*.cmake' -exec bash -c 'mv "${1}" "${1/Ripple/Xrpl}"' - {} \;
if [ -e cmake/xrpl_add_test.cmake ]; then
mv cmake/xrpl_add_test.cmake cmake/XrplAddTest.cmake
mv cmake/xrpl_add_test.cmake cmake/XrplAddTest.cmake
fi
if [ -e include/xrpl/proto/ripple.proto ]; then
mv include/xrpl/proto/ripple.proto include/xrpl/proto/xrpl.proto
mv include/xrpl/proto/ripple.proto include/xrpl/proto/xrpl.proto
fi
# Rename inside the files.
@@ -71,14 +71,14 @@ ${SED_COMMAND} -i 's@xrpl/validator-keys-tool@ripple/validator-keys-tool@' cmake
# Ensure the name of the binary and config remain 'rippled' for now.
${SED_COMMAND} -i -E 's/xrpld(-example)?\.cfg/rippled\1.cfg/g' cmake/XrplInstall.cmake
if grep -q '"xrpld"' cmake/XrplCore.cmake; then
# The script has been rerun, so just restore the name of the binary.
${SED_COMMAND} -i 's/"xrpld"/"rippled"/' cmake/XrplCore.cmake
# The script has been rerun, so just restore the name of the binary.
${SED_COMMAND} -i 's/"xrpld"/"rippled"/' cmake/XrplCore.cmake
elif ! grep -q '"rippled"' cmake/XrplCore.cmake; then
${HEAD_COMMAND} -n -1 cmake/XrplCore.cmake > cmake.tmp
echo ' # For the time being, we will keep the name of the binary as it was.' >> cmake.tmp
echo ' set_target_properties(xrpld PROPERTIES OUTPUT_NAME "rippled")' >> cmake.tmp
tail -1 cmake/XrplCore.cmake >> cmake.tmp
mv cmake.tmp cmake/XrplCore.cmake
${HEAD_COMMAND} -n -1 cmake/XrplCore.cmake > cmake.tmp
echo ' # For the time being, we will keep the name of the binary as it was.' >> cmake.tmp
echo ' set_target_properties(xrpld PROPERTIES OUTPUT_NAME "rippled")' >> cmake.tmp
tail -1 cmake/XrplCore.cmake >> cmake.tmp
mv cmake.tmp cmake/XrplCore.cmake
fi
# Restore the symlink from 'xrpld' to 'rippled'.

View File

@@ -6,11 +6,11 @@ set -e
# On MacOS, ensure that GNU sed is installed and available as `gsed`.
SED_COMMAND=sed
if [[ "${OSTYPE}" == 'darwin'* ]]; then
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
fi
# This script renames the config from `rippled.cfg` to `xrpld.cfg`, and updates
@@ -32,28 +32,28 @@ pushd "${DIRECTORY}"
# Add the xrpld.cfg to the .gitignore.
if ! grep -q 'xrpld.cfg' .gitignore; then
${SED_COMMAND} -i '/rippled.cfg/a\
${SED_COMMAND} -i '/rippled.cfg/a\
/xrpld.cfg' .gitignore
fi
# Rename the files.
if [ -e rippled.cfg ]; then
mv rippled.cfg xrpld.cfg
mv rippled.cfg xrpld.cfg
fi
if [ -e cfg/rippled-example.cfg ]; then
mv cfg/rippled-example.cfg cfg/xrpld-example.cfg
mv cfg/rippled-example.cfg cfg/xrpld-example.cfg
fi
# Rename inside the files.
DIRECTORIES=("cfg" "cmake" "include" "src")
for DIRECTORY in "${DIRECTORIES[@]}"; do
echo "Processing directory: ${DIRECTORY}"
echo "Processing directory: ${DIRECTORY}"
find "${DIRECTORY}" -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.ipp" -o -name "*.cpp" -o -name "*.cmake" -o -name "*.txt" -o -name "*.cfg" -o -name "*.md" \) | while read -r FILE; do
echo "Processing file: ${FILE}"
${SED_COMMAND} -i -E 's/rippled(-example)?[ .]cfg/xrpld\1.cfg/g' "${FILE}"
${SED_COMMAND} -i 's/rippleConfig/xrpldConfig/g' "${FILE}"
done
find "${DIRECTORY}" -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.ipp" -o -name "*.cpp" -o -name "*.cmake" -o -name "*.txt" -o -name "*.cfg" -o -name "*.md" \) | while read -r FILE; do
echo "Processing file: ${FILE}"
${SED_COMMAND} -i -E 's/rippled(-example)?[ .]cfg/xrpld\1.cfg/g' "${FILE}"
${SED_COMMAND} -i 's/rippleConfig/xrpldConfig/g' "${FILE}"
done
done
${SED_COMMAND} -i 's/rippled/xrpld/g' cfg/xrpld-example.cfg
${SED_COMMAND} -i 's/rippled/xrpld/g' src/test/core/Config_test.cpp

View File

@@ -6,11 +6,11 @@ set -e
# On MacOS, ensure that GNU sed is installed and available as `gsed`.
SED_COMMAND=sed
if [[ "${OSTYPE}" == 'darwin'* ]]; then
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
fi
# This script removes superfluous copyright notices in source and header files
@@ -43,56 +43,56 @@ ${SED_COMMAND} -i -E "s@\\\t@${PLACEHOLDER_TAB}@g" src/test/rpc/ValidatorInfo_te
# Process the include/ and src/ directories.
DIRECTORIES=("include" "src")
for DIRECTORY in "${DIRECTORIES[@]}"; do
echo "Processing directory: ${DIRECTORY}"
echo "Processing directory: ${DIRECTORY}"
find "${DIRECTORY}" -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.ipp" -o -name "*.cpp" -o -name "*.macro" \) | while read -r FILE; do
echo "Processing file: ${FILE}"
# Handle the cases where the copyright notice is enclosed in /* ... */
# and usually surrounded by //---- and //======.
${SED_COMMAND} -z -i -E 's@^//-------+\n+@@' "${FILE}"
${SED_COMMAND} -z -i -E 's@^.*Copyright.+(Ripple|Bougalis|Falco|Hinnant|Null|Ritchford|XRPLF).+PERFORMANCE OF THIS SOFTWARE\.\n\*/\n+@@' "${FILE}" # cspell: ignore Bougalis Falco Hinnant Ritchford
${SED_COMMAND} -z -i -E 's@^//=======+\n+@@' "${FILE}"
find "${DIRECTORY}" -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.ipp" -o -name "*.cpp" -o -name "*.macro" \) | while read -r FILE; do
echo "Processing file: ${FILE}"
# Handle the cases where the copyright notice is enclosed in /* ... */
# and usually surrounded by //---- and //======.
${SED_COMMAND} -z -i -E 's@^//-------+\n+@@' "${FILE}"
${SED_COMMAND} -z -i -E 's@^.*Copyright.+(Ripple|Bougalis|Falco|Hinnant|Null|Ritchford|XRPLF).+PERFORMANCE OF THIS SOFTWARE\.\n\*/\n+@@' "${FILE}" # cspell: ignore Bougalis Falco Hinnant Ritchford
${SED_COMMAND} -z -i -E 's@^//=======+\n+@@' "${FILE}"
# Handle the cases where the copyright notice is commented out with //.
${SED_COMMAND} -z -i -E 's@^//\n// Copyright.+Falco \(vinnie dot falco at gmail dot com\)\n//\n+@@' "${FILE}" # cspell: ignore Vinnie Falco
done
# Handle the cases where the copyright notice is commented out with //.
${SED_COMMAND} -z -i -E 's@^//\n// Copyright.+Falco \(vinnie dot falco at gmail dot com\)\n//\n+@@' "${FILE}" # cspell: ignore Vinnie Falco
done
done
# Restore copyright notices that were removed from specific files, without
# restoring the verbiage that is already present in LICENSE.md. Ensure that if
# the script is run multiple times, duplicate notices are not added.
if ! grep -q 'Raw Material Software' include/xrpl/beast/core/CurrentThreadName.h; then
echo -e "// Portions of this file are from JUCE (http://www.juce.com).\n// Copyright (c) 2013 - Raw Material Software Ltd.\n// Please visit http://www.juce.com\n\n$(cat include/xrpl/beast/core/CurrentThreadName.h)" > include/xrpl/beast/core/CurrentThreadName.h
echo -e "// Portions of this file are from JUCE (http://www.juce.com).\n// Copyright (c) 2013 - Raw Material Software Ltd.\n// Please visit http://www.juce.com\n\n$(cat include/xrpl/beast/core/CurrentThreadName.h)" > include/xrpl/beast/core/CurrentThreadName.h
fi
if ! grep -q 'Dev Null' src/test/app/NetworkID_test.cpp; then
echo -e "// Copyright (c) 2020 Dev Null Productions\n\n$(cat src/test/app/NetworkID_test.cpp)" > src/test/app/NetworkID_test.cpp
echo -e "// Copyright (c) 2020 Dev Null Productions\n\n$(cat src/test/app/NetworkID_test.cpp)" > src/test/app/NetworkID_test.cpp
fi
if ! grep -q 'Dev Null' src/test/app/tx/apply_test.cpp; then
echo -e "// Copyright (c) 2020 Dev Null Productions\n\n$(cat src/test/app/tx/apply_test.cpp)" > src/test/app/tx/apply_test.cpp
echo -e "// Copyright (c) 2020 Dev Null Productions\n\n$(cat src/test/app/tx/apply_test.cpp)" > src/test/app/tx/apply_test.cpp
fi
if ! grep -q 'Dev Null' src/test/rpc/ManifestRPC_test.cpp; then
echo -e "// Copyright (c) 2020 Dev Null Productions\n\n$(cat src/test/rpc/ManifestRPC_test.cpp)" > src/test/rpc/ManifestRPC_test.cpp
echo -e "// Copyright (c) 2020 Dev Null Productions\n\n$(cat src/test/rpc/ManifestRPC_test.cpp)" > src/test/rpc/ManifestRPC_test.cpp
fi
if ! grep -q 'Dev Null' src/test/rpc/ValidatorInfo_test.cpp; then
echo -e "// Copyright (c) 2020 Dev Null Productions\n\n$(cat src/test/rpc/ValidatorInfo_test.cpp)" > src/test/rpc/ValidatorInfo_test.cpp
echo -e "// Copyright (c) 2020 Dev Null Productions\n\n$(cat src/test/rpc/ValidatorInfo_test.cpp)" > src/test/rpc/ValidatorInfo_test.cpp
fi
if ! grep -q 'Dev Null' src/xrpld/rpc/handlers/server_info/Manifest.cpp; then
echo -e "// Copyright (c) 2019 Dev Null Productions\n\n$(cat src/xrpld/rpc/handlers/server_info/Manifest.cpp)" > src/xrpld/rpc/handlers/server_info/Manifest.cpp
echo -e "// Copyright (c) 2019 Dev Null Productions\n\n$(cat src/xrpld/rpc/handlers/server_info/Manifest.cpp)" > src/xrpld/rpc/handlers/server_info/Manifest.cpp
fi
if ! grep -q 'Dev Null' src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp; then
echo -e "// Copyright (c) 2019 Dev Null Productions\n\n$(cat src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp)" > src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp
echo -e "// Copyright (c) 2019 Dev Null Productions\n\n$(cat src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp)" > src/xrpld/rpc/handlers/admin/status/ValidatorInfo.cpp
fi
if ! grep -q 'Bougalis' include/xrpl/basics/SlabAllocator.h; then
echo -e "// Copyright (c) 2022, Nikolaos D. Bougalis <nikb@bougalis.net>\n\n$(cat include/xrpl/basics/SlabAllocator.h)" > include/xrpl/basics/SlabAllocator.h # cspell: ignore Nikolaos Bougalis nikb
echo -e "// Copyright (c) 2022, Nikolaos D. Bougalis <nikb@bougalis.net>\n\n$(cat include/xrpl/basics/SlabAllocator.h)" > include/xrpl/basics/SlabAllocator.h # cspell: ignore Nikolaos Bougalis nikb
fi
if ! grep -q 'Bougalis' include/xrpl/basics/spinlock.h; then
echo -e "// Copyright (c) 2022, Nikolaos D. Bougalis <nikb@bougalis.net>\n\n$(cat include/xrpl/basics/spinlock.h)" > include/xrpl/basics/spinlock.h # cspell: ignore Nikolaos Bougalis nikb
echo -e "// Copyright (c) 2022, Nikolaos D. Bougalis <nikb@bougalis.net>\n\n$(cat include/xrpl/basics/spinlock.h)" > include/xrpl/basics/spinlock.h # cspell: ignore Nikolaos Bougalis nikb
fi
if ! grep -q 'Bougalis' include/xrpl/basics/tagged_integer.h; then
echo -e "// Copyright (c) 2014, Nikolaos D. Bougalis <nikb@bougalis.net>\n\n$(cat include/xrpl/basics/tagged_integer.h)" > include/xrpl/basics/tagged_integer.h # cspell: ignore Nikolaos Bougalis nikb
echo -e "// Copyright (c) 2014, Nikolaos D. Bougalis <nikb@bougalis.net>\n\n$(cat include/xrpl/basics/tagged_integer.h)" > include/xrpl/basics/tagged_integer.h # cspell: ignore Nikolaos Bougalis nikb
fi
if ! grep -q 'Ritchford' include/xrpl/beast/utility/Zero.h; then
echo -e "// Copyright (c) 2014, Tom Ritchford <tom@swirly.com>\n\n$(cat include/xrpl/beast/utility/Zero.h)" > include/xrpl/beast/utility/Zero.h # cspell: ignore Ritchford
echo -e "// Copyright (c) 2014, Tom Ritchford <tom@swirly.com>\n\n$(cat include/xrpl/beast/utility/Zero.h)" > include/xrpl/beast/utility/Zero.h # cspell: ignore Ritchford
fi
# Restore newlines and tabs in string literals in the affected file.

View File

@@ -6,11 +6,11 @@ set -e
# On MacOS, ensure that GNU sed is installed and available as `gsed`.
SED_COMMAND=sed
if [[ "${OSTYPE}" == 'darwin'* ]]; then
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
fi
# This script renames definitions, such as include guards, in this project.

View File

@@ -6,11 +6,11 @@ set -e
# On MacOS, ensure that GNU sed is installed and available as `gsed`.
SED_COMMAND=sed
if [[ "${OSTYPE}" == 'darwin'* ]]; then
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
fi
# This script renames all remaining references to `ripple` and `rippled` to

View File

@@ -23,8 +23,8 @@ fi
find "${DIRECTORY}" -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.ipp" \) | while read -r FILE; do
echo "Processing file: ${FILE}"
if grep -q "#ifndef XRPL_" "${FILE}"; then
echo "Please replace all include guards by #pragma once."
exit 1
echo "Please replace all include guards by #pragma once."
exit 1
fi
done
echo "Checking complete."

View File

@@ -6,11 +6,11 @@ set -e
# On MacOS, ensure that GNU sed is installed and available as `gsed`.
SED_COMMAND=sed
if [[ "${OSTYPE}" == 'darwin'* ]]; then
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
if ! command -v gsed &> /dev/null; then
echo "Error: gsed is not installed. Please install it using 'brew install gnu-sed'."
exit 1
fi
SED_COMMAND=gsed
fi
# This script renames the `ripple` namespace to `xrpl` in this project.
@@ -35,15 +35,15 @@ pushd "${DIRECTORY}"
DIRECTORIES=("include" "src" "tests")
for DIRECTORY in "${DIRECTORIES[@]}"; do
echo "Processing directory: ${DIRECTORY}"
echo "Processing directory: ${DIRECTORY}"
find "${DIRECTORY}" -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.ipp" -o -name "*.cpp" -o -name "*.macro" \) | while read -r FILE; do
echo "Processing file: ${FILE}"
${SED_COMMAND} -i 's/namespace ripple/namespace xrpl/g' "${FILE}"
${SED_COMMAND} -i 's/ripple::/xrpl::/g' "${FILE}"
${SED_COMMAND} -i 's/"ripple:/"xrpl::/g' "${FILE}"
${SED_COMMAND} -i -E 's/(BEAST_DEFINE_TESTSUITE.+)ripple(.+)/\1xrpl\2/g' "${FILE}"
done
find "${DIRECTORY}" -type f \( -name "*.h" -o -name "*.hpp" -o -name "*.ipp" -o -name "*.cpp" -o -name "*.macro" \) | while read -r FILE; do
echo "Processing file: ${FILE}"
${SED_COMMAND} -i 's/namespace ripple/namespace xrpl/g' "${FILE}"
${SED_COMMAND} -i 's/ripple::/xrpl::/g' "${FILE}"
${SED_COMMAND} -i 's/"ripple:/"xrpl::/g' "${FILE}"
${SED_COMMAND} -i -E 's/(BEAST_DEFINE_TESTSUITE.+)ripple(.+)/\1xrpl\2/g' "${FILE}"
done
done
# Special case for NuDBFactory that has ripple twice in the test suite name.

View File

@@ -210,22 +210,6 @@ jobs:
retention-days: 3
if-no-files-found: error
- name: Export server definitions
if: ${{ runner.os != 'Windows' && !inputs.build_only && env.VOIDSTAR_ENABLED != 'true' }}
working-directory: ${{ env.BUILD_DIR }}
run: |
set -o pipefail
./xrpld --definitions | python3 -m json.tool > server_definitions.json
- name: Upload server definitions
if: ${{ github.event.repository.visibility == 'public' && inputs.config_name == 'debian-bookworm-gcc-13-amd64-release' }}
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: server-definitions
path: ${{ env.BUILD_DIR }}/server_definitions.json
retention-days: 3
if-no-files-found: error
- name: Check linking (Linux)
if: ${{ runner.os == 'Linux' && env.SANITIZERS_ENABLED == 'false' }}
working-directory: ${{ env.BUILD_DIR }}

View File

@@ -20,22 +20,6 @@ repos:
- id: check-merge-conflict
args: [--assume-in-merge]
- repo: local
hooks:
- id: clang-tidy
name: "clang-tidy (enable with: TIDY=1)"
entry: ./bin/pre-commit/clang_tidy_check.py
language: python
types_or: [c++, c]
exclude: ^include/xrpl/protocol_autogen
pass_filenames: false # script determines the staged files itself
- id: fix-include-style
name: fix include style
entry: ./bin/pre-commit/fix_include_style.py
language: python
types_or: [c++, c]
exclude: ^include/xrpl/protocol_autogen/(transactions|ledger_entries)/
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: cd481d7b0bfb5c7b3090c21846317f9a8262e891 # frozen: v22.1.0
hooks:
@@ -60,12 +44,6 @@ repos:
hooks:
- id: black
- repo: https://github.com/openstack/bashate
rev: 5798d24d571676fc407e81df574c1ef57b520f23 # frozen: 2.1.1
hooks:
- id: bashate
args: ["--ignore=E006"]
- repo: https://github.com/streetsidesoftware/cspell-cli
rev: a42085ade523f591dca134379a595e7859986445 # frozen: v9.7.0
hooks:

View File

@@ -267,26 +267,6 @@ See the [environment setup guide](./docs/build/environment.md#clang-tidy) for pl
Before running clang-tidy, you must build the project to generate required files (particularly protobuf headers). Refer to [`BUILD.md`](./BUILD.md) for build instructions.
#### Via pre-commit (recommended)
If you have already installed the pre-commit hooks (see above), you can run clang-tidy on your staged files using:
```
TIDY=1 pre-commit run clang-tidy
```
This runs clang-tidy locally with the same configuration/flags as CI, scoped to your staged C++ files. The `TIDY=1` environment variable is required to opt in — without it the hook is skipped.
You can also have clang-tidy run automatically on every `git commit` by setting `TIDY=1` in your shell environment:
```
export TIDY=1
```
With this set, the hook will run as part of `git commit` alongside the other pre-commit checks.
#### Manually
Then run clang-tidy on your local changes:
```

View File

@@ -22,10 +22,117 @@ Responsible investigation includes, but isn't limited to, the following:
- Not targeting physical security measures, or attempting to use social engineering, spam, distributed denial of service (DDOS) attacks, etc.
- Investigating bugs in a way that makes a reasonable, good faith effort not to be disruptive or harmful to the XRP Ledger and the broader ecosystem.
### Responsible Disclosure
If you discover a vulnerability or potential threat, or if you _think_
you have, please reach out by dropping an email using the contact
information below.
Your report should include the following:
- Your contact information (typically, an email address);
- The description of the vulnerability;
- The attack scenario (if any);
- The steps to reproduce the vulnerability;
- Any other relevant details or artifacts, including code, scripts or patches.
In your email, please describe the issue or potential threat. If possible, include a "repro" (code that can reproduce the issue) or describe the best way to reproduce and replicate the issue. Please make your report as detailed and comprehensive as possible.
For more information on responsible disclosure, please read this [Wikipedia article](https://en.wikipedia.org/wiki/Responsible_disclosure).
## Report Handling Process
Please report the bug directly to us and limit further disclosure. If you want to prove that you knew the bug as of a given time, consider using a cryptographic pre-commitment: hash the content of your report and publish the hash on a medium of your choice (e.g. on Twitter or as a memo in a transaction) as "proof" that you had written the text at a given point in time.
Once we receive a report, we:
1. Assign two people to independently evaluate the report;
2. Consider their recommendations;
3. If action is necessary, formulate a plan to address the issue;
4. Communicate privately with the reporter to explain our plan.
5. Prepare, test and release a version which fixes the issue; and
6. Announce the vulnerability publicly.
We will triage and respond to your disclosure within 24 hours. Beyond that, we will work to analyze the issue in more detail, formulate, develop and test a fix.
While we commit to responding with 24 hours of your initial report with our triage assessment, we cannot guarantee a response time for the remaining steps. We will communicate with you throughout this process, letting you know where we are and keeping you updated on the timeframe.
## Bug Bounty Program
[Ripple](https://ripple.com) is generously sponsoring a bug bounty program for vulnerabilities in [`xrpld`](https://github.com/XRPLF/rippled) (and other related projects, like [`Clio`](https://github.com/XRPLF/clio), [`xrpl.js`](https://github.com/XRPLF/xrpl.js), [`xrpl-py`](https://github.com/XRPLF/xrpl-py), [`xrpl4j`](https://github.com/XRPLF/xrpl4j)).
[Ripple](https://ripple.com) is generously sponsoring a bug bounty program for vulnerabilities in [`xrpld`](https://github.com/XRPLF/rippled) (and other related projects, like [`xrpl.js`](https://github.com/XRPLF/xrpl.js), [`xrpl-py`](https://github.com/XRPLF/xrpl-py), [`xrpl4j`](https://github.com/XRPLF/xrpl4j)).
This program allows us to recognize and reward individuals or groups that identify and report bugs.
This program allows us to recognize and reward individuals or groups that identify and report bugs. In summary, in order to qualify for a bounty, the bug must be:
We have partnered with Bugcrowd to manage this program. It is a private program, and security researchers can participate based on invitation. If you need access to the program, please email bugs@ripple.com with your Bugcrowd handle or Bugcrowd registered email, and we will get you added to the program. Once you have been added, please submit vulnerability reports through Bugcrowd, not by email. The detailed bug bounty policy is available on the Bugcrowd website.
1. **In scope**. Only bugs in software under the scope of the program qualify. Currently, that means `xrpld`, `xrpl.js`, `xrpl-py`, `xrpl4j`.
2. **Relevant**. A security issue, posing a danger to user funds, privacy, or the operation of the XRP Ledger.
3. **Original and previously unknown**. Bugs that are already known and discussed in public do not qualify. Previously reported bugs, even if publicly unknown, are not eligible.
4. **Specific**. We welcome general security advice or recommendations, but we cannot pay bounties for that.
5. **Fixable**. There has to be something we can do to permanently fix the problem. Note that bugs in other peoples software may still qualify in some cases. For example, if you find a bug in a library that we use which can compromise the security of software that is in scope and we can get it fixed, you may qualify for a bounty.
6. **Unused**. If you use the exploit to attack the XRP Ledger, you do not qualify for a bounty. If you report a vulnerability used in an ongoing or past attack and there is specific, concrete evidence that suggests you are the attacker we reserve the right not to pay a bounty.
The amount paid varies dramatically. Vulnerabilities that are harmless on their own, but could form part of a critical exploit will usually receive a bounty. Full-blown exploits can receive much higher bounties. Please dont hold back partial vulnerabilities while trying to construct a full-blown exploit. We will pay a bounty to anyone who reports a complete chain of vulnerabilities even if they have reported each component of the exploit separately and those vulnerabilities have been fixed in the meantime. However, to qualify for a the full bounty, you must to have been the first to report each of the partial exploits.
### Contacting Us
To report a qualifying bug, please send a detailed report to:
| Email Address | bugs@ripple.com |
| :-----------: | :-------------------------------------------------- |
| Short Key ID | `0xA9F514E0` |
| Long Key ID | `0xD900855AA9F514E0` |
| Fingerprint | `B72C 0654 2F2A E250 2763 A268 D900 855A A9F5 14E0` |
The full PGP key for this address, which is also available on several key servers (e.g. on [keyserver.ubuntu.com](https://keyserver.ubuntu.com)), is:
```
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBGkSZAQBEACprU199OhgdsOsygNjiQV4msuN3vDOUooehL+NwfsGfW79Tbqq
Q2u7uQ3NZjW+M2T4nsDwuhkr7pe7xSReR5W8ssaczvtUyxkvbMClilcgZ2OSCAuC
N9tzJsqOqkwBvXoNXkn//T2jnPz0ZU2wSF+NrEibq5FeuyGdoX3yXXBxq9pW9HzK
HkQll63QSl6BzVSGRQq+B6lGgaZGLwf3mzmIND9Z5VGLNK2jKynyz9z091whNG/M
kV+E7/r/bujHk7WIVId07G5/COTXmSr7kFnNEkd2Umw42dkgfiNKvlmJ9M7c1wLK
KbL9Eb4ADuW6rRc5k4s1e6GT8R4/VPliWbCl9SE32hXH8uTkqVIFZP2eyM5WRRHs
aKzitkQG9UK9gcb0kdgUkxOvvgPHAe5IuZlcHFzU4y0dBbU1VEFWVpiLU0q+IuNw
5BRemeHc59YNsngkmAZ+/9zouoShRusZmC8Wzotv75C2qVBcjijPvmjWAUz0Zunm
Lsr+O71vqHE73pERjD07wuD/ISjiYRYYE/bVrXtXLZijC7qAH4RE3nID+2ojcZyO
/2jMQvt7un56RsGH4UBHi3aBHi9bUoDGCXKiQY981cEuNaOxpou7Mh3x/ONzzSvk
sTV6nl1LOZHykN1JyKwaNbTSAiuyoN+7lOBqbV04DNYAHL88PrT21P83aQARAQAB
tB1SaXBwbGUgTGFicyA8YnVnc0ByaXBwbGUuY29tPokCTgQTAQgAOBYhBLcsBlQv
KuJQJ2OiaNkAhVqp9RTgBQJpEmQEAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
AAoJENkAhVqp9RTgBzgP/i7y+aDWl1maig1XMdyb+o0UGusumFSW4Hmj278wlKVv
usgLPihYgHE0PKrv6WRyKOMC1tQEcYYN93M+OeQ1vFhS2YyURq6RCMmh4zq/awXG
uZbG36OURB5NH8lGBOHiN/7O+nY0CgenBT2JWm+GW3nEOAVOVm4+r5GlpPlv+Dp1
NPBThcKXFMnH73++NpSQoDzTfRYHPxhDAX3jkLi/moXfSanOLlR6l94XNNN0jBHW
Quao0rzf4WSXq9g6AS224xhAA5JyIcFl8TX7hzj5HaFn3VWo3COoDu4U7H+BM0fl
85yqiMQypp7EhN2gxpMMWaHY5TFM85U/bFXFYfEgihZ4/gt4uoIzsNI9jlX7mYvG
KFdDij+oTlRsuOxdIy60B3dKcwOH9nZZCz0SPsN/zlRWgKzK4gDKdGhFkU9OlvPu
94ZqscanoiWKDoZkF96+sjgfjkuHsDK7Lwc1Xi+T4drHG/3aVpkYabXox+lrKB/S
yxZjeqOIQzWPhnLgCaLyvsKo5hxKzL0w3eURu8F3IS7RgOOlljv4M+Me9sEVcdNV
aN3/tQwbaomSX1X5D5YXqhBwC3rU3wXwamsscRTGEpkV+JCX6KUqGP7nWmxCpAly
FL05XuOd5SVHJjXLeuje0JqLUpN514uL+bThWwDbDTdAdwW3oK/2WbXz7IfJRLBj
uQINBGkSZAQBEADdI3SL2F72qkrgFqXWE6HSRBu9bsAvTE5QrRPWk7ux6at537r4
S4sIw2dOwLvbyIrDgKNq3LQ5wCK88NO/NeCOFm4AiCJSl3pJHXYnTDoUxTrrxx+o
vSRI4I3fHEql/MqzgiAb0YUezjgFdh3vYheMPp/309PFbOLhiFqEcx80Mx5h06UH
gDzu1qNj3Ec+31NLic5zwkrAkvFvD54d6bqYR3SEgMau6aYEewpGHbWBi2pLqSi2
lQcAeOFixqGpTwDmAnYR8YtjBYepy0MojEAdTHcQQlOYSDk4q4elG+io2N8vECfU
rD6ORecN48GXdZINYWTAdslrUeanmBdgQrYkSpce8TSghgT9P01SNaXxmyaehVUO
lqI4pcg5G2oojAE8ncNS3TwDtt7daTaTC3bAdr4PXDVAzNAiewjMNZPB7xidkDGQ
Y4W1LxTMXyJVWxehYOH7tsbBRKninlfRnLgYzmtIbNRAAvNcsxU6ihv3AV0WFknN
YbSzotEv1Xq/5wk309x8zCDe+sP0cQicvbXafXmUzPAZzeqFg+VLFn7F9MP1WGlW
B1u7VIvBF1Mp9Nd3EAGBAoLRdRu+0dVWIjPTQuPIuD9cCatJA0wVaKUrjYbBMl88
a12LixNVGeSFS9N7ADHx0/o7GNT6l88YbaLP6zggUHpUD/bR+cDN7vllIQARAQAB
iQI2BBgBCAAgFiEEtywGVC8q4lAnY6Jo2QCFWqn1FOAFAmkSZAQCGwwACgkQ2QCF
Wqn1FOAfAA/8CYq4p0p4bobY20CKEMsZrkBTFJyPDqzFwMeTjgpzqbD7Y3Qq5QCK
OBbvY02GWdiIsNOzKdBxiuam2xYP9WHZj4y7/uWEvT0qlPVmDFu+HXjoJ43oxwFd
CUp2gMuQ4cSL3X94VRJ3BkVL+tgBm8CNY0vnTLLOO3kum/R69VsGJS1JSGUWjNM+
4qwS3mz+73xJu1HmERyN2RZF/DGIZI2PyONQQ6aH85G1Dd2ohu2/DBAkQAMBrPbj
FrbDaBLyFhODxU3kTWqnfLlaElSm2EGdIU2yx7n4BggEa//NZRMm5kyeo4vzhtlQ
YIVUMLAOLZvnEqDnsLKp+22FzNR/O+htBQC4lPywl53oYSALdhz1IQlcAC1ru5KR
XPzhIXV6IIzkcx9xNkEclZxmsuy5ERXyKEmLbIHAlzFmnrldlt2ZgXDtzaorLmxj
klKibxd5tF50qOpOivz+oPtFo7n+HmFa1nlVAMxlDCUdM0pEVeYDKI5zfVwalyhZ
NnjpakdZSXMwgc7NP/hH9buF35hKDp7EckT2y3JNYwHsDdy1icXN2q40XZw5tSIn
zkPWdu3OUY8PISohN6Pw4h0RH4ZmoX97E8sEfmdKaT58U4Hf2aAv5r9IWCSrAVqY
u5jvac29CzQR9Kal0A+8phHAXHNFD83SwzIC0syaT9ficAguwGH8X6Q=
=nGuD
-----END PGP PUBLIC KEY BLOCK-----
```

View File

@@ -1,13 +1,14 @@
#!/bin/bash
if [[ $# -ne 1 || "$1" == "--help" || "$1" == "-h" ]]; then
name=$( basename $0 )
cat <<- USAGE
Usage: $name <username>
if [[ $# -ne 1 || "$1" == "--help" || "$1" == "-h" ]]
then
name=$( basename $0 )
cat <<- USAGE
Usage: $name <username>
Where <username> is the Github username of the upstream repo. e.g. XRPLF
Where <username> is the Github username of the upstream repo. e.g. XRPLF
USAGE
exit 0
exit 0
fi
# Create upstream remotes based on origin
@@ -15,9 +16,10 @@ shift
user="$1"
# Get the origin URL. Expect it be an SSH-style URL
origin=$( git remote get-url origin )
if [[ "${origin}" == "" ]]; then
echo Invalid origin remote >&2
exit 1
if [[ "${origin}" == "" ]]
then
echo Invalid origin remote >&2
exit 1
fi
# echo "Origin: ${origin}"
# Parse the origin
@@ -28,9 +30,11 @@ IFS='@' read sshuser server <<< "${remote}"
# echo "SSHUser: ${sshuser}, Server: ${server}"
IFS='/' read originuser repo <<< "${originpath}"
# echo "Originuser: ${originuser}, Repo: ${repo}"
if [[ "${sshuser}" == "" || "${server}" == "" || "${originuser}" == "" || "${repo}" == "" ]]; then
echo "Can't parse origin URL: ${origin}" >&2
exit 1
if [[ "${sshuser}" == "" || "${server}" == "" || "${originuser}" == ""
|| "${repo}" == "" ]]
then
echo "Can't parse origin URL: ${origin}" >&2
exit 1
fi
upstream="https://${server}/${user}/${repo}"
upstreampush="${remote}:${user}/${repo}"
@@ -38,34 +42,42 @@ upstreamgroup="upstream upstream-push"
current=$( git remote get-url upstream 2>/dev/null )
currentpush=$( git remote get-url upstream-push 2>/dev/null )
currentgroup=$( git config remotes.upstreams )
if [[ "${current}" == "${upstream}" ]]; then
echo "Upstream already set up correctly. Skip"
elif [[ -n "${current}" && "${current}" != "${upstream}" && "${current}" != "${upstreampush}" ]]; then
echo "Upstream already set up as: ${current}. Skip"
if [[ "${current}" == "${upstream}" ]]
then
echo "Upstream already set up correctly. Skip"
elif [[ -n "${current}" && "${current}" != "${upstream}" &&
"${current}" != "${upstreampush}" ]]
then
echo "Upstream already set up as: ${current}. Skip"
else
if [[ "${current}" == "${upstreampush}" ]]; then
echo "Upstream set to dangerous push URL. Update."
_run git remote rename upstream upstream-push || \
_run git remote remove upstream
currentpush=$( git remote get-url upstream-push 2>/dev/null )
fi
_run git remote add upstream "${upstream}"
if [[ "${current}" == "${upstreampush}" ]]
then
echo "Upstream set to dangerous push URL. Update."
_run git remote rename upstream upstream-push || \
_run git remote remove upstream
currentpush=$( git remote get-url upstream-push 2>/dev/null )
fi
_run git remote add upstream "${upstream}"
fi
if [[ "${currentpush}" == "${upstreampush}" ]]; then
echo "upstream-push already set up correctly. Skip"
elif [[ -n "${currentpush}" && "${currentpush}" != "${upstreampush}" ]]; then
echo "upstream-push already set up as: ${currentpush}. Skip"
if [[ "${currentpush}" == "${upstreampush}" ]]
then
echo "upstream-push already set up correctly. Skip"
elif [[ -n "${currentpush}" && "${currentpush}" != "${upstreampush}" ]]
then
echo "upstream-push already set up as: ${currentpush}. Skip"
else
_run git remote add upstream-push "${upstreampush}"
_run git remote add upstream-push "${upstreampush}"
fi
if [[ "${currentgroup}" == "${upstreamgroup}" ]]; then
echo "Upstreams group already set up correctly. Skip"
elif [[ -n "${currentgroup}" && "${currentgroup}" != "${upstreamgroup}" ]]; then
echo "Upstreams group already set up as: ${currentgroup}. Skip"
if [[ "${currentgroup}" == "${upstreamgroup}" ]]
then
echo "Upstreams group already set up correctly. Skip"
elif [[ -n "${currentgroup}" && "${currentgroup}" != "${upstreamgroup}" ]]
then
echo "Upstreams group already set up as: ${currentgroup}. Skip"
else
_run git config --add remotes.upstreams "${upstreamgroup}"
_run git config --add remotes.upstreams "${upstreamgroup}"
fi
_run git fetch --jobs=$(nproc) upstreams

View File

@@ -1,16 +1,17 @@
#!/bin/bash
if [[ $# -lt 3 || "$1" == "--help" || "$1" = "-h" ]]; then
name=$( basename $0 )
cat <<- USAGE
Usage: $name workbranch base/branch user/branch [user/branch [...]]
if [[ $# -lt 3 || "$1" == "--help" || "$1" = "-h" ]]
then
name=$( basename $0 )
cat <<- USAGE
Usage: $name workbranch base/branch user/branch [user/branch [...]]
* workbranch will be created locally from base/branch
* base/branch and user/branch may be specified as user:branch to allow
easy copying from Github PRs
* Remotes for each user must already be set up
* workbranch will be created locally from base/branch
* base/branch and user/branch may be specified as user:branch to allow
easy copying from Github PRs
* Remotes for each user must already be set up
USAGE
exit 0
exit 0
fi
work="$1"
@@ -23,8 +24,9 @@ unset branches[0]
set -e
users=()
for b in "${branches[@]}"; do
users+=( $( echo $b | cut -d/ -f1 ) )
for b in "${branches[@]}"
do
users+=( $( echo $b | cut -d/ -f1 ) )
done
users=( $( printf '%s\n' "${users[@]}" | sort -u ) )
@@ -32,9 +34,10 @@ users=( $( printf '%s\n' "${users[@]}" | sort -u ) )
git fetch --multiple upstreams "${users[@]}"
git checkout -B "$work" --no-track "$base"
for b in "${branches[@]}"; do
git merge --squash "${b}"
git commit -S # Use the commit message provided on the PR
for b in "${branches[@]}"
do
git merge --squash "${b}"
git commit -S # Use the commit message provided on the PR
done
# Make sure the commits look right
@@ -44,11 +47,13 @@ parts=( $( echo $base | sed "s/\// /" ) )
repo="${parts[0]}"
b="${parts[1]}"
push=$repo
if [[ "$push" == "upstream" ]]; then
push="upstream-push"
if [[ "$push" == "upstream" ]]
then
push="upstream-push"
fi
if [[ "$repo" == "upstream" ]]; then
repo="upstreams"
if [[ "$repo" == "upstream" ]]
then
repo="upstreams"
fi
cat << PUSH

View File

@@ -1,16 +1,17 @@
#!/bin/bash
if [[ $# -ne 3 || "$1" == "--help" || "$1" = "-h" ]]; then
name=$( basename $0 )
cat <<- USAGE
Usage: $name workbranch base/branch version
if [[ $# -ne 3 || "$1" == "--help" || "$1" = "-h" ]]
then
name=$( basename $0 )
cat <<- USAGE
Usage: $name workbranch base/branch version
* workbranch will be created locally from base/branch. If it exists,
it will be reused, so make sure you don't overwrite any work.
* base/branch may be specified as user:branch to allow easy copying
from Github PRs.
* workbranch will be created locally from base/branch. If it exists,
it will be reused, so make sure you don't overwrite any work.
* base/branch may be specified as user:branch to allow easy copying
from Github PRs.
USAGE
exit 0
exit 0
fi
work="$1"
@@ -29,9 +30,10 @@ git fetch upstreams
git checkout -B "${work}" --no-track "${base}"
push=$( git rev-parse --abbrev-ref --symbolic-full-name '@{push}' \
2>/dev/null ) || true
if [[ "${push}" != "" ]]; then
echo "Warning: ${push} may already exist."
2>/dev/null ) || true
if [[ "${push}" != "" ]]
then
echo "Warning: ${push} may already exist."
fi
build=$( find -name BuildInfo.cpp )

View File

@@ -1,206 +0,0 @@
#!/usr/bin/env python3
"""Pre-commit hook that runs clang-tidy on changed files using run-clang-tidy."""
from __future__ import annotations
import json
import os
import re
import shutil
import subprocess
import sys
from collections import defaultdict
from pathlib import Path
HEADER_EXTENSIONS = {".h", ".hpp", ".ipp"}
SOURCE_EXTENSIONS = {".cpp"}
INCLUDE_RE = re.compile(r"^\s*#\s*include\s*[<\"]([^>\"]+)[>\"]")
def find_run_clang_tidy() -> str | None:
for candidate in ("run-clang-tidy-21", "run-clang-tidy"):
if path := shutil.which(candidate):
return path
return None
def find_build_dir(repo_root: Path) -> Path | None:
for name in (".build", "build"):
candidate = repo_root / name
if (candidate / "compile_commands.json").exists():
return candidate
return None
def build_include_graph(build_dir: Path, repo_root: Path) -> tuple[dict, set]:
"""
Scan all files reachable from compile_commands.json and build an inverted include graph.
Returns:
inverted: header_path -> set of files that include it
source_files: set of all TU paths from compile_commands.json
"""
with open(build_dir / "compile_commands.json") as f:
db = json.load(f)
source_files = {Path(e["file"]).resolve() for e in db}
include_roots = [repo_root / "include", repo_root / "src"]
inverted: dict[Path, set[Path]] = defaultdict(set)
to_scan: set[Path] = set(source_files)
scanned: set[Path] = set()
while to_scan:
file = to_scan.pop()
if file in scanned or not file.exists():
continue
scanned.add(file)
content = file.read_text()
for line in content.splitlines():
m = INCLUDE_RE.match(line)
if not m:
continue
for root in include_roots:
candidate = (root / m.group(1)).resolve()
if candidate.exists():
inverted[candidate].add(file)
if candidate not in scanned:
to_scan.add(candidate)
break
return inverted, source_files
def find_tus_for_headers(
headers: list[Path],
inverted: dict[Path, set[Path]],
source_files: set[Path],
) -> set[Path]:
"""
For each header, pick one TU that transitively includes it.
Prefers a TU whose stem matches the header's stem, otherwise picks the first found.
"""
result: set[Path] = set()
for header in headers:
preferred: Path | None = None
visited: set[Path] = {header}
stack: list[Path] = [header]
while stack:
h = stack.pop()
for inc in inverted.get(h, ()):
if inc in source_files:
if inc.stem == header.stem:
preferred = inc
break
if preferred is None:
preferred = inc
if inc not in visited:
visited.add(inc)
stack.append(inc)
if preferred is not None and preferred.stem == header.stem:
break
if preferred is not None:
result.add(preferred)
return result
def resolve_files(
input_files: list[str], build_dir: Path, repo_root: Path
) -> list[str]:
"""
Split input into source files and headers. Source files are passed through;
headers are resolved to the TUs that transitively include them.
"""
sources: list[Path] = []
headers: list[Path] = []
for f in input_files:
p = Path(f).resolve()
if p.suffix in SOURCE_EXTENSIONS:
sources.append(p)
elif p.suffix in HEADER_EXTENSIONS:
headers.append(p)
if not headers:
return [str(p) for p in sources]
print(
f"Resolving {len(headers)} header(s) to compilation units...", file=sys.stderr
)
inverted, source_files = build_include_graph(build_dir, repo_root)
tus = find_tus_for_headers(headers, inverted, source_files)
if not tus:
print(
"Warning: no compilation units found that include the modified headers; "
"skipping clang-tidy for headers.",
file=sys.stderr,
)
return sorted({str(p) for p in (*sources, *tus)})
def staged_files(repo_root: Path) -> list[str]:
result = subprocess.run(
["git", "diff", "--staged", "--name-only", "--diff-filter=d"],
capture_output=True,
text=True,
cwd=repo_root,
)
if result.returncode != 0:
print(
"clang-tidy check failed: 'git diff --staged' command failed.",
file=sys.stderr,
)
if result.stderr:
print(result.stderr, file=sys.stderr)
sys.exit(result.returncode or 1)
return [str(repo_root / p) for p in result.stdout.splitlines() if p]
def main():
if not os.environ.get("TIDY"):
return 0
repo_root = Path(__file__).parent.parent
files = staged_files(repo_root)
if not files:
return 0
run_clang_tidy = find_run_clang_tidy()
if not run_clang_tidy:
print(
"clang-tidy check failed: TIDY is enabled but neither "
"'run-clang-tidy-21' nor 'run-clang-tidy' was found in PATH.",
file=sys.stderr,
)
return 1
build_dir = find_build_dir(repo_root)
if not build_dir:
print(
"clang-tidy check failed: no build directory with compile_commands.json found "
"(looked for .build/ and build/)",
file=sys.stderr,
)
return 1
tidy_files = resolve_files(files, build_dir, repo_root)
if not tidy_files:
return 0
result = subprocess.run(
[run_clang_tidy, "-quiet", "-p", str(build_dir), "-fix", "-allow-no-checks"]
+ tidy_files
)
return result.returncode
if __name__ == "__main__":
sys.exit(main())

View File

@@ -1,37 +0,0 @@
#!/usr/bin/env python3
"""
Converts quoted includes (#include "...") to angle-bracket includes
(#include <...>), which is the required style in this project.
Usage: ./bin/pre-commit/fix_include_style.py <file1> <file2> ...
"""
import re
import sys
from pathlib import Path
PATTERN = re.compile(r'^(\s*#include\s*)"([^"]+)"', re.MULTILINE)
def fix_includes(path: Path) -> bool:
original = path.read_text(encoding="utf-8")
fixed = PATTERN.sub(r"\1<\2>", original)
if fixed != original:
path.write_text(fixed, encoding="utf-8")
return False
return True
def main() -> int:
files = [Path(f) for f in sys.argv[1:]]
success = True
for path in files:
success &= fix_includes(path)
return 0 if success else 1
if __name__ == "__main__":
sys.exit(main())

View File

@@ -118,7 +118,7 @@ if(MSVC)
NOMINMAX
# TODO: Resolve these warnings, don't just silence them
_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:Debug>>:_CRTDBG_MAP_ALLOC>
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<CONFIG:Debug>,$<NOT:$<BOOL:${is_ci}>>>:_CRTDBG_MAP_ALLOC>
)
target_link_libraries(common INTERFACE -errorreport:none -machine:X64)
else()

View File

@@ -23,14 +23,14 @@ rm -f conan.lock
# first create command will create a new lockfile, while the subsequent create
# commands will merge any additional dependencies into the created lockfile.
conan lock create . \
--options '&:jemalloc=True' \
--options '&:rocksdb=True' \
--profile:all=conan/lockfile/linux.profile
--options '&:jemalloc=True' \
--options '&:rocksdb=True' \
--profile:all=conan/lockfile/linux.profile
conan lock create . \
--options '&:jemalloc=True' \
--options '&:rocksdb=True' \
--profile:all=conan/lockfile/macos.profile
--options '&:jemalloc=True' \
--options '&:rocksdb=True' \
--profile:all=conan/lockfile/macos.profile
conan lock create . \
--options '&:jemalloc=True' \
--options '&:rocksdb=True' \
--profile:all=conan/lockfile/windows.profile
--options '&:jemalloc=True' \
--options '&:rocksdb=True' \
--profile:all=conan/lockfile/windows.profile

View File

@@ -1,6 +1,6 @@
#pragma once
#include <filesystem>
#include <boost/filesystem.hpp>
namespace xrpl {
@@ -12,6 +12,6 @@ namespace xrpl {
@throws runtime_error
*/
void
extractTarLz4(std::filesystem::path const& src, std::filesystem::path const& dst);
extractTarLz4(boost::filesystem::path const& src, boost::filesystem::path const& dst);
} // namespace xrpl

View File

@@ -36,7 +36,7 @@ public:
explicit Section(std::string name = "");
/** Returns the name of this section. */
[[nodiscard]] std::string const&
std::string const&
name() const
{
return name_;
@@ -45,7 +45,7 @@ public:
/** Returns all the lines in the section.
This includes everything.
*/
[[nodiscard]] std::vector<std::string> const&
std::vector<std::string> const&
lines() const
{
return lines_;
@@ -54,7 +54,7 @@ public:
/** Returns all the values in the section.
Values are non-empty lines which are not key/value pairs.
*/
[[nodiscard]] std::vector<std::string> const&
std::vector<std::string> const&
values() const
{
return values_;
@@ -82,7 +82,7 @@ public:
* @return The retrieved value. A section with an empty legacy value returns
an empty string.
*/
[[nodiscard]] std::string
std::string
legacy() const
{
if (lines_.empty())
@@ -117,11 +117,11 @@ public:
}
/** Returns `true` if a key with the given name exists. */
[[nodiscard]] bool
bool
exists(std::string const& name) const;
template <class T = std::string>
[[nodiscard]] std::optional<T>
std::optional<T>
get(std::string const& name) const
{
auto const iter = lookup_.find(name);
@@ -132,7 +132,7 @@ public:
/// Returns a value if present, else another value.
template <class T>
[[nodiscard]] T
T
value_or(std::string const& name, T const& other) const
{
auto const v = get<T>(name);
@@ -141,7 +141,7 @@ public:
// indicates if trailing comments were seen
// during the appending of any lines/values
[[nodiscard]] bool
bool
had_trailing_comments() const
{
return had_trailing_comments_;
@@ -151,42 +151,42 @@ public:
operator<<(std::ostream&, Section const& section);
// Returns `true` if there are no key/value pairs.
[[nodiscard]] bool
bool
empty() const
{
return lookup_.empty();
}
// Returns the number of key/value pairs.
[[nodiscard]] std::size_t
std::size_t
size() const
{
return lookup_.size();
}
// For iteration of key/value pairs.
[[nodiscard]] const_iterator
const_iterator
begin() const
{
return lookup_.cbegin();
}
// For iteration of key/value pairs.
[[nodiscard]] const_iterator
const_iterator
cbegin() const
{
return lookup_.cbegin();
}
// For iteration of key/value pairs.
[[nodiscard]] const_iterator
const_iterator
end() const
{
return lookup_.cend();
}
// For iteration of key/value pairs.
[[nodiscard]] const_iterator
const_iterator
cend() const
{
return lookup_.cend();
@@ -206,7 +206,7 @@ private:
public:
/** Returns `true` if a section with the given name exists. */
[[nodiscard]] bool
bool
exists(std::string const& name) const;
/** Returns the section with the given name.
@@ -216,7 +216,7 @@ public:
Section&
section(std::string const& name);
[[nodiscard]] Section const&
Section const&
section(std::string const& name) const;
Section const&
@@ -264,7 +264,7 @@ public:
* legacy value.
* @return Contents of the legacy value.
*/
[[nodiscard]] std::string
std::string
legacy(std::string const& sectionName) const;
friend std::ostream&
@@ -272,7 +272,7 @@ public:
// indicates if trailing comments were seen
// in any loaded Sections
[[nodiscard]] bool
bool
had_trailing_comments() const
{
return std::ranges::any_of(map_, [](auto s) { return s.second.had_trailing_comments(); });

View File

@@ -92,7 +92,7 @@ public:
{
// Ensure the slice isn't a subset of the buffer.
XRPL_ASSERT(
s.empty() || size_ == 0 || s.data() < p_.get() || s.data() >= p_.get() + size_,
s.size() == 0 || size_ == 0 || s.data() < p_.get() || s.data() >= p_.get() + size_,
"xrpl::Buffer::operator=(Slice) : input not a subset");
if (auto p = alloc(s.size()))
@@ -101,13 +101,13 @@ public:
}
/** Returns the number of bytes in the buffer. */
[[nodiscard]] std::size_t
std::size_t
size() const noexcept
{
return size_;
}
[[nodiscard]] bool
bool
empty() const noexcept
{
return 0 == size_;
@@ -125,7 +125,7 @@ public:
to a single byte, to facilitate pointer arithmetic.
*/
/** @{ */
[[nodiscard]] std::uint8_t const*
std::uint8_t const*
data() const noexcept
{
return p_.get();
@@ -169,25 +169,25 @@ public:
return alloc(n);
}
[[nodiscard]] const_iterator
const_iterator
begin() const noexcept
{
return p_.get();
}
[[nodiscard]] const_iterator
const_iterator
cbegin() const noexcept
{
return p_.get();
}
[[nodiscard]] const_iterator
const_iterator
end() const noexcept
{
return p_.get() + size_;
}
[[nodiscard]] const_iterator
const_iterator
cend() const noexcept
{
return p_.get() + size_;

View File

@@ -19,7 +19,7 @@ public:
using Entry = std::pair<std::string, int>;
using List = std::vector<Entry>;
[[nodiscard]] List
List
getCounts(int minimumThreshold) const;
public:
@@ -59,19 +59,19 @@ public:
return --count_;
}
[[nodiscard]] int
int
getCount() const noexcept
{
return count_.load();
}
[[nodiscard]] Counter*
Counter*
getNext() const noexcept
{
return next_;
}
[[nodiscard]] std::string const&
std::string const&
getName() const noexcept
{
return name_;

View File

@@ -73,7 +73,7 @@ public:
{
}
[[nodiscard]] constexpr E const&
constexpr E const&
value() const&
{
return val_;
@@ -91,7 +91,7 @@ public:
return std::move(val_);
}
[[nodiscard]] constexpr E const&&
constexpr E const&&
value() const&&
{
return std::move(val_);
@@ -125,13 +125,13 @@ public:
{
}
[[nodiscard]] constexpr bool
constexpr bool
has_value() const
{
return Base::has_value();
}
[[nodiscard]] constexpr T const&
constexpr T const&
value() const
{
return Base::value();
@@ -143,7 +143,7 @@ public:
return Base::value();
}
[[nodiscard]] constexpr E const&
constexpr E const&
error() const
{
return Base::error();
@@ -210,7 +210,7 @@ public:
{
}
[[nodiscard]] constexpr E const&
constexpr E const&
error() const
{
return Base::error();

View File

@@ -1,22 +1,22 @@
#pragma once
#include <filesystem>
#include <boost/filesystem.hpp>
#include <boost/system/error_code.hpp>
#include <optional>
#include <string>
#include <system_error>
namespace xrpl {
std::string
getFileContents(
std::error_code& ec,
std::filesystem::path const& sourcePath,
boost::system::error_code& ec,
boost::filesystem::path const& sourcePath,
std::optional<std::size_t> maxSize = std::nullopt);
void
writeFileContents(
std::error_code& ec,
std::filesystem::path const& destPath,
boost::system::error_code& ec,
boost::filesystem::path const& destPath,
std::string const& contents);
} // namespace xrpl

View File

@@ -159,11 +159,11 @@ public:
reset();
/** Get the raw pointer */
[[nodiscard]] T*
T*
get() const;
/** Return the strong count */
[[nodiscard]] std::size_t
std::size_t
use_count() const;
template <class TT, class... Args>
@@ -181,7 +181,7 @@ public:
private:
/** Return the raw pointer held by this object. */
[[nodiscard]] T*
T*
unsafeGetRawPtr() const;
/** Exchange the current raw pointer held by this object with the given
@@ -260,7 +260,7 @@ public:
lock() const;
/** Return true if the strong count is zero. */
[[nodiscard]] bool
bool
expired() const;
/** Set the pointer to null and decrement the weak count.
@@ -339,7 +339,7 @@ public:
don't lock the weak pointer. Use the `lock` method if that's what's
needed)
*/
[[nodiscard]] SharedIntrusive<T>
SharedIntrusive<T>
getStrong() const;
/** Return true if this is a strong pointer and the strong pointer is
@@ -357,31 +357,31 @@ public:
/** If this is a strong pointer, return the raw pointer. Otherwise
return null.
*/
[[nodiscard]] T*
T*
get() const;
/** If this is a strong pointer, return the strong count. Otherwise
* return 0
*/
[[nodiscard]] std::size_t
std::size_t
use_count() const;
/** Return true if there is a non-zero strong count. */
[[nodiscard]] bool
bool
expired() const;
/** If this is a strong pointer, return the strong pointer. Otherwise
attempt to lock the weak pointer.
*/
[[nodiscard]] SharedIntrusive<T>
SharedIntrusive<T>
lock() const;
/** Return true is this represents a strong pointer. */
[[nodiscard]] bool
bool
isStrong() const;
/** Return true is this represents a weak pointer. */
[[nodiscard]] bool
bool
isWeak() const;
/** If this is a weak pointer, attempt to convert it to a strong
@@ -412,7 +412,7 @@ private:
private:
/** Return the raw pointer held by this object.
*/
[[nodiscard]] T*
T*
unsafeGetRawPtr() const;
enum class RefStrength { strong, weak };

View File

@@ -207,7 +207,7 @@ private:
RefCountPair(CountType s, CountType w) noexcept;
/** Convert back to the packed integer form. */
[[nodiscard]] FieldType
FieldType
combinedValue() const noexcept;
static constexpr CountType maxStrongValue =

View File

@@ -4,8 +4,8 @@
#include <xrpl/beast/utility/Journal.h>
#include <boost/beast/core/string.hpp>
#include <boost/filesystem.hpp>
#include <filesystem>
#include <fstream>
#include <map>
#include <memory>
@@ -76,7 +76,7 @@ private:
@return `true` if a system file is associated and opened for
writing.
*/
[[nodiscard]] bool
bool
isOpen() const noexcept;
/** Associate a system file with the log.
@@ -88,7 +88,7 @@ private:
@return `true` if the file was opened.
*/
bool
open(std::filesystem::path const& path);
open(boost::filesystem::path const& path);
/** Close and re-open the system file associated with the log
This assists in interoperating with external log management tools.
@@ -130,7 +130,7 @@ private:
private:
std::unique_ptr<std::ofstream> m_stream;
std::filesystem::path m_path;
boost::filesystem::path m_path;
};
std::mutex mutable mutex_;
@@ -149,7 +149,7 @@ public:
virtual ~Logs() = default;
bool
open(std::filesystem::path const& pathToLogFile);
open(boost::filesystem::path const& pathToLogFile);
beast::Journal::Sink&
get(std::string const& name);

View File

@@ -44,7 +44,7 @@ public:
return data_;
}
[[nodiscard]] ProtectedDataType const&
ProtectedDataType const&
get() const
{
return data_;

View File

@@ -252,9 +252,9 @@ public:
// Assume unsigned values are... unsigned. i.e. positive
explicit Number(internalrep mantissa, int exponent, normalized);
[[nodiscard]] constexpr rep
constexpr rep
mantissa() const noexcept;
[[nodiscard]] constexpr int
constexpr int
exponent() const noexcept;
constexpr Number
@@ -339,7 +339,7 @@ public:
}
/** Return the sign of the amount */
[[nodiscard]] constexpr int
constexpr int
signum() const noexcept
{
if (negative_)
@@ -347,7 +347,7 @@ public:
return (mantissa_ != 0u) ? 1 : 0;
}
[[nodiscard]] Number
Number
truncate() const noexcept;
friend constexpr bool
@@ -490,13 +490,13 @@ private:
MantissaRange::rep const& minMantissa,
MantissaRange::rep const& maxMantissa);
[[nodiscard]] bool
bool
isnormal() const noexcept;
// Copy the number, but modify the exponent by "exponentDelta". Because the
// mantissa doesn't change, the result will be "mostly" normalized, but the
// exponent could go out of range, so it will be checked.
[[nodiscard]] Number
Number
shiftExponent(int exponentDelta) const;
// Safely convert rep (int64) mantissa to internalrep (uint64). If the rep

View File

@@ -20,7 +20,7 @@ public:
{
}
[[nodiscard]] uint256 const&
uint256 const&
as_uint256() const
{
return hash_;
@@ -30,17 +30,17 @@ public:
{
return hash_;
}
[[nodiscard]] bool
bool
isZero() const
{
return hash_.isZero();
}
[[nodiscard]] bool
bool
isNonZero() const
{
return hash_.isNonZero();
}
[[nodiscard]] int
int
signum() const
{
return hash_.signum();

View File

@@ -49,7 +49,7 @@ public:
/** Return a strong pointer if this is already a strong pointer (i.e. don't
lock the weak pointer. Use the `lock` method if that's what's needed)
*/
[[nodiscard]] std::shared_ptr<T> const&
std::shared_ptr<T> const&
getStrong() const;
/** Return true if this is a strong pointer and the strong pointer is
@@ -67,30 +67,30 @@ public:
/** If this is a strong pointer, return the raw pointer. Otherwise return
null.
*/
[[nodiscard]] T*
T*
get() const;
/** If this is a strong pointer, return the strong count. Otherwise return 0
*/
[[nodiscard]] std::size_t
std::size_t
use_count() const;
/** Return true if there is a non-zero strong count. */
[[nodiscard]] bool
bool
expired() const;
/** If this is a strong pointer, return the strong pointer. Otherwise
attempt to lock the weak pointer.
*/
[[nodiscard]] std::shared_ptr<T>
std::shared_ptr<T>
lock() const;
/** Return true is this represents a strong pointer. */
[[nodiscard]] bool
bool
isStrong() const;
/** Return true is this represents a weak pointer. */
[[nodiscard]] bool
bool
isWeak() const;
/** If this is a weak pointer, attempt to convert it to a strong pointer.

View File

@@ -180,7 +180,7 @@ public:
~SlabAllocator() = default;
/** Returns the size of the memory block this allocator returns. */
[[nodiscard]] constexpr std::size_t
constexpr std::size_t
size() const noexcept
{
return itemSize_;
@@ -284,7 +284,7 @@ class SlabAllocatorSet
{
private:
// The list of allocators that belong to this set
boost::container::static_vector<SlabAllocator<Type>, 64> allocators_{};
boost::container::static_vector<SlabAllocator<Type>, 64> allocators_;
std::size_t maxSize_ = 0;

View File

@@ -74,7 +74,7 @@ public:
@note The return type is guaranteed to be a pointer
to a single byte, to facilitate pointer arithmetic.
*/
[[nodiscard]] std::uint8_t const*
std::uint8_t const*
data() const noexcept
{
return data_;
@@ -123,25 +123,25 @@ public:
size_ -= n;
}
[[nodiscard]] const_iterator
const_iterator
begin() const noexcept
{
return data_;
}
[[nodiscard]] const_iterator
const_iterator
cbegin() const noexcept
{
return data_;
}
[[nodiscard]] const_iterator
const_iterator
end() const noexcept
{
return data_ + size_;
}
[[nodiscard]] const_iterator
const_iterator
cend() const noexcept
{
return data_ + size_;
@@ -158,7 +158,7 @@ public:
@returns The requested subslice, if the request is valid.
@throws std::out_of_range if pos > size()
*/
[[nodiscard]] Slice
Slice
substr(std::size_t pos, std::size_t count = std::numeric_limits<std::size_t>::max()) const
{
if (pos > size())

View File

@@ -222,19 +222,19 @@ private:
{
}
[[nodiscard]] bool
bool
isWeak() const
{
if (!ptr)
return true;
return ptr.isWeak();
}
[[nodiscard]] bool
bool
isCached() const
{
return ptr && ptr.isStrong();
}
[[nodiscard]] bool
bool
isExpired() const
{
return ptr.expired();

View File

@@ -102,7 +102,7 @@ public:
{
return reinterpret_cast<pointer>(data_.data());
}
[[nodiscard]] const_pointer
const_pointer
data() const
{
return reinterpret_cast<const_pointer>(data_.data());
@@ -118,22 +118,22 @@ public:
{
return data() + bytes;
}
[[nodiscard]] const_iterator
const_iterator
begin() const
{
return data();
}
[[nodiscard]] const_iterator
const_iterator
end() const
{
return data() + bytes;
}
[[nodiscard]] const_iterator
const_iterator
cbegin() const
{
return data();
}
[[nodiscard]] const_iterator
const_iterator
cend() const
{
return data() + bytes;
@@ -310,7 +310,7 @@ public:
return fromVoid(from.data());
}
[[nodiscard]] constexpr int
constexpr int
signum() const
{
for (int i = 0; i < WIDTH; i++)
@@ -433,14 +433,14 @@ public:
return ret;
}
[[nodiscard]] base_uint
base_uint
next() const
{
auto ret = *this;
return ++ret;
}
[[nodiscard]] base_uint
base_uint
prev() const
{
auto ret = *this;
@@ -517,12 +517,12 @@ public:
}
// Deprecated.
[[nodiscard]] bool
bool
isZero() const
{
return *this == beast::zero;
}
[[nodiscard]] bool
bool
isNonZero() const
{
return *this != beast::zero;

View File

@@ -72,12 +72,14 @@ template <class HashAlgorithm = beast::xxhasher>
class hardened_hash
{
private:
detail::seed_pair m_seeds{detail::make_seed_pair<>()};
detail::seed_pair m_seeds;
public:
using result_type = typename HashAlgorithm::result_type;
hardened_hash() = default;
hardened_hash() : m_seeds(detail::make_seed_pair<>())
{
}
template <class T>
result_type

View File

@@ -57,7 +57,7 @@ public:
{
using iterator_category = std::forward_iterator_tag;
partition_map_type* map_{nullptr};
typename partition_map_type::iterator ait_{};
typename partition_map_type::iterator ait_;
typename map_type::iterator mit_;
iterator() = default;
@@ -126,7 +126,7 @@ public:
using iterator_category = std::forward_iterator_tag;
partition_map_type* map_{nullptr};
typename partition_map_type::iterator ait_{};
typename partition_map_type::iterator ait_;
typename map_type::iterator mit_;
const_iterator() = default;

View File

@@ -49,7 +49,7 @@ public:
return m_ios;
}
[[nodiscard]] boost::asio::io_context const&
boost::asio::io_context const&
get_io_context() const
{
return m_ios;

View File

@@ -63,7 +63,7 @@ struct abstract_clock_wrapper : public abstract_clock<Facade>
using typename abstract_clock<Facade>::duration;
using typename abstract_clock<Facade>::time_point;
[[nodiscard]] time_point
time_point
now() const override
{
return Clock::now();

View File

@@ -32,7 +32,7 @@ public:
{
}
[[nodiscard]] time_point
time_point
now() const override
{
return now_;

View File

@@ -115,7 +115,7 @@ public:
return &m_iter->value;
}
[[nodiscard]] time_point const&
time_point const&
when() const
{
return m_iter->when;
@@ -136,7 +136,7 @@ private:
{
}
[[nodiscard]] Iterator const&
Iterator const&
iterator() const
{
return m_iter;

View File

@@ -186,7 +186,7 @@ private:
return *this;
}
[[nodiscard]] Compare const&
Compare const&
compare() const
{
return *this;
@@ -295,7 +295,7 @@ private:
return KeyValueCompare::compare();
}
[[nodiscard]] Compare const&
Compare const&
compare() const
{
return KeyValueCompare::compare();
@@ -307,7 +307,7 @@ private:
return *this;
}
[[nodiscard]] KeyValueCompare const&
KeyValueCompare const&
key_compare() const
{
return *this;
@@ -319,7 +319,7 @@ private:
return beast::detail::empty_base_optimization<ElementAllocator>::member();
}
[[nodiscard]] ElementAllocator const&
ElementAllocator const&
alloc() const
{
return beast::detail::empty_base_optimization<ElementAllocator>::member();

View File

@@ -149,7 +149,7 @@ private:
return *this;
}
[[nodiscard]] Hash const&
Hash const&
hash_function() const
{
return *this;
@@ -195,7 +195,7 @@ private:
return *this;
}
[[nodiscard]] KeyEqual const&
KeyEqual const&
key_eq() const
{
return *this;
@@ -348,7 +348,7 @@ private:
return *this;
}
[[nodiscard]] ValueHash const&
ValueHash const&
value_hash() const
{
return *this;
@@ -360,7 +360,7 @@ private:
return ValueHash::hash_function();
}
[[nodiscard]] Hash const&
Hash const&
hash_function() const
{
return ValueHash::hash_function();
@@ -372,7 +372,7 @@ private:
return *this;
}
[[nodiscard]] KeyValueEqual const&
KeyValueEqual const&
key_value_equal() const
{
return *this;
@@ -384,7 +384,7 @@ private:
return key_value_equal().key_eq();
}
[[nodiscard]] KeyEqual const&
KeyEqual const&
key_eq() const
{
return key_value_equal().key_eq();
@@ -396,7 +396,7 @@ private:
return beast::detail::empty_base_optimization<ElementAllocator>::member();
}
[[nodiscard]] ElementAllocator const&
ElementAllocator const&
alloc() const
{
return beast::detail::empty_base_optimization<ElementAllocator>::member();
@@ -433,7 +433,7 @@ private:
m_vec.clear();
}
[[nodiscard]] size_type
size_type
max_bucket_count() const
{
return m_vec.max_size();
@@ -445,7 +445,7 @@ private:
return m_max_load_factor;
}
[[nodiscard]] float const&
float const&
max_load_factor() const
{
return m_max_load_factor;

View File

@@ -43,7 +43,7 @@ public:
return *this;
}
[[nodiscard]] T const&
T const&
member() const noexcept
{
return *this;

View File

@@ -128,7 +128,7 @@ public:
}
private:
[[nodiscard]] reference
reference
dereference() const noexcept
{
return static_cast<reference>(*m_node);
@@ -287,14 +287,14 @@ public:
/** Determine if the list is empty.
@return `true` if the list is empty.
*/
[[nodiscard]] bool
bool
empty() const noexcept
{
return size() == 0;
}
/** Returns the number of elements in the list. */
[[nodiscard]] size_type
size_type
size() const noexcept
{
return m_size;
@@ -314,7 +314,7 @@ public:
@invariant The list may not be empty.
@return A const reference to the first element.
*/
[[nodiscard]] const_reference
const_reference
front() const noexcept
{
return element_from(m_head.m_next);
@@ -334,7 +334,7 @@ public:
@invariant The list may not be empty.
@return A const reference to the last element.
*/
[[nodiscard]] const_reference
const_reference
back() const noexcept
{
return element_from(m_tail.m_prev);
@@ -352,7 +352,7 @@ public:
/** Obtain a const iterator to the beginning of the list.
@return A const iterator pointing to the beginning of the list.
*/
[[nodiscard]] const_iterator
const_iterator
begin() const noexcept
{
return const_iterator(m_head.m_next);
@@ -361,7 +361,7 @@ public:
/** Obtain a const iterator to the beginning of the list.
@return A const iterator pointing to the beginning of the list.
*/
[[nodiscard]] const_iterator
const_iterator
cbegin() const noexcept
{
return const_iterator(m_head.m_next);
@@ -379,7 +379,7 @@ public:
/** Obtain a const iterator to the end of the list.
@return A constiterator pointing to the end of the list.
*/
[[nodiscard]] const_iterator
const_iterator
end() const noexcept
{
return const_iterator(&m_tail);
@@ -388,7 +388,7 @@ public:
/** Obtain a const iterator to the end of the list
@return A constiterator pointing to the end of the list.
*/
[[nodiscard]] const_iterator
const_iterator
cend() const noexcept
{
return const_iterator(&m_tail);
@@ -549,7 +549,7 @@ public:
@param element The element to obtain an iterator for.
@return A const iterator to the element.
*/
[[nodiscard]] const_iterator
const_iterator
const_iterator_to(T const& element) const noexcept
{
return const_iterator(static_cast<Node const*>(&element));

View File

@@ -24,7 +24,9 @@ public:
using reference = std::
conditional_t<IsConst, typename Container::const_reference, typename Container::reference>;
LockFreeStackIterator() = default;
LockFreeStackIterator() : m_node()
{
}
LockFreeStackIterator(NodePtr node) : m_node(node)
{
@@ -77,7 +79,7 @@ public:
}
private:
NodePtr m_node{};
NodePtr m_node;
};
//------------------------------------------------------------------------------
@@ -162,7 +164,7 @@ public:
operator=(LockFreeStack const&) = delete;
/** Returns true if the stack is empty. */
[[nodiscard]] bool
bool
empty() const
{
return m_head.load() == &m_end;
@@ -237,25 +239,25 @@ public:
return iterator(&m_end);
}
[[nodiscard]] const_iterator
const_iterator
begin() const
{
return const_iterator(m_head.load());
}
[[nodiscard]] const_iterator
const_iterator
end() const
{
return const_iterator(&m_end);
}
[[nodiscard]] const_iterator
const_iterator
cbegin() const
{
return const_iterator(m_head.load());
}
[[nodiscard]] const_iterator
const_iterator
cend() const
{
return const_iterator(&m_end);

View File

@@ -37,15 +37,15 @@ public:
parse(std::string_view input);
/** Produce a string from semantic version components. */
[[nodiscard]] std::string
std::string
print() const;
[[nodiscard]] bool
bool
isRelease() const noexcept
{
return preReleaseIdentifiers.empty();
}
[[nodiscard]] bool
bool
isPreRelease() const noexcept
{
return !isRelease();

View File

@@ -45,7 +45,7 @@ public:
m_impl->notify(ceil<value_type>(value));
}
[[nodiscard]] std::shared_ptr<EventImpl> const&
std::shared_ptr<EventImpl> const&
impl() const
{
return m_impl;

View File

@@ -108,7 +108,7 @@ public:
}
/** @} */
[[nodiscard]] std::shared_ptr<GaugeImpl> const&
std::shared_ptr<GaugeImpl> const&
impl() const
{
return m_impl;

View File

@@ -14,7 +14,7 @@ public:
using ptr = std::shared_ptr<Group>;
/** Returns the name of this group, for diagnostics. */
[[nodiscard]] virtual std::string const&
virtual std::string const&
name() const = 0;
};

View File

@@ -24,7 +24,7 @@ public:
{
}
[[nodiscard]] std::shared_ptr<HookImpl> const&
std::shared_ptr<HookImpl> const&
impl() const
{
return m_impl;

View File

@@ -63,7 +63,7 @@ public:
}
/** @} */
[[nodiscard]] std::shared_ptr<MeterImpl> const&
std::shared_ptr<MeterImpl> const&
impl() const
{
return m_impl;

View File

@@ -32,25 +32,25 @@ public:
from_string(std::string const& s);
/** Returns a string representing the endpoint. */
[[nodiscard]] std::string
std::string
to_string() const;
/** Returns the port number on the endpoint. */
[[nodiscard]] Port
Port
port() const
{
return m_port;
}
/** Returns a new Endpoint with a different port. */
[[nodiscard]] Endpoint
Endpoint
at_port(Port port) const
{
return Endpoint(m_addr, port);
}
/** Returns the address portion of this endpoint. */
[[nodiscard]] Address const&
Address const&
address() const
{
return m_addr;
@@ -58,22 +58,22 @@ public:
/** Convenience accessors for the address part. */
/** @{ */
[[nodiscard]] bool
bool
is_v4() const
{
return m_addr.is_v4();
}
[[nodiscard]] bool
bool
is_v6() const
{
return m_addr.is_v6();
}
[[nodiscard]] AddressV4
AddressV4
to_v4() const
{
return m_addr.to_v4();
}
[[nodiscard]] AddressV6
AddressV6
to_v6() const
{
return m_addr.to_v6();

View File

@@ -25,7 +25,7 @@ protected:
return m_cont;
}
[[nodiscard]] cont_type const&
cont_type const&
cont() const
{
return m_cont;
@@ -39,14 +39,14 @@ public:
using const_iterator = typename cont_type::const_iterator;
/** Returns `true` if the container is empty. */
[[nodiscard]] bool
bool
empty() const
{
return m_cont.empty();
}
/** Returns the number of items in the container. */
[[nodiscard]] size_type
size_type
size() const
{
return m_cont.size();
@@ -54,25 +54,25 @@ public:
/** Returns forward iterators for traversal. */
/** @{ */
[[nodiscard]] const_iterator
const_iterator
begin() const
{
return m_cont.cbegin();
}
[[nodiscard]] const_iterator
const_iterator
cbegin() const
{
return m_cont.cbegin();
}
[[nodiscard]] const_iterator
const_iterator
end() const
{
return m_cont.cend();
}
[[nodiscard]] const_iterator
const_iterator
cend() const
{
return m_cont.cend();

View File

@@ -21,7 +21,7 @@ public:
recorder() = default;
/** Returns a report with the results of all completed suites. */
[[nodiscard]] results const&
results const&
report() const
{
return m_results;

View File

@@ -41,14 +41,14 @@ private:
tests_t() = default;
/** Returns the total number of test conditions. */
[[nodiscard]] std::size_t
std::size_t
total() const
{
return cont().size();
}
/** Returns the number of failed test conditions. */
[[nodiscard]] std::size_t
std::size_t
failed() const
{
return failed_;
@@ -89,7 +89,7 @@ public:
}
/** Returns the name of this testcase. */
[[nodiscard]] std::string const&
std::string const&
name() const
{
return name_;
@@ -118,21 +118,21 @@ public:
}
/** Returns the name of this suite. */
[[nodiscard]] std::string const&
std::string const&
name() const
{
return name_;
}
/** Returns the total number of test conditions. */
[[nodiscard]] std::size_t
std::size_t
total() const
{
return total_;
}
/** Returns the number of failures. */
[[nodiscard]] std::size_t
std::size_t
failed() const
{
return failed_;
@@ -173,21 +173,21 @@ public:
results() = default;
/** Returns the total number of test cases. */
[[nodiscard]] std::size_t
std::size_t
cases() const
{
return m_cases;
}
/** Returns the total number of test conditions. */
[[nodiscard]] std::size_t
std::size_t
total() const
{
return total_;
}
/** Returns the number of failures. */
[[nodiscard]] std::size_t
std::size_t
failed() const
{
return failed_;

View File

@@ -47,7 +47,7 @@ public:
}
/** Returns the argument string. */
[[nodiscard]] std::string const&
std::string const&
arg() const
{
return arg_;

View File

@@ -6,10 +6,10 @@
#include <xrpl/beast/unit_test/runner.h>
#include <boost/filesystem.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/throw_exception.hpp>
#include <filesystem>
#include <ostream>
#include <sstream>
#include <string>
@@ -25,7 +25,7 @@ make_reason(String const& reason, char const* file, int line)
std::string s(reason);
if (!s.empty())
s.append(": ");
namespace fs = std::filesystem;
namespace fs = boost::filesystem;
s.append(fs::path{file}.filename().string());
s.append("(");
s.append(boost::lexical_cast<std::string>(line));
@@ -57,7 +57,7 @@ private:
// in the event of a failure, if the option to stop is set.
struct abort_exception : public std::exception
{
[[nodiscard]] char const*
char const*
what() const noexcept override
{
return "test suite aborted";

View File

@@ -42,33 +42,33 @@ public:
{
}
[[nodiscard]] std::string const&
std::string const&
name() const
{
return name_;
}
[[nodiscard]] std::string const&
std::string const&
module() const
{
return module_;
}
[[nodiscard]] std::string const&
std::string const&
library() const
{
return library_;
}
/// Returns `true` if this suite only runs manually.
[[nodiscard]] bool
bool
manual() const
{
return manual_;
}
/// Return the canonical suite name as a string.
[[nodiscard]] std::string
std::string
full_name() const
{
return library_ + "." + module_ + "." + name_;

View File

@@ -47,13 +47,13 @@ public:
t_ = std::thread(&Thread::run, this, std::move(b));
}
[[nodiscard]] bool
bool
joinable() const
{
return t_.joinable();
}
[[nodiscard]] std::thread::id
std::thread::id
get_id() const
{
return t_.get_id();

View File

@@ -66,12 +66,12 @@ public:
operator=(Sink const& lhs) = delete;
/** Returns `true` if text at the passed severity produces output. */
[[nodiscard]] virtual bool
virtual bool
active(Severity level) const;
/** Returns `true` if a message is also written to the Output Window
* (MSVC). */
[[nodiscard]] virtual bool
virtual bool
console() const;
/** Set whether messages are also written to the Output Window (MSVC).
@@ -80,7 +80,7 @@ public:
console(bool output);
/** Returns the minimum severity level this sink will report. */
[[nodiscard]] virtual Severity
virtual Severity
threshold() const;
/** Set the minimum severity this sink will report. */
@@ -204,14 +204,14 @@ public:
operator=(Stream const& other) = delete;
/** Returns the Sink that this Stream writes to. */
[[nodiscard]] Sink&
Sink&
sink() const
{
return m_sink;
}
/** Returns the Severity level of messages this Stream reports. */
[[nodiscard]] Severity
Severity
level() const
{
return m_level;
@@ -219,7 +219,7 @@ public:
/** Returns `true` if sink logs anything at this stream's level. */
/** @{ */
[[nodiscard]] bool
bool
active() const
{
return m_sink.active(m_level);
@@ -267,14 +267,14 @@ public:
}
/** Returns the Sink associated with this Journal. */
[[nodiscard]] Sink&
Sink&
sink() const
{
return *m_sink;
}
/** Returns a stream for this sink, with the specified severity level. */
[[nodiscard]] Stream
Stream
stream(Severity level) const
{
return Stream(*m_sink, level);
@@ -284,7 +284,7 @@ public:
For a message to be logged, the severity must be at or above the
sink's severity threshold.
*/
[[nodiscard]] bool
bool
active(Severity level) const
{
return m_sink->active(level);
@@ -292,37 +292,37 @@ public:
/** Severity stream access functions. */
/** @{ */
[[nodiscard]] Stream
Stream
trace() const
{
return {*m_sink, severities::kTrace};
}
[[nodiscard]] Stream
Stream
debug() const
{
return {*m_sink, severities::kDebug};
}
[[nodiscard]] Stream
Stream
info() const
{
return {*m_sink, severities::kInfo};
}
[[nodiscard]] Stream
Stream
warn() const
{
return {*m_sink, severities::kWarning};
}
[[nodiscard]] Stream
Stream
error() const
{
return {*m_sink, severities::kError};
}
[[nodiscard]] Stream
Stream
fatal() const
{
return {*m_sink, severities::kFatal};

View File

@@ -149,7 +149,7 @@ class PropertyStream::Item : public List<Item>::Node
{
public:
explicit Item(Source* source);
[[nodiscard]] Source&
Source&
source() const;
Source*
operator->() const;
@@ -217,7 +217,7 @@ public:
PropertyStream&
stream();
[[nodiscard]] PropertyStream const&
PropertyStream const&
stream() const;
template <typename Value>
@@ -287,7 +287,7 @@ public:
PropertyStream&
stream();
[[nodiscard]] PropertyStream const&
PropertyStream const&
stream() const;
template <typename Value>
@@ -323,7 +323,7 @@ public:
operator=(Source const&) = delete;
/** Returns the name of this source. */
[[nodiscard]] std::string const&
std::string const&
name() const;
/** Add a child source. */

View File

@@ -35,13 +35,13 @@ public:
prefix_ = s;
}
[[nodiscard]] bool
bool
active(beast::severities::Severity level) const override
{
return sink_.active(level);
}
[[nodiscard]] bool
bool
console() const override
{
return sink_.console();
@@ -53,7 +53,7 @@ public:
sink_.console(output);
}
[[nodiscard]] beast::severities::Severity
beast::severities::Severity
threshold() const override
{
return sink_.threshold();

View File

@@ -1,11 +1,8 @@
#pragma once
#include <filesystem>
#include <iomanip>
#include <random>
#include <sstream>
#include <boost/filesystem.hpp>
#include <string>
#include <system_error>
namespace beast {
@@ -16,7 +13,7 @@ namespace beast {
*/
class temp_dir
{
std::filesystem::path path_;
boost::filesystem::path path_;
public:
#if !GENERATING_DOCS
@@ -28,35 +25,25 @@ public:
/// Construct a temporary directory.
temp_dir()
{
auto const dir = std::filesystem::temp_directory_path();
std::random_device rd;
constexpr std::size_t maxAttempts = 100;
for (std::size_t attempt = 0; attempt < maxAttempts; ++attempt)
auto const dir = boost::filesystem::temp_directory_path();
do
{
std::error_code ec;
std::ostringstream oss;
oss << std::hex << std::setfill('0') << std::setw(8) << rd() << std::setw(8) << rd();
path_ = dir / oss.str();
if (!std::filesystem::exists(path_, ec) && !ec)
break;
path_.clear();
}
if (path_.empty())
throw std::runtime_error("Unable to generate a unique temporary directory path");
std::filesystem::create_directory(path_);
path_ = dir / boost::filesystem::unique_path();
} while (boost::filesystem::exists(path_));
boost::filesystem::create_directory(path_);
}
/// Destroy a temporary directory.
~temp_dir()
{
// use non-throwing calls in the destructor
std::error_code ec;
std::filesystem::remove_all(path_, ec);
boost::system::error_code ec;
boost::filesystem::remove_all(path_, ec);
// TODO: warn/notify if ec set ?
}
/// Get the native path for the temporary directory
[[nodiscard]] std::string
std::string
path() const
{
return path_.string();
@@ -66,7 +53,7 @@ public:
The file does not need to exist.
*/
[[nodiscard]] std::string
std::string
file(std::string const& name) const
{
return (path_ / name).string();

View File

@@ -41,15 +41,15 @@ public:
with respect to other conditions of the
same type.
*/
[[nodiscard]] virtual Buffer
virtual Buffer
fingerprint() const = 0;
/** Returns the type of this condition. */
[[nodiscard]] virtual Type
virtual Type
type() const = 0;
/** Validates a fulfillment. */
[[nodiscard]] virtual bool
virtual bool
validate(Slice data) const = 0;
/** Calculates the cost associated with this fulfillment. *
@@ -58,7 +58,7 @@ public:
type and properties of the condition and the fulfillment
that the condition is generated from.
*/
[[nodiscard]] virtual std::uint32_t
virtual std::uint32_t
cost() const = 0;
/** Returns the condition associated with the given fulfillment.
@@ -67,7 +67,7 @@ public:
will, if compliant, produce the identical condition for the
same fulfillment.
*/
[[nodiscard]] virtual Condition
virtual Condition
condition() const = 0;
};

View File

@@ -90,13 +90,13 @@ public:
{
}
[[nodiscard]] Type
Type
type() const override
{
return Type::preimageSha256;
}
[[nodiscard]] Buffer
Buffer
fingerprint() const override
{
sha256_hasher h;
@@ -105,19 +105,19 @@ public:
return {d.data(), d.size()};
}
[[nodiscard]] std::uint32_t
std::uint32_t
cost() const override
{
return static_cast<std::uint32_t>(payload_.size());
}
[[nodiscard]] Condition
Condition
condition() const override
{
return {type(), cost(), fingerprint()};
}
[[nodiscard]] bool
bool
validate(Slice) const override
{
// Perhaps counterintuitively, the message isn't

View File

@@ -72,7 +72,7 @@ private:
{
private:
ClosureCounter& counter_;
std::remove_reference_t<Closure> closure_{};
std::remove_reference_t<Closure> closure_;
static_assert(
std::is_same_v<decltype(closure_(std::declval<Args_t>()...)), Ret_t>,

View File

@@ -118,7 +118,7 @@ private:
peers_.insert(peer);
}
[[nodiscard]] HashRouterFlags
HashRouterFlags
getFlags(void) const
{
return flags_;
@@ -138,7 +138,7 @@ private:
}
/** Return seated relay time point if the message has been relayed */
[[nodiscard]] std::optional<Stopwatch::time_point>
std::optional<Stopwatch::time_point>
relayed() const
{
return relayed_;

View File

@@ -98,11 +98,11 @@ public:
LoadMonitor& lm,
std::function<void()> const& job);
[[nodiscard]] JobType
JobType
getType() const;
/** Returns the time when the job was queued. */
[[nodiscard]] clock_type::time_point const&
clock_type::time_point const&
queue_time() const;
void

View File

@@ -7,13 +7,8 @@
#include <xrpl/core/detail/Workers.h>
#include <xrpl/json/json_value.h>
// Include only the specific Boost.Coroutine2 headers actually used here.
// Avoid `boost/coroutine2/all.hpp` because it transitively pulls in
// `boost/context/pooled_fixedsize_stack.hpp`, whose `.malloc()` / `.free()`
// member calls on `boost::pool` collide with MSVC's `_CRTDBG_MAP_ALLOC` macros
// in Debug builds (see cmake/XrplCompiler.cmake).
#include <boost/context/protected_fixedsize_stack.hpp>
#include <boost/coroutine2/coroutine.hpp>
#include <boost/coroutine2/all.hpp>
#include <set>

View File

@@ -54,13 +54,13 @@ public:
JobTypeData&
operator=(JobTypeData const& other) = delete;
[[nodiscard]] std::string
std::string
name() const
{
return info.name();
}
[[nodiscard]] JobType
JobType
type() const
{
return info.type();

View File

@@ -40,37 +40,37 @@ public:
{
}
[[nodiscard]] JobType
JobType
type() const
{
return m_type;
}
[[nodiscard]] std::string const&
std::string const&
name() const
{
return m_name;
}
[[nodiscard]] int
int
limit() const
{
return m_limit;
}
[[nodiscard]] bool
bool
special() const
{
return m_limit == 0;
}
[[nodiscard]] std::chrono::milliseconds
std::chrono::milliseconds
getAverageLatency() const
{
return m_avgLatency;
}
[[nodiscard]] std::chrono::milliseconds
std::chrono::milliseconds
getPeakLatency() const
{
return m_peakLatency;

View File

@@ -33,7 +33,8 @@ private:
std::chrono::milliseconds avgLatency,
std::chrono::milliseconds peakLatency) {
XRPL_ASSERT(
!m_map.contains(jt), "xrpl::JobTypes::JobTypes::add : unique job type input");
m_map.find(jt) == m_map.end(),
"xrpl::JobTypes::JobTypes::add : unique job type input");
[[maybe_unused]] auto const inserted =
m_map
@@ -113,7 +114,7 @@ public:
return instance().get(jt).name();
}
[[nodiscard]] JobTypeInfo const&
JobTypeInfo const&
get(JobType jt) const
{
Map::const_iterator const iter(m_map.find(jt));
@@ -125,37 +126,37 @@ public:
return m_unknown;
}
[[nodiscard]] JobTypeInfo const&
JobTypeInfo const&
getInvalid() const
{
return m_unknown;
}
[[nodiscard]] Map::size_type
Map::size_type
size() const
{
return m_map.size();
}
[[nodiscard]] const_iterator
const_iterator
begin() const
{
return m_map.cbegin();
}
[[nodiscard]] const_iterator
const_iterator
cbegin() const
{
return m_map.cbegin();
}
[[nodiscard]] const_iterator
const_iterator
end() const
{
return m_map.cend();
}
[[nodiscard]] const_iterator
const_iterator
cend() const
{
return m_map.cend();

View File

@@ -21,15 +21,15 @@ public:
~LoadEvent();
[[nodiscard]] std::string const&
std::string const&
name() const;
// The time spent waiting.
[[nodiscard]] std::chrono::steady_clock::duration
std::chrono::steady_clock::duration
waitTime() const;
// The time spent running.
[[nodiscard]] std::chrono::steady_clock::duration
std::chrono::steady_clock::duration
runTime() const;
void

View File

@@ -26,7 +26,7 @@ public:
*
* @return The network ID this server is configured for
*/
[[nodiscard]] virtual std::uint32_t
virtual std::uint32_t
getNetworkID() const noexcept = 0;
};

View File

@@ -22,7 +22,7 @@ public:
PublicKey nodeId;
std::string description = {}; // NOLINT(readability-redundant-member-init)
[[nodiscard]] auto
auto
toJson() const -> Json::Value;
template <typename Hasher>

View File

@@ -4,9 +4,10 @@
#include <xrpl/core/JobTypes.h>
#include <xrpl/json/json_value.h>
#include <boost/filesystem.hpp>
#include <chrono>
#include <cstdint>
#include <filesystem>
#include <functional>
#include <memory>
#include <string>
@@ -42,7 +43,7 @@ public:
*/
struct Setup
{
std::filesystem::path perfLog;
boost::filesystem::path perfLog;
// log_interval is in milliseconds to support faster testing.
milliseconds logInterval{seconds(1)};
};
@@ -120,7 +121,7 @@ public:
*
* @return Counters Json object
*/
[[nodiscard]] virtual Json::Value
virtual Json::Value
countersJson() const = 0;
/**
@@ -128,7 +129,7 @@ public:
*
* @return Current executing jobs and RPC calls and durations
*/
[[nodiscard]] virtual Json::Value
virtual Json::Value
currentJson() const = 0;
/**
@@ -147,7 +148,7 @@ public:
};
PerfLog::Setup
setup_PerfLog(Section const& section, std::filesystem::path const& configDir);
setup_PerfLog(Section const& section, boost::filesystem::path const& configDir);
std::unique_ptr<PerfLog>
make_PerfLog(

View File

@@ -192,7 +192,7 @@ public:
virtual OpenLedger&
getOpenLedger() = 0;
[[nodiscard]] virtual OpenLedger const&
virtual OpenLedger const&
getOpenLedger() const = 0;
// Transaction and operation services
@@ -219,7 +219,7 @@ public:
getPerfLog() = 0;
// Configuration and state
[[nodiscard]] virtual bool
virtual bool
isStopping() const = 0;
virtual beast::Journal
@@ -231,7 +231,7 @@ public:
virtual Logs&
getLogs() = 0;
[[nodiscard]] virtual std::optional<uint256> const&
virtual std::optional<uint256> const&
getTrapTxID() const = 0;
/** Retrieve the "wallet database" */

View File

@@ -106,7 +106,7 @@ public:
@note This function is not thread-safe.
*/
[[nodiscard]] int
int
getNumberOfThreads() const noexcept;
/** Set the desired number of threads.
@@ -141,7 +141,7 @@ public:
While this function is thread-safe, the value may not stay
accurate for very long. It's mainly for diagnostic purposes.
*/
[[nodiscard]] int
int
numberOfCurrentlyRunningTasks() const noexcept;
//--------------------------------------------------------------------------

View File

@@ -14,7 +14,7 @@ public:
public:
JsonPropertyStream();
[[nodiscard]] Json::Value const&
Json::Value const&
top() const;
protected:

View File

@@ -64,7 +64,7 @@ public:
* their location in the parsed document. An empty string is returned if no
* error occurred during parsing.
*/
[[nodiscard]] std::string
std::string
getFormattedErrorMessages() const;
static constexpr unsigned nest_limit{25};

View File

@@ -53,7 +53,7 @@ public:
return str_;
}
[[nodiscard]] constexpr char const*
constexpr char const*
c_str() const
{
return str_;
@@ -158,11 +158,11 @@ private:
operator<(CZString const& other) const;
bool
operator==(CZString const& other) const;
[[nodiscard]] int
int
index() const;
[[nodiscard]] char const*
char const*
c_str() const;
[[nodiscard]] bool
bool
isStaticString() const;
private:
@@ -223,60 +223,60 @@ public:
void
swap(Value& other) noexcept;
[[nodiscard]] ValueType
ValueType
type() const;
[[nodiscard]] char const*
char const*
asCString() const;
/** Returns the unquoted string value. */
[[nodiscard]] std::string
std::string
asString() const;
[[nodiscard]] Int
Int
asInt() const;
[[nodiscard]] UInt
UInt
asUInt() const;
[[nodiscard]] double
double
asDouble() const;
[[nodiscard]] bool
bool
asBool() const;
/** Correct absolute value from int or unsigned int */
[[nodiscard]] UInt
UInt
asAbsUInt() const;
// TODO: What is the "empty()" method this docstring mentions?
/** isNull() tests to see if this field is null. Don't use this method to
test for emptiness: use empty(). */
[[nodiscard]] bool
bool
isNull() const;
[[nodiscard]] bool
bool
isBool() const;
[[nodiscard]] bool
bool
isInt() const;
[[nodiscard]] bool
bool
isUInt() const;
[[nodiscard]] bool
bool
isIntegral() const;
[[nodiscard]] bool
bool
isDouble() const;
[[nodiscard]] bool
bool
isNumeric() const;
[[nodiscard]] bool
bool
isString() const;
[[nodiscard]] bool
bool
isArray() const;
[[nodiscard]] bool
bool
isArrayOrNull() const;
[[nodiscard]] bool
bool
isObject() const;
[[nodiscard]] bool
bool
isObjectOrNull() const;
[[nodiscard]] bool
bool
isConvertibleTo(ValueType other) const;
/// Number of values in array or object
[[nodiscard]] UInt
UInt
size() const;
/** Returns false if this is an empty array, empty object, empty string,
@@ -304,10 +304,10 @@ public:
operator[](UInt index) const;
/// If the array contains at least index+1 elements, returns the element
/// value, otherwise returns defaultValue.
[[nodiscard]] Value
Value
get(UInt index, Value const& defaultValue) const;
/// Return true if index < size().
[[nodiscard]] bool
bool
isValidIndex(UInt index) const;
/// \brief Append value to array at the end.
///
@@ -355,7 +355,7 @@ public:
Value
get(char const* key, Value const& defaultValue) const;
/// Return the member named key if it exist, defaultValue otherwise.
[[nodiscard]] Value
Value
get(std::string const& key, Value const& defaultValue) const;
/// \brief Remove and return the named member.
@@ -374,10 +374,10 @@ public:
bool
isMember(char const* key) const;
/// Return true if the object has a member named key.
[[nodiscard]] bool
bool
isMember(std::string const& key) const;
/// Return true if the object has a member named key.
[[nodiscard]] bool
bool
isMember(StaticString const& key) const;
/// \brief Return a list of the member names.
@@ -385,15 +385,15 @@ public:
/// If null, return an empty list.
/// \pre type() is objectValue or nullValue
/// \post if type() was nullValue, it remains nullValue
[[nodiscard]] Members
Members
getMemberNames() const;
[[nodiscard]] std::string
std::string
toStyledString() const;
[[nodiscard]] const_iterator
const_iterator
begin() const;
[[nodiscard]] const_iterator
const_iterator
end() const;
iterator
@@ -513,20 +513,20 @@ public:
/// Return either the index or the member name of the referenced value as a
/// Value.
[[nodiscard]] Value
Value
key() const;
/// Return the index of the referenced Value. -1 if it is not an arrayValue.
[[nodiscard]] UInt
UInt
index() const;
/// Return the member name of the referenced Value. "" if it is not an
/// objectValue.
[[nodiscard]] char const*
char const*
memberName() const;
protected:
[[nodiscard]] Value&
Value&
deref() const;
void
@@ -535,10 +535,10 @@ protected:
void
decrement();
[[nodiscard]] difference_type
difference_type
computeDistance(SelfType const& other) const;
[[nodiscard]] bool
bool
isEqual(SelfType const& other) const;
void

View File

@@ -30,47 +30,47 @@ public:
std::shared_ptr<STTx const> const&,
std::shared_ptr<STObject const> const&);
[[nodiscard]] std::shared_ptr<STTx const> const&
std::shared_ptr<STTx const> const&
getTxn() const
{
return mTxn;
}
[[nodiscard]] TxMeta const&
TxMeta const&
getMeta() const
{
return mMeta;
}
[[nodiscard]] boost::container::flat_set<AccountID> const&
boost::container::flat_set<AccountID> const&
getAffected() const
{
return mAffected;
}
[[nodiscard]] TxID
TxID
getTransactionID() const
{
return mTxn->getTransactionID();
}
[[nodiscard]] TxType
TxType
getTxnType() const
{
return mTxn->getTxnType();
}
[[nodiscard]] TER
TER
getResult() const
{
return mMeta.getResultTER();
}
[[nodiscard]] std::uint32_t
std::uint32_t
getTxnSeq() const
{
return mMeta.getIndex();
}
[[nodiscard]] std::string
std::string
getEscMeta() const;
[[nodiscard]] Json::Value const&
Json::Value const&
getJson() const
{
return mJson;

View File

@@ -36,7 +36,7 @@ public:
virtual ~AmendmentTable() = default;
[[nodiscard]] virtual uint256
virtual uint256
find(std::string const& name) const = 0;
virtual bool
@@ -47,9 +47,9 @@ public:
virtual bool
enable(uint256 const& amendment) = 0;
[[nodiscard]] virtual bool
virtual bool
isEnabled(uint256 const& amendment) const = 0;
[[nodiscard]] virtual bool
virtual bool
isSupported(uint256 const& amendment) const = 0;
/**
@@ -58,17 +58,17 @@ public:
*
* @return true if an unsupported feature is enabled on the network
*/
[[nodiscard]] virtual bool
virtual bool
hasUnsupportedEnabled() const = 0;
[[nodiscard]] virtual std::optional<NetClock::time_point>
virtual std::optional<NetClock::time_point>
firstUnsupportedExpected() const = 0;
[[nodiscard]] virtual Json::Value
virtual Json::Value
getJson(bool isAdmin) const = 0;
/** Returns a Json::objectValue. */
[[nodiscard]] virtual Json::Value
virtual Json::Value
getJson(uint256 const& amendment, bool isAdmin) const = 0;
/** Called when a new fully-validated ledger is accepted. */
@@ -87,7 +87,7 @@ public:
/** Called to determine whether the amendment logic needs to process
a new validated ledger. (If it could have changed things.)
*/
[[nodiscard]] virtual bool
virtual bool
needValidatedLedger(LedgerIndex seq) const = 0;
virtual void
@@ -112,14 +112,14 @@ public:
// Called by the consensus code when we need to
// add feature entries to a validation
[[nodiscard]] virtual std::vector<uint256>
virtual std::vector<uint256>
doValidation(std::set<uint256> const& enabled) const = 0;
// The set of amendments to enable in the genesis ledger
// This will return all known, non-vetoed amendments.
// If we ever have two amendments that should not both be
// enabled at the same time, we should ensure one is vetoed.
[[nodiscard]] virtual std::vector<uint256>
virtual std::vector<uint256>
getDesired() const = 0;
// The function below adapts the API callers expect to the

View File

@@ -134,7 +134,7 @@ public:
while transactions applied to the consensus
ledger produce hard failures (and claim a fee).
*/
[[nodiscard]] virtual ApplyFlags
virtual ApplyFlags
flags() const = 0;
/** Prepare to modify the SLE associated with key.

View File

@@ -22,10 +22,10 @@ public:
BookDirs(ReadView const&, Book const&);
[[nodiscard]] const_iterator
const_iterator
begin() const;
[[nodiscard]] const_iterator
const_iterator
end() const;
};

View File

@@ -59,13 +59,13 @@ private:
return !(lhs == rhs);
}
[[nodiscard]] uint256 const&
uint256 const&
getAccount() const
{
return account_;
}
[[nodiscard]] uint256 const&
uint256 const&
getTXID() const
{
return txId_;
@@ -118,30 +118,30 @@ public:
return map_.erase(it);
}
[[nodiscard]] const_iterator
const_iterator
begin() const
{
return map_.begin();
}
[[nodiscard]] const_iterator
const_iterator
end() const
{
return map_.end();
}
[[nodiscard]] size_t
size_t
size() const
{
return map_.size();
}
[[nodiscard]] bool
bool
empty() const
{
return map_.empty();
}
[[nodiscard]] uint256 const&
uint256 const&
key() const
{
return salt_;

View File

@@ -31,10 +31,10 @@ public:
Dir(ReadView const&, Keylet const&);
[[nodiscard]] const_iterator
const_iterator
begin() const;
[[nodiscard]] const_iterator
const_iterator
end() const;
};

View File

@@ -21,8 +21,9 @@ private:
struct ValueIOU
{
explicit ValueIOU() = default;
STAmount lowAcctDebits;
STAmount highAcctDebits;
STAmount lowAcctCredits;
STAmount highAcctCredits;
STAmount lowAcctOrigBalance;
};
@@ -74,10 +75,10 @@ public:
// Get the adjustments for the balance between main and other.
// Returns the debits, credits and the original balance
[[nodiscard]] std::optional<AdjustmentIOU>
std::optional<AdjustmentIOU>
adjustmentsIOU(AccountID const& main, AccountID const& other, Currency const& currency) const;
[[nodiscard]] std::optional<AdjustmentMPT>
std::optional<AdjustmentMPT>
adjustmentsMPT(MPTID const& mptID) const;
void
@@ -104,7 +105,7 @@ public:
// Get the adjusted owner count. Since DeferredCredits is meant to be used
// in payments, and payments only decrease owner counts, return the max
// remembered owner count.
[[nodiscard]] std::optional<std::uint32_t>
std::optional<std::uint32_t>
ownerCount(AccountID const& id) const;
void
@@ -179,15 +180,15 @@ public:
}
/** @} */
[[nodiscard]] STAmount
STAmount
balanceHookIOU(AccountID const& account, AccountID const& issuer, STAmount const& amount)
const override;
[[nodiscard]] STAmount
STAmount
balanceHookMPT(AccountID const& account, MPTIssue const& issue, std::int64_t amount)
const override;
[[nodiscard]] STAmount
STAmount
balanceHookSelfIssueMPT(MPTIssue const& issue, std::int64_t amount) const override;
void
@@ -212,7 +213,7 @@ public:
void
adjustOwnerCountHook(AccountID const& account, std::uint32_t cur, std::uint32_t next) override;
[[nodiscard]] std::uint32_t
std::uint32_t
ownerCountHook(AccountID const& account, std::uint32_t count) const override;
/** Apply changes to base view.
@@ -229,7 +230,14 @@ public:
apply(PaymentSandbox& to);
/** @} */
[[nodiscard]] XRPAmount
// Return a map of balance changes on trust lines. The low account is the
// first account in the key. If the two accounts are equal, the map contains
// the total changes in currency regardless of issuer. This is useful to get
// the total change in XRP balances.
std::map<std::tuple<AccountID, AccountID, Currency>, STAmount>
balanceChanges(ReadView const& view) const;
XRPAmount
xrpDestroyed() const;
private:

View File

@@ -39,22 +39,22 @@ public:
struct sles_type : detail::ReadViewFwdRange<std::shared_ptr<SLE const>>
{
explicit sles_type(ReadView const& view);
[[nodiscard]] iterator
iterator
begin() const;
[[nodiscard]] iterator
iterator
end() const;
[[nodiscard]] iterator
iterator
upper_bound(key_type const& key) const;
};
struct txs_type : detail::ReadViewFwdRange<tx_type>
{
explicit txs_type(ReadView const& view);
[[nodiscard]] bool
bool
empty() const;
[[nodiscard]] iterator
iterator
begin() const;
[[nodiscard]] iterator
iterator
end() const;
};
@@ -78,33 +78,33 @@ public:
}
/** Returns information about the ledger. */
[[nodiscard]] virtual LedgerHeader const&
virtual LedgerHeader const&
header() const = 0;
/** Returns true if this reflects an open ledger. */
[[nodiscard]] virtual bool
virtual bool
open() const = 0;
/** Returns the close time of the previous ledger. */
[[nodiscard]] NetClock::time_point
NetClock::time_point
parentCloseTime() const
{
return header().parentCloseTime;
}
/** Returns the sequence number of the base ledger. */
[[nodiscard]] LedgerIndex
LedgerIndex
seq() const
{
return header().seq;
}
/** Returns the fees for the base ledger. */
[[nodiscard]] virtual Fees const&
virtual Fees const&
fees() const = 0;
/** Returns the tx processing rules. */
[[nodiscard]] virtual Rules const&
virtual Rules const&
rules() const = 0;
/** Determine if a state item exists.
@@ -114,7 +114,7 @@ public:
@return `true` if a SLE is associated with the
specified key.
*/
[[nodiscard]] virtual bool
virtual bool
exists(Keylet const& k) const = 0;
/** Return the key of the next state item.
@@ -127,7 +127,7 @@ public:
the key returned would be outside the open
interval (key, last).
*/
[[nodiscard]] virtual std::optional<key_type>
virtual std::optional<key_type>
succ(key_type const& key, std::optional<key_type> const& last = std::nullopt) const = 0;
/** Return the state item associated with a key.
@@ -143,7 +143,7 @@ public:
@return `nullptr` if the key is not present or
if the type does not match.
*/
[[nodiscard]] virtual std::shared_ptr<SLE const>
virtual std::shared_ptr<SLE const>
read(Keylet const& k) const = 0;
// Accounts in a payment are not allowed to use assets acquired during that
@@ -151,7 +151,7 @@ public:
// changes that accounts make during a payment. `balanceHookIOU` adjusts
// balances so newly acquired assets are not counted toward the balance.
// This is required to support PaymentSandbox.
[[nodiscard]] virtual STAmount
virtual STAmount
balanceHookIOU(AccountID const& account, AccountID const& issuer, STAmount const& amount) const
{
XRPL_ASSERT(amount.holds<Issue>(), "balanceHookIOU: amount is for Issue");
@@ -161,7 +161,7 @@ public:
// balanceHookMPT adjusts balances so newly acquired assets are not counted
// toward the balance.
[[nodiscard]] virtual STAmount
virtual STAmount
balanceHookMPT(AccountID const& account, MPTIssue const& issue, std::int64_t amount) const
{
return STAmount{issue, amount};
@@ -171,7 +171,7 @@ public:
// funds available to issue, which are originally available funds less
// already self sold MPT amounts (MPT sell offer). This hook is used
// by issuerFundsToSelfIssue() function.
[[nodiscard]] virtual STAmount
virtual STAmount
balanceHookSelfIssueMPT(MPTIssue const& issue, std::int64_t amount) const
{
return STAmount{issue, amount};
@@ -182,30 +182,30 @@ public:
// changes that accounts make during a payment. `ownerCountHook` adjusts the
// ownerCount so it returns the max value of the ownerCount so far.
// This is required to support PaymentSandbox.
[[nodiscard]] virtual std::uint32_t
virtual std::uint32_t
ownerCountHook(AccountID const& account, std::uint32_t count) const
{
return count;
}
// used by the implementation
[[nodiscard]] virtual std::unique_ptr<sles_type::iter_base>
virtual std::unique_ptr<sles_type::iter_base>
slesBegin() const = 0;
// used by the implementation
[[nodiscard]] virtual std::unique_ptr<sles_type::iter_base>
virtual std::unique_ptr<sles_type::iter_base>
slesEnd() const = 0;
// used by the implementation
[[nodiscard]] virtual std::unique_ptr<sles_type::iter_base>
virtual std::unique_ptr<sles_type::iter_base>
slesUpperBound(key_type const& key) const = 0;
// used by the implementation
[[nodiscard]] virtual std::unique_ptr<txs_type::iter_base>
virtual std::unique_ptr<txs_type::iter_base>
txsBegin() const = 0;
// used by the implementation
[[nodiscard]] virtual std::unique_ptr<txs_type::iter_base>
virtual std::unique_ptr<txs_type::iter_base>
txsEnd() const = 0;
/** Returns `true` if a tx exists in the tx map.
@@ -213,7 +213,7 @@ public:
A tx exists in the map if it is part of the
base ledger, or if it is a newly inserted tx.
*/
[[nodiscard]] virtual bool
virtual bool
txExists(key_type const& key) const = 0;
/** Read a transaction from the tx map.
@@ -224,7 +224,7 @@ public:
@return A pair of nullptr if the
key is not found in the tx map.
*/
[[nodiscard]] virtual tx_type
virtual tx_type
txRead(key_type const& key) const = 0;
//
@@ -257,7 +257,7 @@ public:
@return std::nullopt if the item does not exist.
*/
[[nodiscard]] virtual std::optional<digest_type>
virtual std::optional<digest_type>
digest(key_type const& key) const = 0;
};

View File

@@ -54,19 +54,19 @@ public:
bool isDryRun,
beast::Journal j);
[[nodiscard]] bool
bool
exists(ReadView const& base, Keylet const& k) const;
[[nodiscard]] std::optional<key_type>
std::optional<key_type>
succ(ReadView const& base, key_type const& key, std::optional<key_type> const& last) const;
[[nodiscard]] std::shared_ptr<SLE const>
std::shared_ptr<SLE const>
read(ReadView const& base, Keylet const& k) const;
std::shared_ptr<SLE>
peek(ReadView const& base, Keylet const& k);
[[nodiscard]] std::size_t
std::size_t
size() const;
void
@@ -97,7 +97,7 @@ public:
destroyXRP(XRPAmount const& fee);
// For debugging
[[nodiscard]] XRPAmount const&
XRPAmount const&
dropsDestroyed() const
{
return dropsDestroyed_;

View File

@@ -22,51 +22,51 @@ public:
ApplyViewBase(ReadView const* base, ApplyFlags flags);
// ReadView
[[nodiscard]] bool
bool
open() const override;
[[nodiscard]] LedgerHeader const&
LedgerHeader const&
header() const override;
[[nodiscard]] Fees const&
Fees const&
fees() const override;
[[nodiscard]] Rules const&
Rules const&
rules() const override;
[[nodiscard]] bool
bool
exists(Keylet const& k) const override;
[[nodiscard]] std::optional<key_type>
std::optional<key_type>
succ(key_type const& key, std::optional<key_type> const& last = std::nullopt) const override;
[[nodiscard]] std::shared_ptr<SLE const>
std::shared_ptr<SLE const>
read(Keylet const& k) const override;
[[nodiscard]] std::unique_ptr<sles_type::iter_base>
std::unique_ptr<sles_type::iter_base>
slesBegin() const override;
[[nodiscard]] std::unique_ptr<sles_type::iter_base>
std::unique_ptr<sles_type::iter_base>
slesEnd() const override;
[[nodiscard]] std::unique_ptr<sles_type::iter_base>
std::unique_ptr<sles_type::iter_base>
slesUpperBound(uint256 const& key) const override;
[[nodiscard]] std::unique_ptr<txs_type::iter_base>
std::unique_ptr<txs_type::iter_base>
txsBegin() const override;
[[nodiscard]] std::unique_ptr<txs_type::iter_base>
std::unique_ptr<txs_type::iter_base>
txsEnd() const override;
[[nodiscard]] bool
bool
txExists(key_type const& key) const override;
[[nodiscard]] tx_type
tx_type
txRead(key_type const& key) const override;
// ApplyView
[[nodiscard]] ApplyFlags
ApplyFlags
flags() const override;
std::shared_ptr<SLE>

View File

@@ -42,10 +42,10 @@ public:
void
apply(RawView& to) const;
[[nodiscard]] bool
bool
exists(ReadView const& base, Keylet const& k) const;
[[nodiscard]] std::optional<key_type>
std::optional<key_type>
succ(ReadView const& base, key_type const& key, std::optional<key_type> const& last) const;
void
@@ -57,19 +57,19 @@ public:
void
replace(std::shared_ptr<SLE> const& sle);
[[nodiscard]] std::shared_ptr<SLE const>
std::shared_ptr<SLE const>
read(ReadView const& base, Keylet const& k) const;
void
destroyXRP(XRPAmount const& fee);
[[nodiscard]] std::unique_ptr<ReadView::sles_type::iter_base>
std::unique_ptr<ReadView::sles_type::iter_base>
slesBegin(ReadView const& base) const;
[[nodiscard]] std::unique_ptr<ReadView::sles_type::iter_base>
std::unique_ptr<ReadView::sles_type::iter_base>
slesEnd(ReadView const& base) const;
[[nodiscard]] std::unique_ptr<ReadView::sles_type::iter_base>
std::unique_ptr<ReadView::sles_type::iter_base>
slesUpperBound(ReadView const& base, uint256 const& key) const;
private:

View File

@@ -27,16 +27,16 @@ public:
virtual ~ReadViewFwdIter() = default;
[[nodiscard]] virtual std::unique_ptr<ReadViewFwdIter>
virtual std::unique_ptr<ReadViewFwdIter>
copy() const = 0;
[[nodiscard]] virtual bool
virtual bool
equal(ReadViewFwdIter const& impl) const = 0;
virtual void
increment() = 0;
[[nodiscard]] virtual value_type
virtual value_type
dereference() const = 0;
};
@@ -102,7 +102,7 @@ public:
private:
ReadView const* view_ = nullptr;
std::unique_ptr<iter_base> impl_{};
std::unique_ptr<iter_base> impl_;
std::optional<value_type> mutable cache_;
};

View File

@@ -121,6 +121,15 @@ canTransfer(
[[nodiscard]] TER
canTrade(ReadView const& view, Asset const& asset);
/** Convenience to combine canTrade/Transfer. Returns tesSUCCESS if Asset is Issue.
*/
[[nodiscard]] TER
canMPTTradeAndTransfer(
ReadView const& v,
Asset const& asset,
AccountID const& from,
AccountID const& to);
//------------------------------------------------------------------------------
//
// Empty holding operations (MPT-specific)
@@ -227,17 +236,4 @@ issuerFundsToSelfIssue(ReadView const& view, MPTIssue const& issue);
void
issuerSelfDebitHookMPT(ApplyView& view, MPTIssue const& issue, std::uint64_t amount);
//------------------------------------------------------------------------------
//
// MPT DEX
//
//------------------------------------------------------------------------------
/* Return true if a transaction is allowed for the specified MPT/account. The
* function checks MPTokenIssuance and MPToken objects flags to determine if the
* transaction is allowed.
*/
TER
checkMPTTxAllowed(ReadView const& v, TxType tx, Asset const& asset, AccountID const& accountID);
} // namespace xrpl

View File

@@ -54,9 +54,15 @@ enum class AuthType { StrongAuth, WeakAuth, Legacy };
[[nodiscard]] bool
isGlobalFrozen(ReadView const& view, Asset const& asset);
[[nodiscard]] TER
checkGlobalFrozen(ReadView const& view, Asset const& asset);
[[nodiscard]] bool
isIndividualFrozen(ReadView const& view, AccountID const& account, Asset const& asset);
[[nodiscard]] TER
checkIndividualFrozen(ReadView const& view, AccountID const& account, Asset const& asset);
/**
* isFrozen check is recursive for MPT shares in a vault, descending to
* assets in the vault, up to maxAssetCheckDepth recursion depth. This is

View File

@@ -43,7 +43,7 @@ public:
{
}
[[nodiscard]] bool
bool
isSecure() const
{
return mSecure;

Some files were not shown because too many files have changed in this diff Show More