mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-01 00:15:51 +00:00
Compare commits
106 Commits
dangell7/s
...
3.0.0-rc1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7e4d52e38 | ||
|
|
4135d56aa0 | ||
|
|
865557024e | ||
|
|
91b96d6386 | ||
|
|
f1dbb20d7b | ||
|
|
2a2881ee53 | ||
|
|
ee2dff337d | ||
|
|
102a89f351 | ||
|
|
9add957962 | ||
|
|
0f1b607bb4 | ||
|
|
4425f84c1f | ||
|
|
8a6cc3ded8 | ||
|
|
3eec6ffcd7 | ||
|
|
6b56c805dd | ||
|
|
da0eff9c1b | ||
|
|
6e326e6c11 | ||
|
|
405575fd53 | ||
|
|
f38f299a86 | ||
|
|
8951419dbe | ||
|
|
a8b1a01d9e | ||
|
|
994b490db5 | ||
|
|
7c8b16797f | ||
|
|
9507d9c276 | ||
|
|
8ca21406e6 | ||
|
|
178f4248e4 | ||
|
|
e8069a40f2 | ||
|
|
5ebc29c481 | ||
|
|
224b055124 | ||
|
|
f99c1158d5 | ||
|
|
a2594b6fe0 | ||
|
|
12fb54c66e | ||
|
|
51917be96d | ||
|
|
97b8f5c4b3 | ||
|
|
a127314a89 | ||
|
|
0754cca98c | ||
|
|
eb66ae1bd4 | ||
|
|
5c3b44d1af | ||
|
|
e4b334faba | ||
|
|
adad20b862 | ||
|
|
9907fa07a9 | ||
|
|
d032bd681a | ||
|
|
b444457c19 | ||
|
|
4f076cb955 | ||
|
|
220ab26225 | ||
|
|
89d81655c6 | ||
|
|
7bc2d5cba4 | ||
|
|
a34b36e021 | ||
|
|
5b2ab905c0 | ||
|
|
5e43e91d4a | ||
|
|
5bac21c05b | ||
|
|
1643d22103 | ||
|
|
2df730438d | ||
|
|
5d79bfc531 | ||
|
|
51ef35ab55 | ||
|
|
330a3215bc | ||
|
|
85c2ceacde | ||
|
|
70d5c624e8 | ||
|
|
8e4fda160d | ||
|
|
072b1c442c | ||
|
|
294e03ecf5 | ||
|
|
550f90a75e | ||
|
|
d67dcfe3c4 | ||
|
|
0fd2f715bb | ||
|
|
807462b191 | ||
|
|
19c4226d3d | ||
|
|
d02c306f1e | ||
|
|
cfd26f444c | ||
|
|
2c3024716b | ||
|
|
a12f5de68d | ||
|
|
51c5f2bfc9 | ||
|
|
73ff54143d | ||
|
|
08b136528e | ||
|
|
6b8a589447 | ||
|
|
ffeabc9642 | ||
|
|
3cbdf818a7 | ||
|
|
c46888f8f7 | ||
|
|
2ae65d2fdb | ||
|
|
bd834c87e0 | ||
|
|
dc8b37a524 | ||
|
|
617a895af5 | ||
|
|
1af1048c58 | ||
|
|
f07ba87e51 | ||
|
|
e66558a883 | ||
|
|
510314d344 | ||
|
|
37b951859c | ||
|
|
9494fc9668 | ||
|
|
8d01f35eb9 | ||
|
|
1020a32d76 | ||
|
|
17a2606591 | ||
|
|
ccb9f1e42d | ||
|
|
3e4e9a2ddc | ||
|
|
4caebfbd0e | ||
|
|
37c377a1b6 | ||
|
|
bd182c0a3e | ||
|
|
406c26cc72 | ||
|
|
9bd1ce436a | ||
|
|
f69ad4eff6 | ||
|
|
6fe0599cc2 | ||
|
|
e6f8bc720f | ||
|
|
fbd60fc000 | ||
|
|
61d628d654 | ||
|
|
3d92375d12 | ||
|
|
cdbe70b2a7 | ||
|
|
f6426ca183 | ||
|
|
16c2ff97cc | ||
|
|
32043463a8 |
@@ -33,5 +33,6 @@ slack_app: false
|
|||||||
|
|
||||||
ignore:
|
ignore:
|
||||||
- "src/test/"
|
- "src/test/"
|
||||||
|
- "src/tests/"
|
||||||
- "include/xrpl/beast/test/"
|
- "include/xrpl/beast/test/"
|
||||||
- "include/xrpl/beast/unit_test/"
|
- "include/xrpl/beast/unit_test/"
|
||||||
|
|||||||
30
.github/actions/build-deps/action.yml
vendored
30
.github/actions/build-deps/action.yml
vendored
@@ -10,24 +10,40 @@ inputs:
|
|||||||
build_type:
|
build_type:
|
||||||
description: 'The build type to use ("Debug", "Release").'
|
description: 'The build type to use ("Debug", "Release").'
|
||||||
required: true
|
required: true
|
||||||
|
build_nproc:
|
||||||
|
description: "The number of processors to use for building."
|
||||||
|
required: true
|
||||||
force_build:
|
force_build:
|
||||||
description: 'Force building of all dependencies ("true", "false").'
|
description: 'Force building of all dependencies ("true", "false").'
|
||||||
required: false
|
required: false
|
||||||
default: "false"
|
default: "false"
|
||||||
|
log_verbosity:
|
||||||
|
description: "The logging verbosity."
|
||||||
|
required: false
|
||||||
|
default: "verbose"
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: composite
|
using: composite
|
||||||
steps:
|
steps:
|
||||||
- name: Install Conan dependencies
|
- name: Install Conan dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
|
env:
|
||||||
|
BUILD_DIR: ${{ inputs.build_dir }}
|
||||||
|
BUILD_NPROC: ${{ inputs.build_nproc }}
|
||||||
|
BUILD_OPTION: ${{ inputs.force_build == 'true' && '*' || 'missing' }}
|
||||||
|
BUILD_TYPE: ${{ inputs.build_type }}
|
||||||
|
LOG_VERBOSITY: ${{ inputs.log_verbosity }}
|
||||||
run: |
|
run: |
|
||||||
echo 'Installing dependencies.'
|
echo 'Installing dependencies.'
|
||||||
mkdir -p ${{ inputs.build_dir }}
|
mkdir -p "${BUILD_DIR}"
|
||||||
cd ${{ inputs.build_dir }}
|
cd "${BUILD_DIR}"
|
||||||
conan install \
|
conan install \
|
||||||
--output-folder . \
|
--output-folder . \
|
||||||
--build ${{ inputs.force_build == 'true' && '"*"' || 'missing' }} \
|
--build="${BUILD_OPTION}" \
|
||||||
--options:host '&:tests=True' \
|
--options:host='&:tests=True' \
|
||||||
--options:host '&:xrpld=True' \
|
--options:host='&:xrpld=True' \
|
||||||
--settings:all build_type=${{ inputs.build_type }} \
|
--settings:all build_type="${BUILD_TYPE}" \
|
||||||
--format=json ..
|
--conf:all tools.build:jobs=${BUILD_NPROC} \
|
||||||
|
--conf:all tools.build:verbosity="${LOG_VERBOSITY}" \
|
||||||
|
--conf:all tools.compilation:verbosity="${LOG_VERBOSITY}" \
|
||||||
|
..
|
||||||
|
|||||||
96
.github/actions/build-test/action.yml
vendored
96
.github/actions/build-test/action.yml
vendored
@@ -1,96 +0,0 @@
|
|||||||
# This action build and tests the binary. The Conan dependencies must have
|
|
||||||
# already been installed (see the build-deps action).
|
|
||||||
name: Build and Test
|
|
||||||
description: "Build and test the binary."
|
|
||||||
|
|
||||||
# Note that actions do not support 'type' and all inputs are strings, see
|
|
||||||
# https://docs.github.com/en/actions/reference/workflows-and-actions/metadata-syntax#inputs.
|
|
||||||
inputs:
|
|
||||||
build_dir:
|
|
||||||
description: "The directory where to build."
|
|
||||||
required: true
|
|
||||||
build_only:
|
|
||||||
description: 'Whether to only build or to build and test the code ("true", "false").'
|
|
||||||
required: false
|
|
||||||
default: "false"
|
|
||||||
build_type:
|
|
||||||
description: 'The build type to use ("Debug", "Release").'
|
|
||||||
required: true
|
|
||||||
cmake_args:
|
|
||||||
description: "Additional arguments to pass to CMake."
|
|
||||||
required: false
|
|
||||||
default: ""
|
|
||||||
cmake_target:
|
|
||||||
description: "The CMake target to build."
|
|
||||||
required: true
|
|
||||||
codecov_token:
|
|
||||||
description: "The Codecov token to use for uploading coverage reports."
|
|
||||||
required: false
|
|
||||||
default: ""
|
|
||||||
os:
|
|
||||||
description: 'The operating system to use for the build ("linux", "macos", "windows").'
|
|
||||||
required: true
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: composite
|
|
||||||
steps:
|
|
||||||
- name: Configure CMake
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ inputs.build_dir }}
|
|
||||||
run: |
|
|
||||||
echo 'Configuring CMake.'
|
|
||||||
cmake \
|
|
||||||
-G '${{ inputs.os == 'windows' && 'Visual Studio 17 2022' || 'Ninja' }}' \
|
|
||||||
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
|
|
||||||
-DCMAKE_BUILD_TYPE=${{ inputs.build_type }} \
|
|
||||||
${{ inputs.cmake_args }} \
|
|
||||||
..
|
|
||||||
- name: Build the binary
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ inputs.build_dir }}
|
|
||||||
run: |
|
|
||||||
echo 'Building binary.'
|
|
||||||
cmake \
|
|
||||||
--build . \
|
|
||||||
--config ${{ inputs.build_type }} \
|
|
||||||
--parallel $(nproc) \
|
|
||||||
--target ${{ inputs.cmake_target }}
|
|
||||||
- name: Check linking
|
|
||||||
if: ${{ inputs.os == 'linux' }}
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ inputs.build_dir }}
|
|
||||||
run: |
|
|
||||||
echo 'Checking linking.'
|
|
||||||
ldd ./rippled
|
|
||||||
if [ "$(ldd ./rippled | grep -E '(libstdc\+\+|libgcc)' | wc -l)" -eq 0 ]; then
|
|
||||||
echo 'The binary is statically linked.'
|
|
||||||
else
|
|
||||||
echo 'The binary is dynamically linked.'
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
- name: Verify voidstar
|
|
||||||
if: ${{ contains(inputs.cmake_args, '-Dvoidstar=ON') }}
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ inputs.build_dir }}
|
|
||||||
run: |
|
|
||||||
echo 'Verifying presence of instrumentation.'
|
|
||||||
./rippled --version | grep libvoidstar
|
|
||||||
- name: Test the binary
|
|
||||||
if: ${{ inputs.build_only == 'false' }}
|
|
||||||
shell: bash
|
|
||||||
working-directory: ${{ inputs.build_dir }}/${{ inputs.os == 'windows' && inputs.build_type || '' }}
|
|
||||||
run: |
|
|
||||||
echo 'Testing binary.'
|
|
||||||
./rippled --unittest --unittest-jobs $(nproc)
|
|
||||||
ctest -j $(nproc) --output-on-failure
|
|
||||||
- name: Upload coverage report
|
|
||||||
if: ${{ inputs.cmake_target == 'coverage' }}
|
|
||||||
uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
|
|
||||||
with:
|
|
||||||
disable_search: true
|
|
||||||
disable_telem: true
|
|
||||||
fail_ci_if_error: true
|
|
||||||
files: ${{ inputs.build_dir }}/coverage.xml
|
|
||||||
plugins: noop
|
|
||||||
token: ${{ inputs.codecov_token }}
|
|
||||||
verbose: true
|
|
||||||
43
.github/actions/print-env/action.yml
vendored
Normal file
43
.github/actions/print-env/action.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
name: Print build environment
|
||||||
|
description: "Print environment and some tooling versions"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- name: Check configuration (Windows)
|
||||||
|
if: ${{ runner.os == 'Windows' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo 'Checking environment variables.'
|
||||||
|
set
|
||||||
|
|
||||||
|
echo 'Checking CMake version.'
|
||||||
|
cmake --version
|
||||||
|
|
||||||
|
echo 'Checking Conan version.'
|
||||||
|
conan --version
|
||||||
|
|
||||||
|
- name: Check configuration (Linux and macOS)
|
||||||
|
if: ${{ runner.os == 'Linux' || runner.os == 'macOS' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo 'Checking path.'
|
||||||
|
echo ${PATH} | tr ':' '\n'
|
||||||
|
|
||||||
|
echo 'Checking environment variables.'
|
||||||
|
env | sort
|
||||||
|
|
||||||
|
echo 'Checking CMake version.'
|
||||||
|
cmake --version
|
||||||
|
|
||||||
|
echo 'Checking compiler version.'
|
||||||
|
${{ runner.os == 'Linux' && '${CC}' || 'clang' }} --version
|
||||||
|
|
||||||
|
echo 'Checking Conan version.'
|
||||||
|
conan --version
|
||||||
|
|
||||||
|
echo 'Checking Ninja version.'
|
||||||
|
ninja --version
|
||||||
|
|
||||||
|
echo 'Checking nproc version.'
|
||||||
|
nproc --version
|
||||||
7
.github/actions/setup-conan/action.yml
vendored
7
.github/actions/setup-conan/action.yml
vendored
@@ -35,9 +35,12 @@ runs:
|
|||||||
|
|
||||||
- name: Set up Conan remote
|
- name: Set up Conan remote
|
||||||
shell: bash
|
shell: bash
|
||||||
|
env:
|
||||||
|
CONAN_REMOTE_NAME: ${{ inputs.conan_remote_name }}
|
||||||
|
CONAN_REMOTE_URL: ${{ inputs.conan_remote_url }}
|
||||||
run: |
|
run: |
|
||||||
echo "Adding Conan remote '${{ inputs.conan_remote_name }}' at ${{ inputs.conan_remote_url }}."
|
echo "Adding Conan remote '${CONAN_REMOTE_NAME}' at '${CONAN_REMOTE_URL}'."
|
||||||
conan remote add --index 0 --force ${{ inputs.conan_remote_name }} ${{ inputs.conan_remote_url }}
|
conan remote add --index 0 --force "${CONAN_REMOTE_NAME}" "${CONAN_REMOTE_URL}"
|
||||||
|
|
||||||
echo 'Listing Conan remotes.'
|
echo 'Listing Conan remotes.'
|
||||||
conan remote list
|
conan remote list
|
||||||
|
|||||||
6
.github/scripts/levelization/README.md
vendored
6
.github/scripts/levelization/README.md
vendored
@@ -72,15 +72,15 @@ It generates many files of [results](results):
|
|||||||
desired as described above. In a perfect repo, this file will be
|
desired as described above. In a perfect repo, this file will be
|
||||||
empty.
|
empty.
|
||||||
This file is committed to the repo, and is used by the [levelization
|
This file is committed to the repo, and is used by the [levelization
|
||||||
Github workflow](../../workflows/check-levelization.yml) to validate
|
Github workflow](../../workflows/reusable-check-levelization.yml) to validate
|
||||||
that nothing changed.
|
that nothing changed.
|
||||||
- [`ordering.txt`](results/ordering.txt): A list showing relationships
|
- [`ordering.txt`](results/ordering.txt): A list showing relationships
|
||||||
between modules where there are no loops as they actually exist, as
|
between modules where there are no loops as they actually exist, as
|
||||||
opposed to how they are desired as described above.
|
opposed to how they are desired as described above.
|
||||||
This file is committed to the repo, and is used by the [levelization
|
This file is committed to the repo, and is used by the [levelization
|
||||||
Github workflow](../../workflows/check-levelization.yml) to validate
|
Github workflow](../../workflows/reusable-check-levelization.yml) to validate
|
||||||
that nothing changed.
|
that nothing changed.
|
||||||
- [`levelization.yml`](../../workflows/check-levelization.yml)
|
- [`levelization.yml`](../../workflows/reusable-check-levelization.yml)
|
||||||
Github Actions workflow to test that levelization loops haven't
|
Github Actions workflow to test that levelization loops haven't
|
||||||
changed. Unfortunately, if changes are detected, it can't tell if
|
changed. Unfortunately, if changes are detected, it can't tell if
|
||||||
they are improvements or not, so if you have resolved any issues or
|
they are improvements or not, so if you have resolved any issues or
|
||||||
|
|||||||
@@ -7,9 +7,6 @@ Loop: test.jtx test.unit_test
|
|||||||
Loop: xrpld.app xrpld.core
|
Loop: xrpld.app xrpld.core
|
||||||
xrpld.app > xrpld.core
|
xrpld.app > xrpld.core
|
||||||
|
|
||||||
Loop: xrpld.app xrpld.ledger
|
|
||||||
xrpld.app > xrpld.ledger
|
|
||||||
|
|
||||||
Loop: xrpld.app xrpld.overlay
|
Loop: xrpld.app xrpld.overlay
|
||||||
xrpld.overlay > xrpld.app
|
xrpld.overlay > xrpld.app
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ libxrpl.basics > xrpl.basics
|
|||||||
libxrpl.crypto > xrpl.basics
|
libxrpl.crypto > xrpl.basics
|
||||||
libxrpl.json > xrpl.basics
|
libxrpl.json > xrpl.basics
|
||||||
libxrpl.json > xrpl.json
|
libxrpl.json > xrpl.json
|
||||||
|
libxrpl.ledger > xrpl.basics
|
||||||
|
libxrpl.ledger > xrpl.json
|
||||||
|
libxrpl.ledger > xrpl.ledger
|
||||||
|
libxrpl.ledger > xrpl.protocol
|
||||||
libxrpl.net > xrpl.basics
|
libxrpl.net > xrpl.basics
|
||||||
libxrpl.net > xrpl.net
|
libxrpl.net > xrpl.net
|
||||||
libxrpl.protocol > xrpl.basics
|
libxrpl.protocol > xrpl.basics
|
||||||
@@ -21,11 +25,11 @@ test.app > test.unit_test
|
|||||||
test.app > xrpl.basics
|
test.app > xrpl.basics
|
||||||
test.app > xrpld.app
|
test.app > xrpld.app
|
||||||
test.app > xrpld.core
|
test.app > xrpld.core
|
||||||
test.app > xrpld.ledger
|
|
||||||
test.app > xrpld.nodestore
|
test.app > xrpld.nodestore
|
||||||
test.app > xrpld.overlay
|
test.app > xrpld.overlay
|
||||||
test.app > xrpld.rpc
|
test.app > xrpld.rpc
|
||||||
test.app > xrpl.json
|
test.app > xrpl.json
|
||||||
|
test.app > xrpl.ledger
|
||||||
test.app > xrpl.protocol
|
test.app > xrpl.protocol
|
||||||
test.app > xrpl.resource
|
test.app > xrpl.resource
|
||||||
test.basics > test.jtx
|
test.basics > test.jtx
|
||||||
@@ -44,8 +48,8 @@ test.consensus > test.unit_test
|
|||||||
test.consensus > xrpl.basics
|
test.consensus > xrpl.basics
|
||||||
test.consensus > xrpld.app
|
test.consensus > xrpld.app
|
||||||
test.consensus > xrpld.consensus
|
test.consensus > xrpld.consensus
|
||||||
test.consensus > xrpld.ledger
|
|
||||||
test.consensus > xrpl.json
|
test.consensus > xrpl.json
|
||||||
|
test.consensus > xrpl.ledger
|
||||||
test.core > test.jtx
|
test.core > test.jtx
|
||||||
test.core > test.toplevel
|
test.core > test.toplevel
|
||||||
test.core > test.unit_test
|
test.core > test.unit_test
|
||||||
@@ -63,9 +67,9 @@ test.json > xrpl.json
|
|||||||
test.jtx > xrpl.basics
|
test.jtx > xrpl.basics
|
||||||
test.jtx > xrpld.app
|
test.jtx > xrpld.app
|
||||||
test.jtx > xrpld.core
|
test.jtx > xrpld.core
|
||||||
test.jtx > xrpld.ledger
|
|
||||||
test.jtx > xrpld.rpc
|
test.jtx > xrpld.rpc
|
||||||
test.jtx > xrpl.json
|
test.jtx > xrpl.json
|
||||||
|
test.jtx > xrpl.ledger
|
||||||
test.jtx > xrpl.net
|
test.jtx > xrpl.net
|
||||||
test.jtx > xrpl.protocol
|
test.jtx > xrpl.protocol
|
||||||
test.jtx > xrpl.resource
|
test.jtx > xrpl.resource
|
||||||
@@ -75,7 +79,7 @@ test.ledger > test.toplevel
|
|||||||
test.ledger > xrpl.basics
|
test.ledger > xrpl.basics
|
||||||
test.ledger > xrpld.app
|
test.ledger > xrpld.app
|
||||||
test.ledger > xrpld.core
|
test.ledger > xrpld.core
|
||||||
test.ledger > xrpld.ledger
|
test.ledger > xrpl.ledger
|
||||||
test.ledger > xrpl.protocol
|
test.ledger > xrpl.protocol
|
||||||
test.nodestore > test.jtx
|
test.nodestore > test.jtx
|
||||||
test.nodestore > test.toplevel
|
test.nodestore > test.toplevel
|
||||||
@@ -134,7 +138,11 @@ test.toplevel > test.csf
|
|||||||
test.toplevel > xrpl.json
|
test.toplevel > xrpl.json
|
||||||
test.unit_test > xrpl.basics
|
test.unit_test > xrpl.basics
|
||||||
tests.libxrpl > xrpl.basics
|
tests.libxrpl > xrpl.basics
|
||||||
|
tests.libxrpl > xrpl.json
|
||||||
|
tests.libxrpl > xrpl.net
|
||||||
xrpl.json > xrpl.basics
|
xrpl.json > xrpl.basics
|
||||||
|
xrpl.ledger > xrpl.basics
|
||||||
|
xrpl.ledger > xrpl.protocol
|
||||||
xrpl.net > xrpl.basics
|
xrpl.net > xrpl.basics
|
||||||
xrpl.protocol > xrpl.basics
|
xrpl.protocol > xrpl.basics
|
||||||
xrpl.protocol > xrpl.json
|
xrpl.protocol > xrpl.json
|
||||||
@@ -151,6 +159,7 @@ xrpld.app > xrpld.consensus
|
|||||||
xrpld.app > xrpld.nodestore
|
xrpld.app > xrpld.nodestore
|
||||||
xrpld.app > xrpld.perflog
|
xrpld.app > xrpld.perflog
|
||||||
xrpld.app > xrpl.json
|
xrpld.app > xrpl.json
|
||||||
|
xrpld.app > xrpl.ledger
|
||||||
xrpld.app > xrpl.net
|
xrpld.app > xrpl.net
|
||||||
xrpld.app > xrpl.protocol
|
xrpld.app > xrpl.protocol
|
||||||
xrpld.app > xrpl.resource
|
xrpld.app > xrpl.resource
|
||||||
@@ -163,9 +172,6 @@ xrpld.core > xrpl.basics
|
|||||||
xrpld.core > xrpl.json
|
xrpld.core > xrpl.json
|
||||||
xrpld.core > xrpl.net
|
xrpld.core > xrpl.net
|
||||||
xrpld.core > xrpl.protocol
|
xrpld.core > xrpl.protocol
|
||||||
xrpld.ledger > xrpl.basics
|
|
||||||
xrpld.ledger > xrpl.json
|
|
||||||
xrpld.ledger > xrpl.protocol
|
|
||||||
xrpld.nodestore > xrpl.basics
|
xrpld.nodestore > xrpl.basics
|
||||||
xrpld.nodestore > xrpld.core
|
xrpld.nodestore > xrpld.core
|
||||||
xrpld.nodestore > xrpld.unity
|
xrpld.nodestore > xrpld.unity
|
||||||
@@ -186,9 +192,9 @@ xrpld.perflog > xrpl.basics
|
|||||||
xrpld.perflog > xrpl.json
|
xrpld.perflog > xrpl.json
|
||||||
xrpld.rpc > xrpl.basics
|
xrpld.rpc > xrpl.basics
|
||||||
xrpld.rpc > xrpld.core
|
xrpld.rpc > xrpld.core
|
||||||
xrpld.rpc > xrpld.ledger
|
|
||||||
xrpld.rpc > xrpld.nodestore
|
xrpld.rpc > xrpld.nodestore
|
||||||
xrpld.rpc > xrpl.json
|
xrpld.rpc > xrpl.json
|
||||||
|
xrpld.rpc > xrpl.ledger
|
||||||
xrpld.rpc > xrpl.net
|
xrpld.rpc > xrpl.net
|
||||||
xrpld.rpc > xrpl.protocol
|
xrpld.rpc > xrpl.protocol
|
||||||
xrpld.rpc > xrpl.resource
|
xrpld.rpc > xrpl.resource
|
||||||
|
|||||||
16
.github/scripts/strategy-matrix/generate.py
vendored
16
.github/scripts/strategy-matrix/generate.py
vendored
@@ -45,7 +45,7 @@ def generate_strategy_matrix(all: bool, config: Config) -> list:
|
|||||||
# Only generate a subset of configurations in PRs.
|
# Only generate a subset of configurations in PRs.
|
||||||
if not all:
|
if not all:
|
||||||
# Debian:
|
# Debian:
|
||||||
# - Bookworm using GCC 13: Release and Unity on linux/arm64, set
|
# - Bookworm using GCC 13: Release and Unity on linux/amd64, set
|
||||||
# the reference fee to 500.
|
# the reference fee to 500.
|
||||||
# - Bookworm using GCC 15: Debug and no Unity on linux/amd64, enable
|
# - Bookworm using GCC 15: Debug and no Unity on linux/amd64, enable
|
||||||
# code coverage (which will be done below).
|
# code coverage (which will be done below).
|
||||||
@@ -57,7 +57,7 @@ def generate_strategy_matrix(all: bool, config: Config) -> list:
|
|||||||
if os['distro_name'] == 'debian':
|
if os['distro_name'] == 'debian':
|
||||||
skip = True
|
skip = True
|
||||||
if os['distro_version'] == 'bookworm':
|
if os['distro_version'] == 'bookworm':
|
||||||
if f'{os['compiler_name']}-{os['compiler_version']}' == 'gcc-13' and build_type == 'Release' and '-Dunity=ON' in cmake_args and architecture['platform'] == 'linux/arm64':
|
if f'{os['compiler_name']}-{os['compiler_version']}' == 'gcc-13' and build_type == 'Release' and '-Dunity=ON' in cmake_args and architecture['platform'] == 'linux/amd64':
|
||||||
cmake_args = f'-DUNIT_TEST_REFERENCE_FEE=500 {cmake_args}'
|
cmake_args = f'-DUNIT_TEST_REFERENCE_FEE=500 {cmake_args}'
|
||||||
skip = False
|
skip = False
|
||||||
if f'{os['compiler_name']}-{os['compiler_version']}' == 'gcc-15' and build_type == 'Debug' and '-Dunity=OFF' in cmake_args and architecture['platform'] == 'linux/amd64':
|
if f'{os['compiler_name']}-{os['compiler_version']}' == 'gcc-15' and build_type == 'Debug' and '-Dunity=OFF' in cmake_args and architecture['platform'] == 'linux/amd64':
|
||||||
@@ -74,14 +74,14 @@ def generate_strategy_matrix(all: bool, config: Config) -> list:
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
# RHEL:
|
# RHEL:
|
||||||
# - 9.4 using GCC 12: Debug and Unity on linux/amd64.
|
# - 9 using GCC 12: Debug and Unity on linux/amd64.
|
||||||
# - 9.6 using Clang: Release and no Unity on linux/amd64.
|
# - 10 using Clang: Release and no Unity on linux/amd64.
|
||||||
if os['distro_name'] == 'rhel':
|
if os['distro_name'] == 'rhel':
|
||||||
skip = True
|
skip = True
|
||||||
if os['distro_version'] == '9.4':
|
if os['distro_version'] == '9':
|
||||||
if f'{os['compiler_name']}-{os['compiler_version']}' == 'gcc-12' and build_type == 'Debug' and '-Dunity=ON' in cmake_args and architecture['platform'] == 'linux/amd64':
|
if f'{os['compiler_name']}-{os['compiler_version']}' == 'gcc-12' and build_type == 'Debug' and '-Dunity=ON' in cmake_args and architecture['platform'] == 'linux/amd64':
|
||||||
skip = False
|
skip = False
|
||||||
elif os['distro_version'] == '9.6':
|
elif os['distro_version'] == '10':
|
||||||
if f'{os['compiler_name']}-{os['compiler_version']}' == 'clang-any' and build_type == 'Release' and '-Dunity=OFF' in cmake_args and architecture['platform'] == 'linux/amd64':
|
if f'{os['compiler_name']}-{os['compiler_version']}' == 'clang-any' and build_type == 'Release' and '-Dunity=OFF' in cmake_args and architecture['platform'] == 'linux/amd64':
|
||||||
skip = False
|
skip = False
|
||||||
if skip:
|
if skip:
|
||||||
@@ -138,8 +138,6 @@ def generate_strategy_matrix(all: bool, config: Config) -> list:
|
|||||||
# Unity on linux/amd64
|
# Unity on linux/amd64
|
||||||
if f'{os['compiler_name']}-{os['compiler_version']}' == 'gcc-15' and build_type == 'Debug' and '-Dunity=OFF' in cmake_args and architecture['platform'] == 'linux/amd64':
|
if f'{os['compiler_name']}-{os['compiler_version']}' == 'gcc-15' and build_type == 'Debug' and '-Dunity=OFF' in cmake_args and architecture['platform'] == 'linux/amd64':
|
||||||
cmake_args = f'-Dcoverage=ON -Dcoverage_format=xml -DCODE_COVERAGE_VERBOSE=ON -DCMAKE_C_FLAGS=-O0 -DCMAKE_CXX_FLAGS=-O0 {cmake_args}'
|
cmake_args = f'-Dcoverage=ON -Dcoverage_format=xml -DCODE_COVERAGE_VERBOSE=ON -DCMAKE_C_FLAGS=-O0 -DCMAKE_CXX_FLAGS=-O0 {cmake_args}'
|
||||||
cmake_target = 'coverage'
|
|
||||||
build_only = True
|
|
||||||
|
|
||||||
# Generate a unique name for the configuration, e.g. macos-arm64-debug
|
# Generate a unique name for the configuration, e.g. macos-arm64-debug
|
||||||
# or debian-bookworm-gcc-12-amd64-release-unity.
|
# or debian-bookworm-gcc-12-amd64-release-unity.
|
||||||
@@ -162,7 +160,7 @@ def generate_strategy_matrix(all: bool, config: Config) -> list:
|
|||||||
'config_name': config_name,
|
'config_name': config_name,
|
||||||
'cmake_args': cmake_args,
|
'cmake_args': cmake_args,
|
||||||
'cmake_target': cmake_target,
|
'cmake_target': cmake_target,
|
||||||
'build_only': 'true' if build_only else 'false',
|
'build_only': build_only,
|
||||||
'build_type': build_type,
|
'build_type': build_type,
|
||||||
'os': os,
|
'os': os,
|
||||||
'architecture': architecture,
|
'architecture': architecture,
|
||||||
|
|||||||
122
.github/scripts/strategy-matrix/linux.json
vendored
122
.github/scripts/strategy-matrix/linux.json
vendored
@@ -14,139 +14,169 @@
|
|||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "gcc",
|
"compiler_name": "gcc",
|
||||||
"compiler_version": "12"
|
"compiler_version": "12",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "gcc",
|
"compiler_name": "gcc",
|
||||||
"compiler_version": "13"
|
"compiler_version": "13",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "gcc",
|
"compiler_name": "gcc",
|
||||||
"compiler_version": "14"
|
"compiler_version": "14",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "gcc",
|
"compiler_name": "gcc",
|
||||||
"compiler_version": "15"
|
"compiler_version": "15",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "16"
|
"compiler_version": "16",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "17"
|
"compiler_version": "17",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "18"
|
"compiler_version": "18",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "19"
|
"compiler_version": "19",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "debian",
|
"distro_name": "debian",
|
||||||
"distro_version": "bookworm",
|
"distro_version": "bookworm",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "20"
|
"compiler_version": "20",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "rhel",
|
"distro_name": "rhel",
|
||||||
"distro_version": "9.4",
|
"distro_version": "8",
|
||||||
"compiler_name": "gcc",
|
"compiler_name": "gcc",
|
||||||
"compiler_version": "12"
|
"compiler_version": "14",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "rhel",
|
"distro_name": "rhel",
|
||||||
"distro_version": "9.4",
|
"distro_version": "8",
|
||||||
"compiler_name": "gcc",
|
|
||||||
"compiler_version": "13"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"distro_name": "rhel",
|
|
||||||
"distro_version": "9.4",
|
|
||||||
"compiler_name": "gcc",
|
|
||||||
"compiler_version": "14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"distro_name": "rhel",
|
|
||||||
"distro_version": "9.6",
|
|
||||||
"compiler_name": "gcc",
|
|
||||||
"compiler_version": "13"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"distro_name": "rhel",
|
|
||||||
"distro_version": "9.6",
|
|
||||||
"compiler_name": "gcc",
|
|
||||||
"compiler_version": "14"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"distro_name": "rhel",
|
|
||||||
"distro_version": "9.4",
|
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "any"
|
"compiler_version": "any",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "rhel",
|
"distro_name": "rhel",
|
||||||
"distro_version": "9.6",
|
"distro_version": "9",
|
||||||
|
"compiler_name": "gcc",
|
||||||
|
"compiler_version": "12",
|
||||||
|
"image_sha": "97ba375"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"distro_name": "rhel",
|
||||||
|
"distro_version": "9",
|
||||||
|
"compiler_name": "gcc",
|
||||||
|
"compiler_version": "13",
|
||||||
|
"image_sha": "97ba375"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"distro_name": "rhel",
|
||||||
|
"distro_version": "9",
|
||||||
|
"compiler_name": "gcc",
|
||||||
|
"compiler_version": "14",
|
||||||
|
"image_sha": "97ba375"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"distro_name": "rhel",
|
||||||
|
"distro_version": "9",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "any"
|
"compiler_version": "any",
|
||||||
|
"image_sha": "97ba375"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"distro_name": "rhel",
|
||||||
|
"distro_version": "10",
|
||||||
|
"compiler_name": "gcc",
|
||||||
|
"compiler_version": "14",
|
||||||
|
"image_sha": "97ba375"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"distro_name": "rhel",
|
||||||
|
"distro_version": "10",
|
||||||
|
"compiler_name": "clang",
|
||||||
|
"compiler_version": "any",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "ubuntu",
|
"distro_name": "ubuntu",
|
||||||
"distro_version": "jammy",
|
"distro_version": "jammy",
|
||||||
"compiler_name": "gcc",
|
"compiler_name": "gcc",
|
||||||
"compiler_version": "12"
|
"compiler_version": "12",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "ubuntu",
|
"distro_name": "ubuntu",
|
||||||
"distro_version": "noble",
|
"distro_version": "noble",
|
||||||
"compiler_name": "gcc",
|
"compiler_name": "gcc",
|
||||||
"compiler_version": "13"
|
"compiler_version": "13",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "ubuntu",
|
"distro_name": "ubuntu",
|
||||||
"distro_version": "noble",
|
"distro_version": "noble",
|
||||||
"compiler_name": "gcc",
|
"compiler_name": "gcc",
|
||||||
"compiler_version": "14"
|
"compiler_version": "14",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "ubuntu",
|
"distro_name": "ubuntu",
|
||||||
"distro_version": "noble",
|
"distro_version": "noble",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "16"
|
"compiler_version": "16",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "ubuntu",
|
"distro_name": "ubuntu",
|
||||||
"distro_version": "noble",
|
"distro_version": "noble",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "17"
|
"compiler_version": "17",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "ubuntu",
|
"distro_name": "ubuntu",
|
||||||
"distro_version": "noble",
|
"distro_version": "noble",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "18"
|
"compiler_version": "18",
|
||||||
|
"image_sha": "97ba375"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"distro_name": "ubuntu",
|
"distro_name": "ubuntu",
|
||||||
"distro_version": "noble",
|
"distro_version": "noble",
|
||||||
"compiler_name": "clang",
|
"compiler_name": "clang",
|
||||||
"compiler_version": "19"
|
"compiler_version": "19",
|
||||||
|
"image_sha": "97ba375"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"build_type": ["Debug", "Release"],
|
"build_type": ["Debug", "Release"],
|
||||||
|
|||||||
3
.github/scripts/strategy-matrix/macos.json
vendored
3
.github/scripts/strategy-matrix/macos.json
vendored
@@ -10,7 +10,8 @@
|
|||||||
"distro_name": "macos",
|
"distro_name": "macos",
|
||||||
"distro_version": "",
|
"distro_version": "",
|
||||||
"compiler_name": "",
|
"compiler_name": "",
|
||||||
"compiler_version": ""
|
"compiler_version": "",
|
||||||
|
"image_sha": ""
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"build_type": ["Debug", "Release"],
|
"build_type": ["Debug", "Release"],
|
||||||
|
|||||||
5
.github/scripts/strategy-matrix/windows.json
vendored
5
.github/scripts/strategy-matrix/windows.json
vendored
@@ -2,7 +2,7 @@
|
|||||||
"architecture": [
|
"architecture": [
|
||||||
{
|
{
|
||||||
"platform": "windows/amd64",
|
"platform": "windows/amd64",
|
||||||
"runner": ["windows-latest"]
|
"runner": ["self-hosted", "Windows", "devbox"]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"os": [
|
"os": [
|
||||||
@@ -10,7 +10,8 @@
|
|||||||
"distro_name": "windows",
|
"distro_name": "windows",
|
||||||
"distro_version": "",
|
"distro_version": "",
|
||||||
"compiler_name": "",
|
"compiler_name": "",
|
||||||
"compiler_version": ""
|
"compiler_version": "",
|
||||||
|
"image_sha": ""
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"build_type": ["Debug", "Release"],
|
"build_type": ["Debug", "Release"],
|
||||||
|
|||||||
146
.github/workflows/build-test.yml
vendored
146
.github/workflows/build-test.yml
vendored
@@ -1,146 +0,0 @@
|
|||||||
# This workflow builds and tests the binary for various configurations.
|
|
||||||
name: Build and test
|
|
||||||
|
|
||||||
# This workflow can only be triggered by other workflows. Note that the
|
|
||||||
# workflow_call event does not support the 'choice' input type, see
|
|
||||||
# https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#onworkflow_callinputsinput_idtype,
|
|
||||||
# so we use 'string' instead.
|
|
||||||
on:
|
|
||||||
workflow_call:
|
|
||||||
inputs:
|
|
||||||
build_dir:
|
|
||||||
description: "The directory where to build."
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: ".build"
|
|
||||||
dependencies_force_build:
|
|
||||||
description: "Force building of all dependencies."
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
dependencies_force_upload:
|
|
||||||
description: "Force uploading of all dependencies."
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
os:
|
|
||||||
description: 'The operating system to use for the build ("linux", "macos", "windows").'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
strategy_matrix:
|
|
||||||
# TODO: Support additional strategies, e.g. "ubuntu" for generating all Ubuntu configurations.
|
|
||||||
description: 'The strategy matrix to use for generating the configurations ("minimal", "all").'
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
default: "minimal"
|
|
||||||
secrets:
|
|
||||||
codecov_token:
|
|
||||||
description: "The Codecov token to use for uploading coverage reports."
|
|
||||||
required: false
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.os }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# Generate the strategy matrix to be used by the following job.
|
|
||||||
generate-matrix:
|
|
||||||
uses: ./.github/workflows/reusable-strategy-matrix.yml
|
|
||||||
with:
|
|
||||||
os: ${{ inputs.os }}
|
|
||||||
strategy_matrix: ${{ inputs.strategy_matrix }}
|
|
||||||
|
|
||||||
# Build and test the binary.
|
|
||||||
build-test:
|
|
||||||
needs:
|
|
||||||
- generate-matrix
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
|
|
||||||
runs-on: ${{ matrix.architecture.runner }}
|
|
||||||
container: ${{ inputs.os == 'linux' && format('ghcr.io/xrplf/ci/{0}-{1}:{2}-{3}', matrix.os.distro_name, matrix.os.distro_version, matrix.os.compiler_name, matrix.os.compiler_version) || null }}
|
|
||||||
steps:
|
|
||||||
- name: Check strategy matrix
|
|
||||||
run: |
|
|
||||||
echo 'Operating system distro name: ${{ matrix.os.distro_name }}'
|
|
||||||
echo 'Operating system distro version: ${{ matrix.os.distro_version }}'
|
|
||||||
echo 'Operating system compiler name: ${{ matrix.os.compiler_name }}'
|
|
||||||
echo 'Operating system compiler version: ${{ matrix.os.compiler_version }}'
|
|
||||||
echo 'Architecture platform: ${{ matrix.architecture.platform }}'
|
|
||||||
echo 'Architecture runner: ${{ toJson(matrix.architecture.runner) }}'
|
|
||||||
echo 'Build type: ${{ matrix.build_type }}'
|
|
||||||
echo 'Build only: ${{ matrix.build_only }}'
|
|
||||||
echo 'CMake arguments: ${{ matrix.cmake_args }}'
|
|
||||||
echo 'CMake target: ${{ matrix.cmake_target }}'
|
|
||||||
echo 'Config name: ${{ matrix.config_name }}'
|
|
||||||
|
|
||||||
- name: Cleanup workspace
|
|
||||||
if: ${{ runner.os == 'macOS' }}
|
|
||||||
uses: XRPLF/actions/.github/actions/cleanup-workspace@3f044c7478548e3c32ff68980eeb36ece02b364e
|
|
||||||
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
|
||||||
- name: Prepare runner
|
|
||||||
uses: XRPLF/actions/.github/actions/prepare-runner@638e0dc11ea230f91bd26622fb542116bb5254d5
|
|
||||||
with:
|
|
||||||
disable_ccache: false
|
|
||||||
|
|
||||||
- name: Check configuration (Windows)
|
|
||||||
if: ${{ inputs.os == 'windows' }}
|
|
||||||
run: |
|
|
||||||
echo 'Checking environment variables.'
|
|
||||||
set
|
|
||||||
|
|
||||||
echo 'Checking CMake version.'
|
|
||||||
cmake --version
|
|
||||||
|
|
||||||
echo 'Checking Conan version.'
|
|
||||||
conan --version
|
|
||||||
- name: Check configuration (Linux and MacOS)
|
|
||||||
if: ${{ inputs.os == 'linux' || inputs.os == 'macos' }}
|
|
||||||
run: |
|
|
||||||
echo 'Checking path.'
|
|
||||||
echo ${PATH} | tr ':' '\n'
|
|
||||||
|
|
||||||
echo 'Checking environment variables.'
|
|
||||||
env | sort
|
|
||||||
|
|
||||||
echo 'Checking CMake version.'
|
|
||||||
cmake --version
|
|
||||||
|
|
||||||
echo 'Checking compiler version.'
|
|
||||||
${{ inputs.os == 'linux' && '${CC}' || 'clang' }} --version
|
|
||||||
|
|
||||||
echo 'Checking Conan version.'
|
|
||||||
conan --version
|
|
||||||
|
|
||||||
echo 'Checking Ninja version.'
|
|
||||||
ninja --version
|
|
||||||
|
|
||||||
echo 'Checking nproc version.'
|
|
||||||
nproc --version
|
|
||||||
|
|
||||||
- name: Setup Conan
|
|
||||||
uses: ./.github/actions/setup-conan
|
|
||||||
|
|
||||||
- name: Build dependencies
|
|
||||||
uses: ./.github/actions/build-deps
|
|
||||||
with:
|
|
||||||
build_dir: ${{ inputs.build_dir }}
|
|
||||||
build_type: ${{ matrix.build_type }}
|
|
||||||
force_build: ${{ inputs.dependencies_force_build }}
|
|
||||||
|
|
||||||
- name: Build and test binary
|
|
||||||
uses: ./.github/actions/build-test
|
|
||||||
with:
|
|
||||||
build_dir: ${{ inputs.build_dir }}
|
|
||||||
build_only: ${{ matrix.build_only }}
|
|
||||||
build_type: ${{ matrix.build_type }}
|
|
||||||
cmake_args: ${{ matrix.cmake_args }}
|
|
||||||
cmake_target: ${{ matrix.cmake_target }}
|
|
||||||
codecov_token: ${{ secrets.codecov_token }}
|
|
||||||
os: ${{ inputs.os }}
|
|
||||||
44
.github/workflows/check-format.yml
vendored
44
.github/workflows/check-format.yml
vendored
@@ -1,44 +0,0 @@
|
|||||||
# This workflow checks if the code is properly formatted.
|
|
||||||
name: Check format
|
|
||||||
|
|
||||||
# This workflow can only be triggered by other workflows.
|
|
||||||
on: workflow_call
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}-format
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
pre-commit:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
container: ghcr.io/xrplf/ci/tools-rippled-pre-commit
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
|
||||||
- name: Prepare runner
|
|
||||||
uses: XRPLF/actions/.github/actions/prepare-runner@638e0dc11ea230f91bd26622fb542116bb5254d5
|
|
||||||
- name: Format code
|
|
||||||
run: pre-commit run --show-diff-on-failure --color=always --all-files
|
|
||||||
- name: Check for differences
|
|
||||||
env:
|
|
||||||
MESSAGE: |
|
|
||||||
One or more files did not conform to the formatting. Maybe you did
|
|
||||||
not run 'pre-commit' before committing, or your version of
|
|
||||||
'clang-format' or 'prettier' has an incompatibility with the ones
|
|
||||||
used here (see the "Check configuration" step above).
|
|
||||||
|
|
||||||
Run 'pre-commit run --all-files' in your repo, and then commit and
|
|
||||||
push the changes.
|
|
||||||
run: |
|
|
||||||
DIFF=$(git status --porcelain)
|
|
||||||
if [ -n "${DIFF}" ]; then
|
|
||||||
# Print the files that changed to give the contributor a hint about
|
|
||||||
# what to expect when running pre-commit on their own machine.
|
|
||||||
git status
|
|
||||||
echo "${MESSAGE}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
35
.github/workflows/on-pr.yml
vendored
35
.github/workflows/on-pr.yml
vendored
@@ -50,18 +50,20 @@ jobs:
|
|||||||
files: |
|
files: |
|
||||||
# These paths are unique to `on-pr.yml`.
|
# These paths are unique to `on-pr.yml`.
|
||||||
.github/scripts/levelization/**
|
.github/scripts/levelization/**
|
||||||
.github/workflows/check-format.yml
|
.github/workflows/reusable-check-levelization.yml
|
||||||
.github/workflows/check-levelization.yml
|
.github/workflows/reusable-notify-clio.yml
|
||||||
.github/workflows/notify-clio.yml
|
|
||||||
.github/workflows/on-pr.yml
|
.github/workflows/on-pr.yml
|
||||||
.clang-format
|
|
||||||
.pre-commit-config.yaml
|
|
||||||
|
|
||||||
# Keep the paths below in sync with those in `on-trigger.yml`.
|
# Keep the paths below in sync with those in `on-trigger.yml`.
|
||||||
.github/actions/build-deps/**
|
.github/actions/build-deps/**
|
||||||
.github/actions/build-test/**
|
.github/actions/build-test/**
|
||||||
|
.github/actions/setup-conan/**
|
||||||
.github/scripts/strategy-matrix/**
|
.github/scripts/strategy-matrix/**
|
||||||
.github/workflows/build-test.yml
|
.github/workflows/reusable-build.yml
|
||||||
|
.github/workflows/reusable-build-test-config.yml
|
||||||
|
.github/workflows/reusable-build-test.yml
|
||||||
|
.github/workflows/reusable-strategy-matrix.yml
|
||||||
|
.github/workflows/reusable-test.yml
|
||||||
.codecov.yml
|
.codecov.yml
|
||||||
cmake/**
|
cmake/**
|
||||||
conan/**
|
conan/**
|
||||||
@@ -91,34 +93,30 @@ jobs:
|
|||||||
outputs:
|
outputs:
|
||||||
go: ${{ steps.go.outputs.go == 'true' }}
|
go: ${{ steps.go.outputs.go == 'true' }}
|
||||||
|
|
||||||
check-format:
|
|
||||||
needs: should-run
|
|
||||||
if: needs.should-run.outputs.go == 'true'
|
|
||||||
uses: ./.github/workflows/check-format.yml
|
|
||||||
|
|
||||||
check-levelization:
|
check-levelization:
|
||||||
needs: should-run
|
needs: should-run
|
||||||
if: needs.should-run.outputs.go == 'true'
|
if: ${{ needs.should-run.outputs.go == 'true' }}
|
||||||
uses: ./.github/workflows/check-levelization.yml
|
uses: ./.github/workflows/reusable-check-levelization.yml
|
||||||
|
|
||||||
build-test:
|
build-test:
|
||||||
needs: should-run
|
needs: should-run
|
||||||
if: needs.should-run.outputs.go == 'true'
|
if: ${{ needs.should-run.outputs.go == 'true' }}
|
||||||
uses: ./.github/workflows/build-test.yml
|
uses: ./.github/workflows/reusable-build-test.yml
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [linux, macos, windows]
|
os: [linux, macos, windows]
|
||||||
with:
|
with:
|
||||||
os: ${{ matrix.os }}
|
os: ${{ matrix.os }}
|
||||||
secrets:
|
secrets:
|
||||||
codecov_token: ${{ secrets.CODECOV_TOKEN }}
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
notify-clio:
|
notify-clio:
|
||||||
needs:
|
needs:
|
||||||
- should-run
|
- should-run
|
||||||
- build-test
|
- build-test
|
||||||
if: needs.should-run.outputs.go == 'true'
|
if: ${{ needs.should-run.outputs.go == 'true' && contains(fromJSON('["release", "master"]'), github.ref_name) }}
|
||||||
uses: ./.github/workflows/notify-clio.yml
|
uses: ./.github/workflows/reusable-notify-clio.yml
|
||||||
secrets:
|
secrets:
|
||||||
clio_notify_token: ${{ secrets.CLIO_NOTIFY_TOKEN }}
|
clio_notify_token: ${{ secrets.CLIO_NOTIFY_TOKEN }}
|
||||||
conan_remote_username: ${{ secrets.CONAN_REMOTE_USERNAME }}
|
conan_remote_username: ${{ secrets.CONAN_REMOTE_USERNAME }}
|
||||||
@@ -128,7 +126,6 @@ jobs:
|
|||||||
if: failure() || cancelled()
|
if: failure() || cancelled()
|
||||||
needs:
|
needs:
|
||||||
- build-test
|
- build-test
|
||||||
- check-format
|
|
||||||
- check-levelization
|
- check-levelization
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
47
.github/workflows/on-trigger.yml
vendored
47
.github/workflows/on-trigger.yml
vendored
@@ -9,20 +9,25 @@ name: Trigger
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- "develop"
|
||||||
- release
|
- "release*"
|
||||||
- master
|
- "master"
|
||||||
paths:
|
paths:
|
||||||
# These paths are unique to `on-trigger.yml`.
|
# These paths are unique to `on-trigger.yml`.
|
||||||
- ".github/workflows/check-missing-commits.yml"
|
- ".github/workflows/reusable-check-missing-commits.yml"
|
||||||
- ".github/workflows/on-trigger.yml"
|
- ".github/workflows/on-trigger.yml"
|
||||||
- ".github/workflows/publish-docs.yml"
|
- ".github/workflows/publish-docs.yml"
|
||||||
|
|
||||||
# Keep the paths below in sync with those in `on-pr.yml`.
|
# Keep the paths below in sync with those in `on-pr.yml`.
|
||||||
- ".github/actions/build-deps/**"
|
- ".github/actions/build-deps/**"
|
||||||
- ".github/actions/build-test/**"
|
- ".github/actions/build-test/**"
|
||||||
|
- ".github/actions/setup-conan/**"
|
||||||
- ".github/scripts/strategy-matrix/**"
|
- ".github/scripts/strategy-matrix/**"
|
||||||
- ".github/workflows/build-test.yml"
|
- ".github/workflows/reusable-build.yml"
|
||||||
|
- ".github/workflows/reusable-build-test-config.yml"
|
||||||
|
- ".github/workflows/reusable-build-test.yml"
|
||||||
|
- ".github/workflows/reusable-strategy-matrix.yml"
|
||||||
|
- ".github/workflows/reusable-test.yml"
|
||||||
- ".codecov.yml"
|
- ".codecov.yml"
|
||||||
- "cmake/**"
|
- "cmake/**"
|
||||||
- "conan/**"
|
- "conan/**"
|
||||||
@@ -41,25 +46,16 @@ on:
|
|||||||
schedule:
|
schedule:
|
||||||
- cron: "32 6 * * 1-5"
|
- cron: "32 6 * * 1-5"
|
||||||
|
|
||||||
# Run when manually triggered via the GitHub UI or API. If `force_upload` is
|
# Run when manually triggered via the GitHub UI or API.
|
||||||
# true, then the dependencies that were missing (`force_rebuild` is false) or
|
|
||||||
# rebuilt (`force_rebuild` is true) will be uploaded, overwriting existing
|
|
||||||
# dependencies if needed.
|
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
|
||||||
dependencies_force_build:
|
|
||||||
description: "Force building of all dependencies."
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
dependencies_force_upload:
|
|
||||||
description: "Force uploading of all dependencies."
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
# When a PR is merged into the develop branch it will be assigned a unique
|
||||||
|
# group identifier, so execution will continue even if another PR is merged
|
||||||
|
# while it is still running. In all other cases the group identifier is shared
|
||||||
|
# per branch, so that any in-progress runs are cancelled when a new commit is
|
||||||
|
# pushed.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.ref == 'refs/heads/develop' && github.sha || github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
@@ -69,15 +65,16 @@ defaults:
|
|||||||
jobs:
|
jobs:
|
||||||
check-missing-commits:
|
check-missing-commits:
|
||||||
if: ${{ github.event_name == 'push' && github.ref_type == 'branch' && contains(fromJSON('["develop", "release"]'), github.ref_name) }}
|
if: ${{ github.event_name == 'push' && github.ref_type == 'branch' && contains(fromJSON('["develop", "release"]'), github.ref_name) }}
|
||||||
uses: ./.github/workflows/check-missing-commits.yml
|
uses: ./.github/workflows/reusable-check-missing-commits.yml
|
||||||
|
|
||||||
build-test:
|
build-test:
|
||||||
uses: ./.github/workflows/build-test.yml
|
uses: ./.github/workflows/reusable-build-test.yml
|
||||||
strategy:
|
strategy:
|
||||||
|
fail-fast: ${{ github.event_name == 'merge_group' }}
|
||||||
matrix:
|
matrix:
|
||||||
os: [linux, macos, windows]
|
os: [linux, macos, windows]
|
||||||
with:
|
with:
|
||||||
os: ${{ matrix.os }}
|
os: ${{ matrix.os }}
|
||||||
strategy_matrix: "minimal"
|
strategy_matrix: ${{ github.event_name == 'schedule' && 'all' || 'minimal' }}
|
||||||
secrets:
|
secrets:
|
||||||
codecov_token: ${{ secrets.CODECOV_TOKEN }}
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|||||||
15
.github/workflows/pre-commit.yml
vendored
Normal file
15
.github/workflows/pre-commit.yml
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
name: Run pre-commit hooks
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: [develop, release, master]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Call the workflow in the XRPLF/actions repo that runs the pre-commit hooks.
|
||||||
|
run-hooks:
|
||||||
|
uses: XRPLF/actions/.github/workflows/pre-commit.yml@34790936fae4c6c751f62ec8c06696f9c1a5753a
|
||||||
|
with:
|
||||||
|
runs_on: ubuntu-latest
|
||||||
|
container: '{ "image": "ghcr.io/xrplf/ci/tools-rippled-pre-commit:sha-a8c7be1" }'
|
||||||
20
.github/workflows/publish-docs.yml
vendored
20
.github/workflows/publish-docs.yml
vendored
@@ -23,16 +23,24 @@ defaults:
|
|||||||
|
|
||||||
env:
|
env:
|
||||||
BUILD_DIR: .build
|
BUILD_DIR: .build
|
||||||
|
NPROC_SUBTRACT: 2
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: ghcr.io/xrplf/ci/tools-rippled-documentation
|
container: ghcr.io/xrplf/ci/tools-rippled-documentation:sha-a8c7be1
|
||||||
permissions:
|
permissions:
|
||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
|
|
||||||
|
- name: Get number of processors
|
||||||
|
uses: XRPLF/actions/.github/actions/get-nproc@046b1620f6bfd6cd0985dc82c3df02786801fe0a
|
||||||
|
id: nproc
|
||||||
|
with:
|
||||||
|
subtract: ${{ env.NPROC_SUBTRACT }}
|
||||||
|
|
||||||
- name: Check configuration
|
- name: Check configuration
|
||||||
run: |
|
run: |
|
||||||
echo 'Checking path.'
|
echo 'Checking path.'
|
||||||
@@ -46,12 +54,16 @@ jobs:
|
|||||||
|
|
||||||
echo 'Checking Doxygen version.'
|
echo 'Checking Doxygen version.'
|
||||||
doxygen --version
|
doxygen --version
|
||||||
|
|
||||||
- name: Build documentation
|
- name: Build documentation
|
||||||
|
env:
|
||||||
|
BUILD_NPROC: ${{ steps.nproc.outputs.nproc }}
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ${{ env.BUILD_DIR }}
|
mkdir -p "${BUILD_DIR}"
|
||||||
cd ${{ env.BUILD_DIR }}
|
cd "${BUILD_DIR}"
|
||||||
cmake -Donly_docs=ON ..
|
cmake -Donly_docs=ON ..
|
||||||
cmake --build . --target docs --parallel $(nproc)
|
cmake --build . --target docs --parallel ${BUILD_NPROC}
|
||||||
|
|
||||||
- name: Publish documentation
|
- name: Publish documentation
|
||||||
if: ${{ github.ref_type == 'branch' && github.ref_name == github.event.repository.default_branch }}
|
if: ${{ github.ref_type == 'branch' && github.ref_name == github.event.repository.default_branch }}
|
||||||
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
|
uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0
|
||||||
|
|||||||
213
.github/workflows/reusable-build-test-config.yml
vendored
Normal file
213
.github/workflows/reusable-build-test-config.yml
vendored
Normal file
@@ -0,0 +1,213 @@
|
|||||||
|
name: Build and test configuration
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
build_dir:
|
||||||
|
description: "The directory where to build."
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
build_only:
|
||||||
|
description: 'Whether to only build or to build and test the code ("true", "false").'
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
build_type:
|
||||||
|
description: 'The build type to use ("Debug", "Release").'
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
|
||||||
|
cmake_args:
|
||||||
|
description: "Additional arguments to pass to CMake."
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: ""
|
||||||
|
|
||||||
|
cmake_target:
|
||||||
|
description: "The CMake target to build."
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
|
||||||
|
runs_on:
|
||||||
|
description: Runner to run the job on as a JSON string
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
image:
|
||||||
|
description: "The image to run in (leave empty to run natively)"
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
config_name:
|
||||||
|
description: "The configuration string (used for naming artifacts and such)."
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
nproc_subtract:
|
||||||
|
description: "The number of processors to subtract when calculating parallelism."
|
||||||
|
required: false
|
||||||
|
type: number
|
||||||
|
default: 2
|
||||||
|
|
||||||
|
secrets:
|
||||||
|
CODECOV_TOKEN:
|
||||||
|
description: "The Codecov token to use for uploading coverage reports."
|
||||||
|
required: true
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-test:
|
||||||
|
name: ${{ inputs.config_name }}
|
||||||
|
runs-on: ${{ fromJSON(inputs.runs_on) }}
|
||||||
|
container: ${{ inputs.image != '' && inputs.image || null }}
|
||||||
|
timeout-minutes: 60
|
||||||
|
env:
|
||||||
|
ENABLED_VOIDSTAR: ${{ contains(inputs.cmake_args, '-Dvoidstar=ON') }}
|
||||||
|
ENABLED_COVERAGE: ${{ contains(inputs.cmake_args, '-Dcoverage=ON') }}
|
||||||
|
steps:
|
||||||
|
- name: Cleanup workspace
|
||||||
|
if: ${{ runner.os == 'macOS' }}
|
||||||
|
uses: XRPLF/actions/.github/actions/cleanup-workspace@3f044c7478548e3c32ff68980eeb36ece02b364e
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
|
|
||||||
|
- name: Prepare runner
|
||||||
|
uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
|
||||||
|
with:
|
||||||
|
disable_ccache: false
|
||||||
|
|
||||||
|
- name: Print build environment
|
||||||
|
uses: ./.github/actions/print-env
|
||||||
|
|
||||||
|
- name: Get number of processors
|
||||||
|
uses: XRPLF/actions/.github/actions/get-nproc@046b1620f6bfd6cd0985dc82c3df02786801fe0a
|
||||||
|
id: nproc
|
||||||
|
with:
|
||||||
|
subtract: ${{ inputs.nproc_subtract }}
|
||||||
|
|
||||||
|
- name: Setup Conan
|
||||||
|
uses: ./.github/actions/setup-conan
|
||||||
|
|
||||||
|
- name: Build dependencies
|
||||||
|
uses: ./.github/actions/build-deps
|
||||||
|
with:
|
||||||
|
build_dir: ${{ inputs.build_dir }}
|
||||||
|
build_nproc: ${{ steps.nproc.outputs.nproc }}
|
||||||
|
build_type: ${{ inputs.build_type }}
|
||||||
|
# Set the verbosity to "quiet" for Windows to avoid an excessive
|
||||||
|
# amount of logs. For other OSes, the "verbose" logs are more useful.
|
||||||
|
log_verbosity: ${{ runner.os == 'Windows' && 'quiet' || 'verbose' }}
|
||||||
|
|
||||||
|
- name: Configure CMake
|
||||||
|
working-directory: ${{ inputs.build_dir }}
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: ${{ inputs.build_type }}
|
||||||
|
CMAKE_ARGS: ${{ inputs.cmake_args }}
|
||||||
|
run: |
|
||||||
|
cmake \
|
||||||
|
-G '${{ runner.os == 'Windows' && 'Visual Studio 17 2022' || 'Ninja' }}' \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \
|
||||||
|
${CMAKE_ARGS} \
|
||||||
|
..
|
||||||
|
|
||||||
|
- name: Build the binary
|
||||||
|
working-directory: ${{ inputs.build_dir }}
|
||||||
|
env:
|
||||||
|
BUILD_NPROC: ${{ steps.nproc.outputs.nproc }}
|
||||||
|
BUILD_TYPE: ${{ inputs.build_type }}
|
||||||
|
CMAKE_TARGET: ${{ inputs.cmake_target }}
|
||||||
|
run: |
|
||||||
|
cmake \
|
||||||
|
--build . \
|
||||||
|
--config "${BUILD_TYPE}" \
|
||||||
|
--parallel "${BUILD_NPROC}" \
|
||||||
|
--target "${CMAKE_TARGET}"
|
||||||
|
|
||||||
|
- name: Upload rippled artifact (Linux)
|
||||||
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
||||||
|
env:
|
||||||
|
BUILD_DIR: ${{ inputs.build_dir }}
|
||||||
|
with:
|
||||||
|
name: rippled-${{ inputs.config_name }}
|
||||||
|
path: ${{ env.BUILD_DIR }}/rippled
|
||||||
|
retention-days: 3
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Check linking (Linux)
|
||||||
|
if: ${{ runner.os == 'Linux' }}
|
||||||
|
working-directory: ${{ inputs.build_dir }}
|
||||||
|
run: |
|
||||||
|
ldd ./rippled
|
||||||
|
if [ "$(ldd ./rippled | grep -E '(libstdc\+\+|libgcc)' | wc -l)" -eq 0 ]; then
|
||||||
|
echo 'The binary is statically linked.'
|
||||||
|
else
|
||||||
|
echo 'The binary is dynamically linked.'
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Verify presence of instrumentation (Linux)
|
||||||
|
if: ${{ runner.os == 'Linux' && env.ENABLED_VOIDSTAR == 'true' }}
|
||||||
|
working-directory: ${{ inputs.build_dir }}
|
||||||
|
run: |
|
||||||
|
./rippled --version | grep libvoidstar
|
||||||
|
|
||||||
|
- name: Run the separate tests
|
||||||
|
if: ${{ !inputs.build_only }}
|
||||||
|
working-directory: ${{ inputs.build_dir }}
|
||||||
|
# Windows locks some of the build files while running tests, and parallel jobs can collide
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: ${{ inputs.build_type }}
|
||||||
|
PARALLELISM: ${{ runner.os == 'Windows' && '1' || steps.nproc.outputs.nproc }}
|
||||||
|
run: |
|
||||||
|
ctest \
|
||||||
|
--output-on-failure \
|
||||||
|
-C "${BUILD_TYPE}" \
|
||||||
|
-j "${PARALLELISM}"
|
||||||
|
|
||||||
|
- name: Run the embedded tests
|
||||||
|
if: ${{ !inputs.build_only }}
|
||||||
|
working-directory: ${{ runner.os == 'Windows' && format('{0}/{1}', inputs.build_dir, inputs.build_type) || inputs.build_dir }}
|
||||||
|
env:
|
||||||
|
BUILD_NPROC: ${{ steps.nproc.outputs.nproc }}
|
||||||
|
run: |
|
||||||
|
./rippled --unittest --unittest-jobs "${BUILD_NPROC}"
|
||||||
|
|
||||||
|
- name: Debug failure (Linux)
|
||||||
|
if: ${{ failure() && runner.os == 'Linux' && !inputs.build_only }}
|
||||||
|
run: |
|
||||||
|
echo "IPv4 local port range:"
|
||||||
|
cat /proc/sys/net/ipv4/ip_local_port_range
|
||||||
|
echo "Netstat:"
|
||||||
|
netstat -an
|
||||||
|
|
||||||
|
- name: Prepare coverage report
|
||||||
|
if: ${{ !inputs.build_only && env.ENABLED_COVERAGE == 'true' }}
|
||||||
|
working-directory: ${{ inputs.build_dir }}
|
||||||
|
env:
|
||||||
|
BUILD_NPROC: ${{ steps.nproc.outputs.nproc }}
|
||||||
|
BUILD_TYPE: ${{ inputs.build_type }}
|
||||||
|
run: |
|
||||||
|
cmake \
|
||||||
|
--build . \
|
||||||
|
--config "${BUILD_TYPE}" \
|
||||||
|
--parallel "${BUILD_NPROC}" \
|
||||||
|
--target coverage
|
||||||
|
|
||||||
|
- name: Upload coverage report
|
||||||
|
if: ${{ github.repository_owner == 'XRPLF' && !inputs.build_only && env.ENABLED_COVERAGE == 'true' }}
|
||||||
|
uses: codecov/codecov-action@18283e04ce6e62d37312384ff67231eb8fd56d24 # v5.4.3
|
||||||
|
with:
|
||||||
|
disable_search: true
|
||||||
|
disable_telem: true
|
||||||
|
fail_ci_if_error: true
|
||||||
|
files: ${{ inputs.build_dir }}/coverage.xml
|
||||||
|
plugins: noop
|
||||||
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
verbose: true
|
||||||
58
.github/workflows/reusable-build-test.yml
vendored
Normal file
58
.github/workflows/reusable-build-test.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# This workflow builds and tests the binary for various configurations.
|
||||||
|
name: Build and test
|
||||||
|
|
||||||
|
# This workflow can only be triggered by other workflows. Note that the
|
||||||
|
# workflow_call event does not support the 'choice' input type, see
|
||||||
|
# https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#onworkflow_callinputsinput_idtype,
|
||||||
|
# so we use 'string' instead.
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
build_dir:
|
||||||
|
description: "The directory where to build."
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: ".build"
|
||||||
|
os:
|
||||||
|
description: 'The operating system to use for the build ("linux", "macos", "windows").'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
strategy_matrix:
|
||||||
|
# TODO: Support additional strategies, e.g. "ubuntu" for generating all Ubuntu configurations.
|
||||||
|
description: 'The strategy matrix to use for generating the configurations ("minimal", "all").'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: "minimal"
|
||||||
|
secrets:
|
||||||
|
CODECOV_TOKEN:
|
||||||
|
description: "The Codecov token to use for uploading coverage reports."
|
||||||
|
required: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Generate the strategy matrix to be used by the following job.
|
||||||
|
generate-matrix:
|
||||||
|
uses: ./.github/workflows/reusable-strategy-matrix.yml
|
||||||
|
with:
|
||||||
|
os: ${{ inputs.os }}
|
||||||
|
strategy_matrix: ${{ inputs.strategy_matrix }}
|
||||||
|
|
||||||
|
# Build and test the binary for each configuration.
|
||||||
|
build-test-config:
|
||||||
|
needs:
|
||||||
|
- generate-matrix
|
||||||
|
uses: ./.github/workflows/reusable-build-test-config.yml
|
||||||
|
strategy:
|
||||||
|
fail-fast: ${{ github.event_name == 'merge_group' }}
|
||||||
|
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
|
||||||
|
max-parallel: 10
|
||||||
|
with:
|
||||||
|
build_dir: ${{ inputs.build_dir }}
|
||||||
|
build_only: ${{ matrix.build_only }}
|
||||||
|
build_type: ${{ matrix.build_type }}
|
||||||
|
cmake_args: ${{ matrix.cmake_args }}
|
||||||
|
cmake_target: ${{ matrix.cmake_target }}
|
||||||
|
runs_on: ${{ toJSON(matrix.architecture.runner) }}
|
||||||
|
image: ${{ contains(matrix.architecture.platform, 'linux') && format('ghcr.io/xrplf/ci/{0}-{1}:{2}-{3}-sha-{4}', matrix.os.distro_name, matrix.os.distro_version, matrix.os.compiler_name, matrix.os.compiler_version, matrix.os.image_sha) || '' }}
|
||||||
|
config_name: ${{ matrix.config_name }}
|
||||||
|
secrets:
|
||||||
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
@@ -40,47 +40,52 @@ jobs:
|
|||||||
upload:
|
upload:
|
||||||
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
|
if: ${{ github.event.pull_request.head.repo.full_name == github.repository }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: ghcr.io/xrplf/ci/ubuntu-noble:gcc-13
|
container: ghcr.io/xrplf/ci/ubuntu-noble:gcc-13-sha-5dd7158
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
- name: Generate outputs
|
- name: Generate outputs
|
||||||
id: generate
|
id: generate
|
||||||
|
env:
|
||||||
|
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||||
run: |
|
run: |
|
||||||
echo 'Generating user and channel.'
|
echo 'Generating user and channel.'
|
||||||
echo "user=clio" >> "${GITHUB_OUTPUT}"
|
echo "user=clio" >> "${GITHUB_OUTPUT}"
|
||||||
echo "channel=pr_${{ github.event.pull_request.number }}" >> "${GITHUB_OUTPUT}"
|
echo "channel=pr_${PR_NUMBER}" >> "${GITHUB_OUTPUT}"
|
||||||
echo 'Extracting version.'
|
echo 'Extracting version.'
|
||||||
echo "version=$(cat src/libxrpl/protocol/BuildInfo.cpp | grep "versionString =" | awk -F '"' '{print $2}')" >> "${GITHUB_OUTPUT}"
|
echo "version=$(cat src/libxrpl/protocol/BuildInfo.cpp | grep "versionString =" | awk -F '"' '{print $2}')" >> "${GITHUB_OUTPUT}"
|
||||||
- name: Calculate conan reference
|
- name: Calculate conan reference
|
||||||
id: conan_ref
|
id: conan_ref
|
||||||
run: |
|
run: |
|
||||||
echo "conan_ref=${{ steps.generate.outputs.version }}@${{ steps.generate.outputs.user }}/${{ steps.generate.outputs.channel }}" >> "${GITHUB_OUTPUT}"
|
echo "conan_ref=${{ steps.generate.outputs.version }}@${{ steps.generate.outputs.user }}/${{ steps.generate.outputs.channel }}" >> "${GITHUB_OUTPUT}"
|
||||||
|
|
||||||
- name: Set up Conan
|
- name: Set up Conan
|
||||||
uses: ./.github/actions/setup-conan
|
uses: ./.github/actions/setup-conan
|
||||||
with:
|
with:
|
||||||
conan_remote_name: ${{ inputs.conan_remote_name }}
|
conan_remote_name: ${{ inputs.conan_remote_name }}
|
||||||
conan_remote_url: ${{ inputs.conan_remote_url }}
|
conan_remote_url: ${{ inputs.conan_remote_url }}
|
||||||
|
|
||||||
- name: Log into Conan remote
|
- name: Log into Conan remote
|
||||||
run: conan remote login ${{ inputs.conan_remote_name }} "${{ secrets.conan_remote_username }}" --password "${{ secrets.conan_remote_password }}"
|
env:
|
||||||
|
CONAN_REMOTE_NAME: ${{ inputs.conan_remote_name }}
|
||||||
|
run: conan remote login "${CONAN_REMOTE_NAME}" "${{ secrets.conan_remote_username }}" --password "${{ secrets.conan_remote_password }}"
|
||||||
- name: Upload package
|
- name: Upload package
|
||||||
|
env:
|
||||||
|
CONAN_REMOTE_NAME: ${{ inputs.conan_remote_name }}
|
||||||
run: |
|
run: |
|
||||||
conan export --user=${{ steps.generate.outputs.user }} --channel=${{ steps.generate.outputs.channel }} .
|
conan export --user=${{ steps.generate.outputs.user }} --channel=${{ steps.generate.outputs.channel }} .
|
||||||
conan upload --confirm --check --remote=${{ inputs.conan_remote_name }} xrpl/${{ steps.conan_ref.outputs.conan_ref }}
|
conan upload --confirm --check --remote="${CONAN_REMOTE_NAME}" xrpl/${{ steps.conan_ref.outputs.conan_ref }}
|
||||||
outputs:
|
outputs:
|
||||||
conan_ref: ${{ steps.conan_ref.outputs.conan_ref }}
|
conan_ref: ${{ steps.conan_ref.outputs.conan_ref }}
|
||||||
|
|
||||||
notify:
|
notify:
|
||||||
needs: upload
|
needs: upload
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.clio_notify_token }}
|
|
||||||
steps:
|
steps:
|
||||||
- name: Notify Clio
|
- name: Notify Clio
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ secrets.clio_notify_token }}
|
||||||
|
PR_URL: ${{ github.event.pull_request.html_url }}
|
||||||
run: |
|
run: |
|
||||||
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \
|
gh api --method POST -H "Accept: application/vnd.github+json" -H "X-GitHub-Api-Version: 2022-11-28" \
|
||||||
/repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \
|
/repos/xrplf/clio/dispatches -f "event_type=check_libxrpl" \
|
||||||
-F "client_payload[conan_ref]=${{ needs.upload.outputs.conan_ref }}" \
|
-F "client_payload[conan_ref]=${{ needs.upload.outputs.conan_ref }}" \
|
||||||
-F "client_payload[pr_url]=${{ github.event.pull_request.html_url }}"
|
-F "client_payload[pr_url]=${PR_URL}"
|
||||||
@@ -18,6 +18,10 @@ on:
|
|||||||
description: "The generated strategy matrix."
|
description: "The generated strategy matrix."
|
||||||
value: ${{ jobs.generate-matrix.outputs.matrix }}
|
value: ${{ jobs.generate-matrix.outputs.matrix }}
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
generate-matrix:
|
generate-matrix:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -35,4 +39,7 @@ jobs:
|
|||||||
- name: Generate strategy matrix
|
- name: Generate strategy matrix
|
||||||
working-directory: .github/scripts/strategy-matrix
|
working-directory: .github/scripts/strategy-matrix
|
||||||
id: generate
|
id: generate
|
||||||
run: ./generate.py ${{ inputs.strategy_matrix == 'all' && '--all' || '' }} ${{ inputs.os != '' && format('--config={0}.json', inputs.os) || '' }} >> "${GITHUB_OUTPUT}"
|
env:
|
||||||
|
GENERATE_CONFIG: ${{ inputs.os != '' && format('--config={0}.json', inputs.os) || '' }}
|
||||||
|
GENERATE_OPTION: ${{ inputs.strategy_matrix == 'all' && '--all' || '' }}
|
||||||
|
run: ./generate.py ${GENERATE_OPTION} ${GENERATE_CONFIG} >> "${GITHUB_OUTPUT}"
|
||||||
|
|||||||
52
.github/workflows/upload-conan-deps.yml
vendored
52
.github/workflows/upload-conan-deps.yml
vendored
@@ -24,25 +24,34 @@ on:
|
|||||||
branches: [develop]
|
branches: [develop]
|
||||||
paths:
|
paths:
|
||||||
- .github/workflows/upload-conan-deps.yml
|
- .github/workflows/upload-conan-deps.yml
|
||||||
|
|
||||||
- .github/workflows/reusable-strategy-matrix.yml
|
- .github/workflows/reusable-strategy-matrix.yml
|
||||||
|
|
||||||
- .github/actions/build-deps/action.yml
|
- .github/actions/build-deps/action.yml
|
||||||
|
- .github/actions/setup-conan/action.yml
|
||||||
- ".github/scripts/strategy-matrix/**"
|
- ".github/scripts/strategy-matrix/**"
|
||||||
|
|
||||||
- conanfile.py
|
- conanfile.py
|
||||||
- conan.lock
|
- conan.lock
|
||||||
|
|
||||||
|
env:
|
||||||
|
CONAN_REMOTE_NAME: xrplf
|
||||||
|
CONAN_REMOTE_URL: https://conan.ripplex.io
|
||||||
|
NPROC_SUBTRACT: 2
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
# Generate the strategy matrix to be used by the following job.
|
||||||
generate-matrix:
|
generate-matrix:
|
||||||
uses: ./.github/workflows/reusable-strategy-matrix.yml
|
uses: ./.github/workflows/reusable-strategy-matrix.yml
|
||||||
with:
|
with:
|
||||||
strategy_matrix: ${{ github.event_name == 'pull_request' && 'minimal' || 'all' }}
|
strategy_matrix: ${{ github.event_name == 'pull_request' && 'minimal' || 'all' }}
|
||||||
|
|
||||||
|
# Build and upload the dependencies for each configuration.
|
||||||
run-upload-conan-deps:
|
run-upload-conan-deps:
|
||||||
needs:
|
needs:
|
||||||
- generate-matrix
|
- generate-matrix
|
||||||
@@ -51,33 +60,52 @@ jobs:
|
|||||||
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
|
matrix: ${{ fromJson(needs.generate-matrix.outputs.matrix) }}
|
||||||
max-parallel: 10
|
max-parallel: 10
|
||||||
runs-on: ${{ matrix.architecture.runner }}
|
runs-on: ${{ matrix.architecture.runner }}
|
||||||
container: ${{ contains(matrix.architecture.platform, 'linux') && format('ghcr.io/xrplf/ci/{0}-{1}:{2}-{3}', matrix.os.distro_name, matrix.os.distro_version, matrix.os.compiler_name, matrix.os.compiler_version) || null }}
|
container: ${{ contains(matrix.architecture.platform, 'linux') && format('ghcr.io/xrplf/ci/{0}-{1}:{2}-{3}-sha-{4}', matrix.os.distro_name, matrix.os.distro_version, matrix.os.compiler_name, matrix.os.compiler_version, matrix.os.image_sha) || null }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Cleanup workspace
|
- name: Cleanup workspace
|
||||||
if: ${{ runner.os == 'macOS' }}
|
if: ${{ runner.os == 'macOS' }}
|
||||||
uses: XRPLF/actions/.github/actions/cleanup-workspace@3f044c7478548e3c32ff68980eeb36ece02b364e
|
uses: XRPLF/actions/.github/actions/cleanup-workspace@3f044c7478548e3c32ff68980eeb36ece02b364e
|
||||||
|
|
||||||
- uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
|
||||||
|
|
||||||
- name: Prepare runner
|
- name: Prepare runner
|
||||||
uses: XRPLF/actions/.github/actions/prepare-runner@638e0dc11ea230f91bd26622fb542116bb5254d5
|
uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
|
||||||
with:
|
with:
|
||||||
disable_ccache: false
|
disable_ccache: false
|
||||||
|
|
||||||
|
- name: Print build environment
|
||||||
|
uses: ./.github/actions/print-env
|
||||||
|
|
||||||
|
- name: Get number of processors
|
||||||
|
uses: XRPLF/actions/.github/actions/get-nproc@046b1620f6bfd6cd0985dc82c3df02786801fe0a
|
||||||
|
id: nproc
|
||||||
|
with:
|
||||||
|
subtract: ${{ env.NPROC_SUBTRACT }}
|
||||||
|
|
||||||
- name: Setup Conan
|
- name: Setup Conan
|
||||||
uses: ./.github/actions/setup-conan
|
uses: ./.github/actions/setup-conan
|
||||||
|
with:
|
||||||
|
conan_remote_name: ${{ env.CONAN_REMOTE_NAME }}
|
||||||
|
conan_remote_url: ${{ env.CONAN_REMOTE_URL }}
|
||||||
|
|
||||||
- name: Build dependencies
|
- name: Build dependencies
|
||||||
uses: ./.github/actions/build-deps
|
uses: ./.github/actions/build-deps
|
||||||
with:
|
with:
|
||||||
build_dir: .build
|
build_dir: .build
|
||||||
|
build_nproc: ${{ steps.nproc.outputs.nproc }}
|
||||||
build_type: ${{ matrix.build_type }}
|
build_type: ${{ matrix.build_type }}
|
||||||
force_build: ${{ github.event_name == 'schedule' || github.event.inputs.force_source_build == 'true' }}
|
force_build: ${{ github.event_name == 'schedule' || github.event.inputs.force_source_build == 'true' }}
|
||||||
|
# Set the verbosity to "quiet" for Windows to avoid an excessive
|
||||||
|
# amount of logs. For other OSes, the "verbose" logs are more useful.
|
||||||
|
log_verbosity: ${{ runner.os == 'Windows' && 'quiet' || 'verbose' }}
|
||||||
|
|
||||||
- name: Login to Conan
|
- name: Log into Conan remote
|
||||||
if: github.repository_owner == 'XRPLF' && github.event_name != 'pull_request'
|
if: ${{ github.repository_owner == 'XRPLF' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') }}
|
||||||
run: conan remote login -p ${{ secrets.CONAN_PASSWORD }} ${{ inputs.conan_remote_name }} ${{ secrets.CONAN_USERNAME }}
|
run: conan remote login "${CONAN_REMOTE_NAME}" "${{ secrets.CONAN_REMOTE_USERNAME }}" --password "${{ secrets.CONAN_REMOTE_PASSWORD }}"
|
||||||
|
|
||||||
- name: Upload Conan packages
|
- name: Upload Conan packages
|
||||||
if: github.repository_owner == 'XRPLF' && github.event_name != 'pull_request' && github.event_name != 'schedule'
|
if: ${{ github.repository_owner == 'XRPLF' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') }}
|
||||||
run: conan upload "*" -r=${{ inputs.conan_remote_name }} --confirm ${{ github.event.inputs.force_upload == 'true' && '--force' || '' }}
|
env:
|
||||||
|
FORCE_OPTION: ${{ github.event.inputs.force_upload == 'true' && '--force' || '' }}
|
||||||
|
run: conan upload "*" --remote="${CONAN_REMOTE_NAME}" --confirm ${FORCE_OPTION}
|
||||||
|
|||||||
62
BUILD.md
62
BUILD.md
@@ -39,17 +39,12 @@ found here](./docs/build/environment.md).
|
|||||||
|
|
||||||
- [Python 3.11](https://www.python.org/downloads/), or higher
|
- [Python 3.11](https://www.python.org/downloads/), or higher
|
||||||
- [Conan 2.17](https://conan.io/downloads.html)[^1], or higher
|
- [Conan 2.17](https://conan.io/downloads.html)[^1], or higher
|
||||||
- [CMake 3.22](https://cmake.org/download/)[^2], or higher
|
- [CMake 3.22](https://cmake.org/download/), or higher
|
||||||
|
|
||||||
[^1]:
|
[^1]:
|
||||||
It is possible to build with Conan 1.60+, but the instructions are
|
It is possible to build with Conan 1.60+, but the instructions are
|
||||||
significantly different, which is why we are not recommending it.
|
significantly different, which is why we are not recommending it.
|
||||||
|
|
||||||
[^2]:
|
|
||||||
CMake 4 is not yet supported by all dependencies required by this project.
|
|
||||||
If you are affected by this issue, follow [conan workaround for cmake
|
|
||||||
4](#workaround-for-cmake-4)
|
|
||||||
|
|
||||||
`rippled` is written in the C++20 dialect and includes the `<concepts>` header.
|
`rippled` is written in the C++20 dialect and includes the `<concepts>` header.
|
||||||
The [minimum compiler versions][2] required are:
|
The [minimum compiler versions][2] required are:
|
||||||
|
|
||||||
@@ -132,7 +127,7 @@ higher index than the default Conan Center remote, so it is consulted first. You
|
|||||||
can do this by running:
|
can do this by running:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
conan remote add --index 0 xrplf "https://conan.ripplex.io"
|
conan remote add --index 0 xrplf https://conan.ripplex.io
|
||||||
```
|
```
|
||||||
|
|
||||||
Alternatively, you can pull the patched recipes into the repository and use them
|
Alternatively, you can pull the patched recipes into the repository and use them
|
||||||
@@ -282,21 +277,6 @@ sed -i.bak -e 's|^arch=.*$|arch=x86_64|' $(conan config home)/profiles/default
|
|||||||
sed -i.bak -e 's|^compiler\.runtime=.*$|compiler.runtime=static|' $(conan config home)/profiles/default
|
sed -i.bak -e 's|^compiler\.runtime=.*$|compiler.runtime=static|' $(conan config home)/profiles/default
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Workaround for CMake 4
|
|
||||||
|
|
||||||
If your system CMake is version 4 rather than 3, you may have to configure Conan
|
|
||||||
profile to use CMake version 3 for dependencies, by adding the following two
|
|
||||||
lines to your profile:
|
|
||||||
|
|
||||||
```text
|
|
||||||
[tool_requires]
|
|
||||||
!cmake/*: cmake/[>=3 <4]
|
|
||||||
```
|
|
||||||
|
|
||||||
This will force Conan to download and use a locally cached CMake 3 version, and
|
|
||||||
is needed because some of the dependencies used by this project do not support
|
|
||||||
CMake 4.
|
|
||||||
|
|
||||||
#### Clang workaround for grpc
|
#### Clang workaround for grpc
|
||||||
|
|
||||||
If your compiler is clang, version 19 or later, or apple-clang, version 17 or
|
If your compiler is clang, version 19 or later, or apple-clang, version 17 or
|
||||||
@@ -479,12 +459,24 @@ It is implicitly used when running `conan` commands, you don't need to specify i
|
|||||||
|
|
||||||
You have to update this file every time you add a new dependency or change a revision or version of an existing dependency.
|
You have to update this file every time you add a new dependency or change a revision or version of an existing dependency.
|
||||||
|
|
||||||
To do that, run the following command in the repository root:
|
> [!NOTE]
|
||||||
|
> Conan uses local cache by default when creating a lockfile.
|
||||||
|
>
|
||||||
|
> To ensure, that lockfile creation works the same way on all developer machines, you should clear the local cache before creating a new lockfile.
|
||||||
|
|
||||||
|
To create a new lockfile, run the following commands in the repository root:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
conan remove '*' --confirm
|
||||||
|
rm conan.lock
|
||||||
|
# This ensure that xrplf remote is the first to be consulted
|
||||||
|
conan remote add --force --index 0 xrplf https://conan.ripplex.io
|
||||||
conan lock create . -o '&:jemalloc=True' -o '&:rocksdb=True'
|
conan lock create . -o '&:jemalloc=True' -o '&:rocksdb=True'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> If some dependencies are exclusive for some OS, you may need to run the last command for them adding `--profile:all <PROFILE>`.
|
||||||
|
|
||||||
## Coverage report
|
## Coverage report
|
||||||
|
|
||||||
The coverage report is intended for developers using compilers GCC
|
The coverage report is intended for developers using compilers GCC
|
||||||
@@ -503,18 +495,18 @@ A coverage report is created when the following steps are completed, in order:
|
|||||||
|
|
||||||
1. `rippled` binary built with instrumentation data, enabled by the `coverage`
|
1. `rippled` binary built with instrumentation data, enabled by the `coverage`
|
||||||
option mentioned above
|
option mentioned above
|
||||||
2. completed run of unit tests, which populates coverage capture data
|
2. completed one or more run of the unit tests, which populates coverage capture data
|
||||||
3. completed run of the `gcovr` tool (which internally invokes either `gcov` or `llvm-cov`)
|
3. completed run of the `gcovr` tool (which internally invokes either `gcov` or `llvm-cov`)
|
||||||
to assemble both instrumentation data and the coverage capture data into a coverage report
|
to assemble both instrumentation data and the coverage capture data into a coverage report
|
||||||
|
|
||||||
The above steps are automated into a single target `coverage`. The instrumented
|
The last step of the above is automated into a single target `coverage`. The instrumented
|
||||||
`rippled` binary can also be used for regular development or testing work, at
|
`rippled` binary can also be used for regular development or testing work, at
|
||||||
the cost of extra disk space utilization and a small performance hit
|
the cost of extra disk space utilization and a small performance hit
|
||||||
(to store coverage capture). In case of a spurious failure of unit tests, it is
|
(to store coverage capture data). Since `rippled` binary is simply a dependency of the
|
||||||
possible to re-run the `coverage` target without rebuilding the `rippled` binary
|
coverage report target, it is possible to re-run the `coverage` target without
|
||||||
(since it is simply a dependency of the coverage report target). It is also possible
|
rebuilding the `rippled` binary. Note, running of the unit tests before the `coverage`
|
||||||
to select only specific tests for the purpose of the coverage report, by setting
|
target is left to the developer. Each such run will append to the coverage data
|
||||||
the `coverage_test` variable in `cmake`
|
collected in the build directory.
|
||||||
|
|
||||||
The default coverage report format is `html-details`, but the user
|
The default coverage report format is `html-details`, but the user
|
||||||
can override it to any of the formats listed in `Builds/CMake/CodeCoverage.cmake`
|
can override it to any of the formats listed in `Builds/CMake/CodeCoverage.cmake`
|
||||||
@@ -523,11 +515,6 @@ to generate more than one format at a time by setting the `coverage_extra_args`
|
|||||||
variable in `cmake`. The specific command line used to run the `gcovr` tool will be
|
variable in `cmake`. The specific command line used to run the `gcovr` tool will be
|
||||||
displayed if the `CODE_COVERAGE_VERBOSE` variable is set.
|
displayed if the `CODE_COVERAGE_VERBOSE` variable is set.
|
||||||
|
|
||||||
By default, the code coverage tool runs parallel unit tests with `--unittest-jobs`
|
|
||||||
set to the number of available CPU cores. This may cause spurious test
|
|
||||||
errors on Apple. Developers can override the number of unit test jobs with
|
|
||||||
the `coverage_test_parallelism` variable in `cmake`.
|
|
||||||
|
|
||||||
Example use with some cmake variables set:
|
Example use with some cmake variables set:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -586,6 +573,11 @@ After any updates or changes to dependencies, you may need to do the following:
|
|||||||
4. [Regenerate lockfile](#conan-lockfile).
|
4. [Regenerate lockfile](#conan-lockfile).
|
||||||
5. Re-run [conan install](#build-and-test).
|
5. Re-run [conan install](#build-and-test).
|
||||||
|
|
||||||
|
#### ERROR: Package not resolved
|
||||||
|
|
||||||
|
If you're seeing an error like `ERROR: Package 'snappy/1.1.10' not resolved: Unable to find 'snappy/1.1.10#968fef506ff261592ec30c574d4a7809%1756234314.246' in remotes.`,
|
||||||
|
please add `xrplf` remote or re-run `conan export` for [patched recipes](#patched-recipes).
|
||||||
|
|
||||||
### `protobuf/port_def.inc` file not found
|
### `protobuf/port_def.inc` file not found
|
||||||
|
|
||||||
If `cmake --build .` results in an error due to a missing a protobuf file, then
|
If `cmake --build .` results in an error due to a missing a protobuf file, then
|
||||||
|
|||||||
@@ -1,21 +1,3 @@
|
|||||||
macro(group_sources_in source_dir curdir)
|
|
||||||
file(GLOB children RELATIVE ${source_dir}/${curdir}
|
|
||||||
${source_dir}/${curdir}/*)
|
|
||||||
foreach (child ${children})
|
|
||||||
if (IS_DIRECTORY ${source_dir}/${curdir}/${child})
|
|
||||||
group_sources_in(${source_dir} ${curdir}/${child})
|
|
||||||
else()
|
|
||||||
string(REPLACE "/" "\\" groupname ${curdir})
|
|
||||||
source_group(${groupname} FILES
|
|
||||||
${source_dir}/${curdir}/${child})
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
macro(group_sources curdir)
|
|
||||||
group_sources_in(${PROJECT_SOURCE_DIR} ${curdir})
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
macro (exclude_from_default target_)
|
macro (exclude_from_default target_)
|
||||||
set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_ALL ON)
|
set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_ALL ON)
|
||||||
set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
|
set_target_properties (${target_} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
|
||||||
|
|||||||
@@ -104,6 +104,14 @@
|
|||||||
# 2025-08-28, Bronek Kozicki
|
# 2025-08-28, Bronek Kozicki
|
||||||
# - fix "At least one COMMAND must be given" CMake warning from policy CMP0175
|
# - fix "At least one COMMAND must be given" CMake warning from policy CMP0175
|
||||||
#
|
#
|
||||||
|
# 2025-09-03, Jingchen Wu
|
||||||
|
# - remove the unused function append_coverage_compiler_flags and append_coverage_compiler_flags_to_target
|
||||||
|
# - add a new function add_code_coverage_to_target
|
||||||
|
# - remove some unused code
|
||||||
|
#
|
||||||
|
# 2025-11-11, Bronek Kozicki
|
||||||
|
# - make EXECUTABLE and EXECUTABLE_ARGS optional
|
||||||
|
#
|
||||||
# USAGE:
|
# USAGE:
|
||||||
#
|
#
|
||||||
# 1. Copy this file into your cmake modules path.
|
# 1. Copy this file into your cmake modules path.
|
||||||
@@ -112,10 +120,8 @@
|
|||||||
# using a CMake option() to enable it just optionally):
|
# using a CMake option() to enable it just optionally):
|
||||||
# include(CodeCoverage)
|
# include(CodeCoverage)
|
||||||
#
|
#
|
||||||
# 3. Append necessary compiler flags for all supported source files:
|
# 3. Append necessary compiler flags and linker flags for all supported source files:
|
||||||
# append_coverage_compiler_flags()
|
# add_code_coverage_to_target(<target> <PRIVATE|PUBLIC|INTERFACE>)
|
||||||
# Or for specific target:
|
|
||||||
# append_coverage_compiler_flags_to_target(YOUR_TARGET_NAME)
|
|
||||||
#
|
#
|
||||||
# 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og
|
# 3.a (OPTIONAL) Set appropriate optimization flags, e.g. -O0, -O1 or -Og
|
||||||
#
|
#
|
||||||
@@ -204,67 +210,69 @@ endforeach()
|
|||||||
|
|
||||||
set(COVERAGE_COMPILER_FLAGS "-g --coverage"
|
set(COVERAGE_COMPILER_FLAGS "-g --coverage"
|
||||||
CACHE INTERNAL "")
|
CACHE INTERNAL "")
|
||||||
|
|
||||||
|
set(COVERAGE_CXX_COMPILER_FLAGS "")
|
||||||
|
set(COVERAGE_C_COMPILER_FLAGS "")
|
||||||
|
set(COVERAGE_CXX_LINKER_FLAGS "")
|
||||||
|
set(COVERAGE_C_LINKER_FLAGS "")
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
|
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
|
||||||
include(CheckCXXCompilerFlag)
|
include(CheckCXXCompilerFlag)
|
||||||
include(CheckCCompilerFlag)
|
include(CheckCCompilerFlag)
|
||||||
|
include(CheckLinkerFlag)
|
||||||
|
|
||||||
|
set(COVERAGE_CXX_COMPILER_FLAGS ${COVERAGE_COMPILER_FLAGS})
|
||||||
|
set(COVERAGE_C_COMPILER_FLAGS ${COVERAGE_COMPILER_FLAGS})
|
||||||
|
set(COVERAGE_CXX_LINKER_FLAGS ${COVERAGE_COMPILER_FLAGS})
|
||||||
|
set(COVERAGE_C_LINKER_FLAGS ${COVERAGE_COMPILER_FLAGS})
|
||||||
|
|
||||||
check_cxx_compiler_flag(-fprofile-abs-path HAVE_cxx_fprofile_abs_path)
|
check_cxx_compiler_flag(-fprofile-abs-path HAVE_cxx_fprofile_abs_path)
|
||||||
if(HAVE_cxx_fprofile_abs_path)
|
if(HAVE_cxx_fprofile_abs_path)
|
||||||
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
|
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_CXX_COMPILER_FLAGS} -fprofile-abs-path")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
check_c_compiler_flag(-fprofile-abs-path HAVE_c_fprofile_abs_path)
|
check_c_compiler_flag(-fprofile-abs-path HAVE_c_fprofile_abs_path)
|
||||||
if(HAVE_c_fprofile_abs_path)
|
if(HAVE_c_fprofile_abs_path)
|
||||||
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
|
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_C_COMPILER_FLAGS} -fprofile-abs-path")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
check_linker_flag(CXX -fprofile-abs-path HAVE_cxx_linker_fprofile_abs_path)
|
||||||
|
if(HAVE_cxx_linker_fprofile_abs_path)
|
||||||
|
set(COVERAGE_CXX_LINKER_FLAGS "${COVERAGE_CXX_LINKER_FLAGS} -fprofile-abs-path")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
check_linker_flag(C -fprofile-abs-path HAVE_c_linker_fprofile_abs_path)
|
||||||
|
if(HAVE_c_linker_fprofile_abs_path)
|
||||||
|
set(COVERAGE_C_LINKER_FLAGS "${COVERAGE_C_LINKER_FLAGS} -fprofile-abs-path")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
check_cxx_compiler_flag(-fprofile-update=atomic HAVE_cxx_fprofile_update)
|
check_cxx_compiler_flag(-fprofile-update=atomic HAVE_cxx_fprofile_update)
|
||||||
if(HAVE_cxx_fprofile_update)
|
if(HAVE_cxx_fprofile_update)
|
||||||
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-update=atomic")
|
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_CXX_COMPILER_FLAGS} -fprofile-update=atomic")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
check_c_compiler_flag(-fprofile-update=atomic HAVE_c_fprofile_update)
|
check_c_compiler_flag(-fprofile-update=atomic HAVE_c_fprofile_update)
|
||||||
if(HAVE_c_fprofile_update)
|
if(HAVE_c_fprofile_update)
|
||||||
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-update=atomic")
|
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_C_COMPILER_FLAGS} -fprofile-update=atomic")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_Fortran_FLAGS_COVERAGE
|
check_linker_flag(CXX -fprofile-update=atomic HAVE_cxx_linker_fprofile_update)
|
||||||
${COVERAGE_COMPILER_FLAGS}
|
if(HAVE_cxx_linker_fprofile_update)
|
||||||
CACHE STRING "Flags used by the Fortran compiler during coverage builds."
|
set(COVERAGE_CXX_LINKER_FLAGS "${COVERAGE_CXX_LINKER_FLAGS} -fprofile-update=atomic")
|
||||||
FORCE )
|
endif()
|
||||||
set(CMAKE_CXX_FLAGS_COVERAGE
|
|
||||||
${COVERAGE_COMPILER_FLAGS}
|
check_linker_flag(C -fprofile-update=atomic HAVE_c_linker_fprofile_update)
|
||||||
CACHE STRING "Flags used by the C++ compiler during coverage builds."
|
if(HAVE_c_linker_fprofile_update)
|
||||||
FORCE )
|
set(COVERAGE_C_LINKER_FLAGS "${COVERAGE_C_LINKER_FLAGS} -fprofile-update=atomic")
|
||||||
set(CMAKE_C_FLAGS_COVERAGE
|
endif()
|
||||||
${COVERAGE_COMPILER_FLAGS}
|
|
||||||
CACHE STRING "Flags used by the C compiler during coverage builds."
|
endif()
|
||||||
FORCE )
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE
|
|
||||||
""
|
|
||||||
CACHE STRING "Flags used for linking binaries during coverage builds."
|
|
||||||
FORCE )
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE
|
|
||||||
""
|
|
||||||
CACHE STRING "Flags used by the shared libraries linker during coverage builds."
|
|
||||||
FORCE )
|
|
||||||
mark_as_advanced(
|
|
||||||
CMAKE_Fortran_FLAGS_COVERAGE
|
|
||||||
CMAKE_CXX_FLAGS_COVERAGE
|
|
||||||
CMAKE_C_FLAGS_COVERAGE
|
|
||||||
CMAKE_EXE_LINKER_FLAGS_COVERAGE
|
|
||||||
CMAKE_SHARED_LINKER_FLAGS_COVERAGE )
|
|
||||||
|
|
||||||
get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG))
|
if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG))
|
||||||
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
|
message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading")
|
||||||
endif() # NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG)
|
endif() # NOT (CMAKE_BUILD_TYPE STREQUAL "Debug" OR GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
|
|
||||||
link_libraries(gcov)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Defines a target for running and collection code coverage information
|
# Defines a target for running and collection code coverage information
|
||||||
# Builds dependencies, runs the given executable and outputs reports.
|
# Builds dependencies, runs the given executable and outputs reports.
|
||||||
# NOTE! The executable should always have a ZERO as exit code otherwise
|
# NOTE! The executable should always have a ZERO as exit code otherwise
|
||||||
@@ -312,6 +320,10 @@ function(setup_target_for_coverage_gcovr)
|
|||||||
set(Coverage_FORMAT xml)
|
set(Coverage_FORMAT xml)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(NOT DEFINED Coverage_EXECUTABLE AND DEFINED Coverage_EXECUTABLE_ARGS)
|
||||||
|
message(FATAL_ERROR "EXECUTABLE_ARGS must not be set if EXECUTABLE is not set")
|
||||||
|
endif()
|
||||||
|
|
||||||
if("--output" IN_LIST GCOVR_ADDITIONAL_ARGS)
|
if("--output" IN_LIST GCOVR_ADDITIONAL_ARGS)
|
||||||
message(FATAL_ERROR "Unsupported --output option detected in GCOVR_ADDITIONAL_ARGS! Aborting...")
|
message(FATAL_ERROR "Unsupported --output option detected in GCOVR_ADDITIONAL_ARGS! Aborting...")
|
||||||
else()
|
else()
|
||||||
@@ -393,17 +405,18 @@ function(setup_target_for_coverage_gcovr)
|
|||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
# Set up commands which will be run to generate coverage data
|
# Set up commands which will be run to generate coverage data
|
||||||
# Run tests
|
# If EXECUTABLE is not set, the user is expected to run the tests manually
|
||||||
|
# before running the coverage target NAME
|
||||||
|
if(DEFINED Coverage_EXECUTABLE)
|
||||||
set(GCOVR_EXEC_TESTS_CMD
|
set(GCOVR_EXEC_TESTS_CMD
|
||||||
${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
|
${Coverage_EXECUTABLE} ${Coverage_EXECUTABLE_ARGS}
|
||||||
)
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Create folder
|
# Create folder
|
||||||
if(DEFINED GCOVR_CREATE_FOLDER)
|
if(DEFINED GCOVR_CREATE_FOLDER)
|
||||||
set(GCOVR_FOLDER_CMD
|
set(GCOVR_FOLDER_CMD
|
||||||
${CMAKE_COMMAND} -E make_directory ${GCOVR_CREATE_FOLDER})
|
${CMAKE_COMMAND} -E make_directory ${GCOVR_CREATE_FOLDER})
|
||||||
else()
|
|
||||||
set(GCOVR_FOLDER_CMD echo) # dummy
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Running gcovr
|
# Running gcovr
|
||||||
@@ -420,11 +433,13 @@ function(setup_target_for_coverage_gcovr)
|
|||||||
if(CODE_COVERAGE_VERBOSE)
|
if(CODE_COVERAGE_VERBOSE)
|
||||||
message(STATUS "Executed command report")
|
message(STATUS "Executed command report")
|
||||||
|
|
||||||
|
if(NOT "${GCOVR_EXEC_TESTS_CMD}" STREQUAL "")
|
||||||
message(STATUS "Command to run tests: ")
|
message(STATUS "Command to run tests: ")
|
||||||
string(REPLACE ";" " " GCOVR_EXEC_TESTS_CMD_SPACED "${GCOVR_EXEC_TESTS_CMD}")
|
string(REPLACE ";" " " GCOVR_EXEC_TESTS_CMD_SPACED "${GCOVR_EXEC_TESTS_CMD}")
|
||||||
message(STATUS "${GCOVR_EXEC_TESTS_CMD_SPACED}")
|
message(STATUS "${GCOVR_EXEC_TESTS_CMD_SPACED}")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT GCOVR_FOLDER_CMD STREQUAL "echo")
|
if(NOT "${GCOVR_FOLDER_CMD}" STREQUAL "")
|
||||||
message(STATUS "Command to create a folder: ")
|
message(STATUS "Command to create a folder: ")
|
||||||
string(REPLACE ";" " " GCOVR_FOLDER_CMD_SPACED "${GCOVR_FOLDER_CMD}")
|
string(REPLACE ";" " " GCOVR_FOLDER_CMD_SPACED "${GCOVR_FOLDER_CMD}")
|
||||||
message(STATUS "${GCOVR_FOLDER_CMD_SPACED}")
|
message(STATUS "${GCOVR_FOLDER_CMD_SPACED}")
|
||||||
@@ -454,18 +469,19 @@ function(setup_target_for_coverage_gcovr)
|
|||||||
)
|
)
|
||||||
endfunction() # setup_target_for_coverage_gcovr
|
endfunction() # setup_target_for_coverage_gcovr
|
||||||
|
|
||||||
function(append_coverage_compiler_flags)
|
function(add_code_coverage_to_target name scope)
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
|
separate_arguments(COVERAGE_CXX_COMPILER_FLAGS NATIVE_COMMAND "${COVERAGE_CXX_COMPILER_FLAGS}")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
|
separate_arguments(COVERAGE_C_COMPILER_FLAGS NATIVE_COMMAND "${COVERAGE_C_COMPILER_FLAGS}")
|
||||||
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE)
|
separate_arguments(COVERAGE_CXX_LINKER_FLAGS NATIVE_COMMAND "${COVERAGE_CXX_LINKER_FLAGS}")
|
||||||
message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}")
|
separate_arguments(COVERAGE_C_LINKER_FLAGS NATIVE_COMMAND "${COVERAGE_C_LINKER_FLAGS}")
|
||||||
endfunction() # append_coverage_compiler_flags
|
|
||||||
|
|
||||||
# Setup coverage for specific library
|
# Add compiler options to the target
|
||||||
function(append_coverage_compiler_flags_to_target name)
|
target_compile_options(${name} ${scope}
|
||||||
separate_arguments(_flag_list NATIVE_COMMAND "${COVERAGE_COMPILER_FLAGS}")
|
$<$<COMPILE_LANGUAGE:CXX>:${COVERAGE_CXX_COMPILER_FLAGS}>
|
||||||
target_compile_options(${name} PRIVATE ${_flag_list})
|
$<$<COMPILE_LANGUAGE:C>:${COVERAGE_C_COMPILER_FLAGS}>)
|
||||||
if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
|
|
||||||
target_link_libraries(${name} PRIVATE gcov)
|
target_link_libraries (${name} ${scope}
|
||||||
endif()
|
$<$<LINK_LANGUAGE:CXX>:${COVERAGE_CXX_LINKER_FLAGS} gcov>
|
||||||
endfunction()
|
$<$<LINK_LANGUAGE:C>:${COVERAGE_C_LINKER_FLAGS} gcov>
|
||||||
|
)
|
||||||
|
endfunction() # add_code_coverage_to_target
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ if (static OR MSVC)
|
|||||||
else ()
|
else ()
|
||||||
set (Boost_USE_STATIC_RUNTIME OFF)
|
set (Boost_USE_STATIC_RUNTIME OFF)
|
||||||
endif ()
|
endif ()
|
||||||
find_dependency (Boost 1.70
|
find_dependency (Boost
|
||||||
COMPONENTS
|
COMPONENTS
|
||||||
chrono
|
chrono
|
||||||
container
|
container
|
||||||
@@ -52,5 +52,3 @@ if (TARGET ZLIB::ZLIB)
|
|||||||
set_target_properties(OpenSSL::Crypto PROPERTIES
|
set_target_properties(OpenSSL::Crypto PROPERTIES
|
||||||
INTERFACE_LINK_LIBRARIES ZLIB::ZLIB)
|
INTERFACE_LINK_LIBRARIES ZLIB::ZLIB)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
include ("${CMAKE_CURRENT_LIST_DIR}/RippleTargets.cmake")
|
|
||||||
|
|||||||
@@ -16,16 +16,13 @@ set(CMAKE_CXX_EXTENSIONS OFF)
|
|||||||
target_compile_definitions (common
|
target_compile_definitions (common
|
||||||
INTERFACE
|
INTERFACE
|
||||||
$<$<CONFIG:Debug>:DEBUG _DEBUG>
|
$<$<CONFIG:Debug>:DEBUG _DEBUG>
|
||||||
#[===[
|
$<$<AND:$<BOOL:${profile}>,$<NOT:$<BOOL:${assert}>>>:NDEBUG>)
|
||||||
NOTE: CMAKE release builds already have NDEBUG defined, so no need to add it
|
# ^^^^ NOTE: CMAKE release builds already have NDEBUG
|
||||||
explicitly except for the special case of (profile ON) and (assert OFF).
|
# defined, so no need to add it explicitly except for
|
||||||
Presumably this is because we don't want profile builds asserting unless
|
# this special case of (profile ON) and (assert OFF)
|
||||||
asserts were specifically requested.
|
# -- presumably this is because we don't want profile
|
||||||
]===]
|
# builds asserting unless asserts were specifically
|
||||||
$<$<AND:$<BOOL:${profile}>,$<NOT:$<BOOL:${assert}>>>:NDEBUG>
|
# requested
|
||||||
# TODO: Remove once we have migrated functions from OpenSSL 1.x to 3.x.
|
|
||||||
OPENSSL_SUPPRESS_DEPRECATED
|
|
||||||
)
|
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
# remove existing exception flag since we set it to -EHa
|
# remove existing exception flag since we set it to -EHa
|
||||||
|
|||||||
@@ -72,10 +72,7 @@ include(target_link_modules)
|
|||||||
|
|
||||||
# Level 01
|
# Level 01
|
||||||
add_module(xrpl beast)
|
add_module(xrpl beast)
|
||||||
target_link_libraries(xrpl.libxrpl.beast PUBLIC
|
target_link_libraries(xrpl.libxrpl.beast PUBLIC xrpl.imports.main)
|
||||||
xrpl.imports.main
|
|
||||||
xrpl.libpb
|
|
||||||
)
|
|
||||||
|
|
||||||
# Level 02
|
# Level 02
|
||||||
add_module(xrpl basics)
|
add_module(xrpl basics)
|
||||||
@@ -111,6 +108,12 @@ target_link_libraries(xrpl.libxrpl.net PUBLIC
|
|||||||
add_module(xrpl server)
|
add_module(xrpl server)
|
||||||
target_link_libraries(xrpl.libxrpl.server PUBLIC xrpl.libxrpl.protocol)
|
target_link_libraries(xrpl.libxrpl.server PUBLIC xrpl.libxrpl.protocol)
|
||||||
|
|
||||||
|
add_module(xrpl ledger)
|
||||||
|
target_link_libraries(xrpl.libxrpl.ledger PUBLIC
|
||||||
|
xrpl.libxrpl.basics
|
||||||
|
xrpl.libxrpl.json
|
||||||
|
xrpl.libxrpl.protocol
|
||||||
|
)
|
||||||
|
|
||||||
add_library(xrpl.libxrpl)
|
add_library(xrpl.libxrpl)
|
||||||
set_target_properties(xrpl.libxrpl PROPERTIES OUTPUT_NAME xrpl)
|
set_target_properties(xrpl.libxrpl PROPERTIES OUTPUT_NAME xrpl)
|
||||||
@@ -131,6 +134,7 @@ target_link_modules(xrpl PUBLIC
|
|||||||
resource
|
resource
|
||||||
server
|
server
|
||||||
net
|
net
|
||||||
|
ledger
|
||||||
)
|
)
|
||||||
|
|
||||||
# All headers in libxrpl are in modules.
|
# All headers in libxrpl are in modules.
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
|||||||
return()
|
return()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
include(ProcessorCount)
|
||||||
|
ProcessorCount(PROCESSOR_COUNT)
|
||||||
|
|
||||||
include(CodeCoverage)
|
include(CodeCoverage)
|
||||||
|
|
||||||
# The instructions for these commands come from the `CodeCoverage` module,
|
# The instructions for these commands come from the `CodeCoverage` module,
|
||||||
@@ -26,13 +29,13 @@ list(APPEND GCOVR_ADDITIONAL_ARGS
|
|||||||
--exclude-throw-branches
|
--exclude-throw-branches
|
||||||
--exclude-noncode-lines
|
--exclude-noncode-lines
|
||||||
--exclude-unreachable-branches -s
|
--exclude-unreachable-branches -s
|
||||||
-j ${coverage_test_parallelism})
|
-j ${PROCESSOR_COUNT})
|
||||||
|
|
||||||
setup_target_for_coverage_gcovr(
|
setup_target_for_coverage_gcovr(
|
||||||
NAME coverage
|
NAME coverage
|
||||||
FORMAT ${coverage_format}
|
FORMAT ${coverage_format}
|
||||||
EXECUTABLE rippled
|
EXCLUDE "src/test" "src/tests" "include/xrpl/beast/test" "include/xrpl/beast/unit_test" "${CMAKE_BINARY_DIR}/pb-xrpl.libpb"
|
||||||
EXECUTABLE_ARGS --unittest$<$<BOOL:${coverage_test}>:=${coverage_test}> --unittest-jobs ${coverage_test_parallelism} --quiet --unittest-log
|
DEPENDENCIES rippled xrpl.tests
|
||||||
EXCLUDE "src/test" "include/xrpl/beast/test" "include/xrpl/beast/unit_test" "${CMAKE_BINARY_DIR}/pb-xrpl.libpb"
|
|
||||||
DEPENDENCIES rippled
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_code_coverage_to_target(opts INTERFACE)
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ install (
|
|||||||
xrpl.libxrpl.json
|
xrpl.libxrpl.json
|
||||||
xrpl.libxrpl.protocol
|
xrpl.libxrpl.protocol
|
||||||
xrpl.libxrpl.resource
|
xrpl.libxrpl.resource
|
||||||
|
xrpl.libxrpl.ledger
|
||||||
xrpl.libxrpl.server
|
xrpl.libxrpl.server
|
||||||
xrpl.libxrpl.net
|
xrpl.libxrpl.net
|
||||||
xrpl.libxrpl
|
xrpl.libxrpl
|
||||||
|
|||||||
@@ -28,15 +28,11 @@ target_compile_options (opts
|
|||||||
$<$<AND:$<BOOL:${is_gcc}>,$<COMPILE_LANGUAGE:CXX>>:-Wsuggest-override>
|
$<$<AND:$<BOOL:${is_gcc}>,$<COMPILE_LANGUAGE:CXX>>:-Wsuggest-override>
|
||||||
$<$<BOOL:${is_gcc}>:-Wno-maybe-uninitialized>
|
$<$<BOOL:${is_gcc}>:-Wno-maybe-uninitialized>
|
||||||
$<$<BOOL:${perf}>:-fno-omit-frame-pointer>
|
$<$<BOOL:${perf}>:-fno-omit-frame-pointer>
|
||||||
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${coverage}>>:-g --coverage -fprofile-abs-path>
|
|
||||||
$<$<AND:$<BOOL:${is_clang}>,$<BOOL:${coverage}>>:-g --coverage>
|
|
||||||
$<$<BOOL:${profile}>:-pg>
|
$<$<BOOL:${profile}>:-pg>
|
||||||
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${profile}>>:-p>)
|
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${profile}>>:-p>)
|
||||||
|
|
||||||
target_link_libraries (opts
|
target_link_libraries (opts
|
||||||
INTERFACE
|
INTERFACE
|
||||||
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${coverage}>>:-g --coverage -fprofile-abs-path>
|
|
||||||
$<$<AND:$<BOOL:${is_clang}>,$<BOOL:${coverage}>>:-g --coverage>
|
|
||||||
$<$<BOOL:${profile}>:-pg>
|
$<$<BOOL:${profile}>:-pg>
|
||||||
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${profile}>>:-p>)
|
$<$<AND:$<BOOL:${is_gcc}>,$<BOOL:${profile}>>:-p>)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#[===================================================================[
|
#[===================================================================[
|
||||||
convenience variables and sanity checks
|
sanity checks
|
||||||
#]===================================================================]
|
#]===================================================================]
|
||||||
|
|
||||||
get_property(is_multiconfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
get_property(is_multiconfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
@@ -16,39 +16,19 @@ if (NOT is_multiconfig)
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
get_directory_property(has_parent PARENT_DIRECTORY)
|
|
||||||
if (has_parent)
|
|
||||||
set (is_root_project OFF)
|
|
||||||
else ()
|
|
||||||
set (is_root_project ON)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES ".*Clang") # both Clang and AppleClang
|
if ("${CMAKE_CXX_COMPILER_ID}" MATCHES ".*Clang") # both Clang and AppleClang
|
||||||
set (is_clang TRUE)
|
set (is_clang TRUE)
|
||||||
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND
|
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" AND
|
||||||
CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
|
CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16.0)
|
||||||
message (FATAL_ERROR "This project requires clang 8 or later")
|
message (FATAL_ERROR "This project requires clang 16 or later")
|
||||||
endif ()
|
endif ()
|
||||||
# TODO min AppleClang version check ?
|
|
||||||
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||||
set (is_gcc TRUE)
|
set (is_gcc TRUE)
|
||||||
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0)
|
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 12.0)
|
||||||
message (FATAL_ERROR "This project requires GCC 8 or later")
|
message (FATAL_ERROR "This project requires GCC 12 or later")
|
||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
||||||
set (is_linux TRUE)
|
|
||||||
else ()
|
|
||||||
set (is_linux FALSE)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if ("$ENV{CI}" STREQUAL "true" OR "$ENV{CONTINUOUS_INTEGRATION}" STREQUAL "true")
|
|
||||||
set (is_ci TRUE)
|
|
||||||
else ()
|
|
||||||
set (is_ci FALSE)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# check for in-source build and fail
|
# check for in-source build and fail
|
||||||
if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
|
if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
|
||||||
message (FATAL_ERROR "Builds (in-source) are not allowed in "
|
message (FATAL_ERROR "Builds (in-source) are not allowed in "
|
||||||
|
|||||||
@@ -1,10 +1,25 @@
|
|||||||
#[===================================================================[
|
#[===================================================================[
|
||||||
declare user options/settings
|
declare options and variables
|
||||||
#]===================================================================]
|
#]===================================================================]
|
||||||
|
|
||||||
include(ProcessorCount)
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
set (is_linux TRUE)
|
||||||
|
else()
|
||||||
|
set(is_linux FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
ProcessorCount(PROCESSOR_COUNT)
|
if("$ENV{CI}" STREQUAL "true" OR "$ENV{CONTINUOUS_INTEGRATION}" STREQUAL "true")
|
||||||
|
set(is_ci TRUE)
|
||||||
|
else()
|
||||||
|
set(is_ci FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_directory_property(has_parent PARENT_DIRECTORY)
|
||||||
|
if(has_parent)
|
||||||
|
set(is_root_project OFF)
|
||||||
|
else()
|
||||||
|
set(is_root_project ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
option(assert "Enables asserts, even in release builds" OFF)
|
option(assert "Enables asserts, even in release builds" OFF)
|
||||||
|
|
||||||
@@ -25,29 +40,28 @@ if(unity)
|
|||||||
endif()
|
endif()
|
||||||
set(CMAKE_UNITY_BUILD ON CACHE BOOL "Do a unity build")
|
set(CMAKE_UNITY_BUILD ON CACHE BOOL "Do a unity build")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(is_clang AND is_linux)
|
if(is_clang AND is_linux)
|
||||||
option(voidstar "Enable Antithesis instrumentation." OFF)
|
option(voidstar "Enable Antithesis instrumentation." OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(is_gcc OR is_clang)
|
if(is_gcc OR is_clang)
|
||||||
|
include(ProcessorCount)
|
||||||
|
ProcessorCount(PROCESSOR_COUNT)
|
||||||
|
|
||||||
option(coverage "Generates coverage info." OFF)
|
option(coverage "Generates coverage info." OFF)
|
||||||
option(profile "Add profiling flags" OFF)
|
option(profile "Add profiling flags" OFF)
|
||||||
set(coverage_test_parallelism "${PROCESSOR_COUNT}" CACHE STRING
|
|
||||||
"Unit tests parallelism for the purpose of coverage report.")
|
|
||||||
set(coverage_format "html-details" CACHE STRING
|
set(coverage_format "html-details" CACHE STRING
|
||||||
"Output format of the coverage report.")
|
"Output format of the coverage report.")
|
||||||
set(coverage_extra_args "" CACHE STRING
|
set(coverage_extra_args "" CACHE STRING
|
||||||
"Additional arguments to pass to gcovr.")
|
"Additional arguments to pass to gcovr.")
|
||||||
set(coverage_test "" CACHE STRING
|
|
||||||
"On gcc & clang, the specific unit test(s) to run for coverage. Default is all tests.")
|
|
||||||
if(coverage_test AND NOT coverage)
|
|
||||||
set(coverage ON CACHE BOOL "gcc/clang only" FORCE)
|
|
||||||
endif()
|
|
||||||
option(wextra "compile with extra gcc/clang warnings enabled" ON)
|
option(wextra "compile with extra gcc/clang warnings enabled" ON)
|
||||||
else()
|
else()
|
||||||
set(profile OFF CACHE BOOL "gcc/clang only" FORCE)
|
set(profile OFF CACHE BOOL "gcc/clang only" FORCE)
|
||||||
set(coverage OFF CACHE BOOL "gcc/clang only" FORCE)
|
set(coverage OFF CACHE BOOL "gcc/clang only" FORCE)
|
||||||
set(wextra OFF CACHE BOOL "gcc/clang only" FORCE)
|
set(wextra OFF CACHE BOOL "gcc/clang only" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(is_linux)
|
if(is_linux)
|
||||||
option(BUILD_SHARED_LIBS "build shared ripple libraries" OFF)
|
option(BUILD_SHARED_LIBS "build shared ripple libraries" OFF)
|
||||||
option(static "link protobuf, openssl, libc++, and boost statically" ON)
|
option(static "link protobuf, openssl, libc++, and boost statically" ON)
|
||||||
@@ -64,11 +78,13 @@ else()
|
|||||||
set(use_gold OFF CACHE BOOL "gold linker, linux only" FORCE)
|
set(use_gold OFF CACHE BOOL "gold linker, linux only" FORCE)
|
||||||
set(use_mold OFF CACHE BOOL "mold linker, linux only" FORCE)
|
set(use_mold OFF CACHE BOOL "mold linker, linux only" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(is_clang)
|
if(is_clang)
|
||||||
option(use_lld "enables detection of lld linker" ON)
|
option(use_lld "enables detection of lld linker" ON)
|
||||||
else()
|
else()
|
||||||
set(use_lld OFF CACHE BOOL "try lld linker, clang only" FORCE)
|
set(use_lld OFF CACHE BOOL "try lld linker, clang only" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(jemalloc "Enables jemalloc for heap profiling" OFF)
|
option(jemalloc "Enables jemalloc for heap profiling" OFF)
|
||||||
option(werr "treat warnings as errors" OFF)
|
option(werr "treat warnings as errors" OFF)
|
||||||
option(local_protobuf
|
option(local_protobuf
|
||||||
@@ -102,38 +118,26 @@ if(san)
|
|||||||
message(FATAL_ERROR "${san} sanitizer does not seem to be supported by your compiler")
|
message(FATAL_ERROR "${san} sanitizer does not seem to be supported by your compiler")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
set(container_label "" CACHE STRING "tag to use for package building containers")
|
|
||||||
option(packages_only
|
|
||||||
"ONLY generate package building targets. This is special use-case and almost \
|
|
||||||
certainly not what you want. Use with caution as you won't be able to build \
|
|
||||||
any compiled targets locally." OFF)
|
|
||||||
option(have_package_container
|
|
||||||
"Sometimes you already have the tagged container you want to use for package \
|
|
||||||
building and you don't want docker to rebuild it. This flag will detach the \
|
|
||||||
dependency of the package build from the container build. It's an advanced \
|
|
||||||
use case and most likely you should not be touching this flag." OFF)
|
|
||||||
|
|
||||||
# the remaining options are obscure and rarely used
|
# the remaining options are obscure and rarely used
|
||||||
option(beast_no_unit_test_inline
|
option(beast_no_unit_test_inline
|
||||||
"Prevents unit test definitions from being inserted into global table"
|
"Prevents unit test definitions from being inserted into global table"
|
||||||
OFF)
|
OFF)
|
||||||
option(single_io_service_thread
|
option(single_io_service_thread
|
||||||
"Restricts the number of threads calling io_context::run to one. \
|
"Restricts the number of threads calling io_service::run to one. \
|
||||||
This can be useful when debugging."
|
This can be useful when debugging."
|
||||||
OFF)
|
OFF)
|
||||||
option(boost_show_deprecated
|
option(boost_show_deprecated
|
||||||
"Allow boost to fail on deprecated usage. Only useful if you're trying\
|
"Allow boost to fail on deprecated usage. Only useful if you're trying\
|
||||||
to find deprecated calls."
|
to find deprecated calls."
|
||||||
OFF)
|
OFF)
|
||||||
option(beast_hashers
|
|
||||||
"Use local implementations for sha/ripemd hashes (experimental, not recommended)"
|
|
||||||
OFF)
|
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
option(beast_disable_autolink "Disables autolinking of system libraries on WIN32" OFF)
|
option(beast_disable_autolink "Disables autolinking of system libraries on WIN32" OFF)
|
||||||
else()
|
else()
|
||||||
set(beast_disable_autolink OFF CACHE BOOL "WIN32 only" FORCE)
|
set(beast_disable_autolink OFF CACHE BOOL "WIN32 only" FORCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(coverage)
|
if(coverage)
|
||||||
message(STATUS "coverage build requested - forcing Debug build")
|
message(STATUS "coverage build requested - forcing Debug build")
|
||||||
set(CMAKE_BUILD_TYPE Debug CACHE STRING "build type" FORCE)
|
set(CMAKE_BUILD_TYPE Debug CACHE STRING "build type" FORCE)
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ target_link_libraries(ripple_boost
|
|||||||
Boost::date_time
|
Boost::date_time
|
||||||
Boost::filesystem
|
Boost::filesystem
|
||||||
Boost::json
|
Boost::json
|
||||||
Boost::process
|
|
||||||
Boost::program_options
|
Boost::program_options
|
||||||
Boost::regex
|
Boost::regex
|
||||||
Boost::system
|
Boost::system
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ function(xrpl_add_test name)
|
|||||||
"${CMAKE_CURRENT_SOURCE_DIR}/${name}/*.cpp"
|
"${CMAKE_CURRENT_SOURCE_DIR}/${name}/*.cpp"
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/${name}.cpp"
|
"${CMAKE_CURRENT_SOURCE_DIR}/${name}.cpp"
|
||||||
)
|
)
|
||||||
add_executable(${target} EXCLUDE_FROM_ALL ${ARGN} ${sources})
|
add_executable(${target} ${ARGN} ${sources})
|
||||||
|
|
||||||
isolate_headers(
|
isolate_headers(
|
||||||
${target}
|
${target}
|
||||||
@@ -22,20 +22,4 @@ function(xrpl_add_test name)
|
|||||||
UNITY_BUILD_BATCH_SIZE 0) # Adjust as needed
|
UNITY_BUILD_BATCH_SIZE 0) # Adjust as needed
|
||||||
|
|
||||||
add_test(NAME ${target} COMMAND ${target})
|
add_test(NAME ${target} COMMAND ${target})
|
||||||
set_tests_properties(
|
|
||||||
${target} PROPERTIES
|
|
||||||
FIXTURES_REQUIRED ${target}_fixture
|
|
||||||
)
|
|
||||||
|
|
||||||
add_test(
|
|
||||||
NAME ${target}.build
|
|
||||||
COMMAND
|
|
||||||
${CMAKE_COMMAND}
|
|
||||||
--build ${CMAKE_BINARY_DIR}
|
|
||||||
--config $<CONFIG>
|
|
||||||
--target ${target}
|
|
||||||
)
|
|
||||||
set_tests_properties(${target}.build PROPERTIES
|
|
||||||
FIXTURES_SETUP ${target}_fixture
|
|
||||||
)
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"rocksdb/10.0.1#85537f46e538974d67da0c3977de48ac%1756234304.347",
|
"rocksdb/10.0.1#85537f46e538974d67da0c3977de48ac%1756234304.347",
|
||||||
"re2/20230301#dfd6e2bf050eb90ddd8729cfb4c844a4%1756234257.976",
|
"re2/20230301#dfd6e2bf050eb90ddd8729cfb4c844a4%1756234257.976",
|
||||||
"protobuf/3.21.12#d927114e28de9f4691a6bbcdd9a529d1%1756234251.614",
|
"protobuf/3.21.12#d927114e28de9f4691a6bbcdd9a529d1%1756234251.614",
|
||||||
"openssl/3.5.2#0c5a5e15ae569f45dff57adcf1770cf7%1756234259.61",
|
"openssl/1.1.1w#a8f0792d7c5121b954578a7149d23e03%1756223730.729",
|
||||||
"nudb/2.0.9#c62cfd501e57055a7e0d8ee3d5e5427d%1756234237.107",
|
"nudb/2.0.9#c62cfd501e57055a7e0d8ee3d5e5427d%1756234237.107",
|
||||||
"lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504%1756234228.999",
|
"lz4/1.10.0#59fc63cac7f10fbe8e05c7e62c2f3504%1756234228.999",
|
||||||
"libiconv/1.17#1e65319e945f2d31941a9d28cc13c058%1756223727.64",
|
"libiconv/1.17#1e65319e945f2d31941a9d28cc13c058%1756223727.64",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
"date/3.0.4#f74bbba5a08fa388256688743136cb6f%1756234217.493",
|
"date/3.0.4#f74bbba5a08fa388256688743136cb6f%1756234217.493",
|
||||||
"c-ares/1.34.5#b78b91e7cfb1f11ce777a285bbf169c6%1756234217.915",
|
"c-ares/1.34.5#b78b91e7cfb1f11ce777a285bbf169c6%1756234217.915",
|
||||||
"bzip2/1.0.8#00b4a4658791c1f06914e087f0e792f5%1756234261.716",
|
"bzip2/1.0.8#00b4a4658791c1f06914e087f0e792f5%1756234261.716",
|
||||||
"boost/1.88.0#8852c0b72ce8271fb8ff7c53456d4983%1756223752.326",
|
"boost/1.83.0#5d975011d65b51abb2d2f6eb8386b368%1754325043.336",
|
||||||
"abseil/20230802.1#f0f91485b111dc9837a68972cb19ca7b%1756234220.907"
|
"abseil/20230802.1#f0f91485b111dc9837a68972cb19ca7b%1756234220.907"
|
||||||
],
|
],
|
||||||
"build_requires": [
|
"build_requires": [
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
"lz4/1.10.0"
|
"lz4/1.10.0"
|
||||||
],
|
],
|
||||||
"boost/1.83.0": [
|
"boost/1.83.0": [
|
||||||
"boost/1.88.0"
|
"boost/1.83.0"
|
||||||
],
|
],
|
||||||
"sqlite3/3.44.2": [
|
"sqlite3/3.44.2": [
|
||||||
"sqlite3/3.49.1"
|
"sqlite3/3.49.1"
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
# Global configuration for Conan. This is used to set the number of parallel
|
# Global configuration for Conan. This is used to set the number of parallel
|
||||||
# downloads, uploads, and build jobs. The verbosity is set to verbose to
|
# downloads and uploads.
|
||||||
# provide more information during the build process.
|
|
||||||
core:non_interactive=True
|
core:non_interactive=True
|
||||||
core.download:parallel={{ os.cpu_count() }}
|
core.download:parallel={{ os.cpu_count() }}
|
||||||
core.upload:parallel={{ os.cpu_count() }}
|
core.upload:parallel={{ os.cpu_count() }}
|
||||||
tools.build:jobs={{ (os.cpu_count() * 4/5) | int }}
|
|
||||||
tools.build:verbosity=verbose
|
|
||||||
tools.compilation:verbosity=verbose
|
|
||||||
|
|||||||
@@ -21,14 +21,14 @@ compiler.libcxx={{detect_api.detect_libcxx(compiler, version, compiler_exe)}}
|
|||||||
|
|
||||||
[conf]
|
[conf]
|
||||||
{% if compiler == "clang" and compiler_version >= 19 %}
|
{% if compiler == "clang" and compiler_version >= 19 %}
|
||||||
tools.build:cxxflags=['-Wno-missing-template-arg-list-after-template-kw']
|
grpc/1.50.1:tools.build:cxxflags+=['-Wno-missing-template-arg-list-after-template-kw']
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if compiler == "apple-clang" and compiler_version >= 17 %}
|
{% if compiler == "apple-clang" and compiler_version >= 17 %}
|
||||||
tools.build:cxxflags=['-Wno-missing-template-arg-list-after-template-kw']
|
grpc/1.50.1:tools.build:cxxflags+=['-Wno-missing-template-arg-list-after-template-kw']
|
||||||
|
{% endif %}
|
||||||
|
{% if compiler == "clang" and compiler_version == 16 %}
|
||||||
|
tools.build:cxxflags=['-DBOOST_ASIO_DISABLE_CONCEPTS']
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if compiler == "gcc" and compiler_version < 13 %}
|
{% if compiler == "gcc" and compiler_version < 13 %}
|
||||||
tools.build:cxxflags=['-Wno-restrict']
|
tools.build:cxxflags+=['-Wno-restrict']
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
[tool_requires]
|
|
||||||
!cmake/*: cmake/[>=3 <4]
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class Xrpl(ConanFile):
|
|||||||
'grpc/1.50.1',
|
'grpc/1.50.1',
|
||||||
'libarchive/3.8.1',
|
'libarchive/3.8.1',
|
||||||
'nudb/2.0.9',
|
'nudb/2.0.9',
|
||||||
'openssl/3.5.2',
|
'openssl/1.1.1w',
|
||||||
'soci/4.0.3',
|
'soci/4.0.3',
|
||||||
'zlib/1.3.1',
|
'zlib/1.3.1',
|
||||||
]
|
]
|
||||||
@@ -100,13 +100,11 @@ class Xrpl(ConanFile):
|
|||||||
def configure(self):
|
def configure(self):
|
||||||
if self.settings.compiler == 'apple-clang':
|
if self.settings.compiler == 'apple-clang':
|
||||||
self.options['boost'].visibility = 'global'
|
self.options['boost'].visibility = 'global'
|
||||||
if self.settings.compiler in ['clang', 'gcc']:
|
|
||||||
self.options['boost'].without_cobalt = True
|
|
||||||
|
|
||||||
def requirements(self):
|
def requirements(self):
|
||||||
# Conan 2 requires transitive headers to be specified
|
# Conan 2 requires transitive headers to be specified
|
||||||
transitive_headers_opt = {'transitive_headers': True} if conan_version.split('.')[0] == '2' else {}
|
transitive_headers_opt = {'transitive_headers': True} if conan_version.split('.')[0] == '2' else {}
|
||||||
self.requires('boost/1.88.0', force=True, **transitive_headers_opt)
|
self.requires('boost/1.83.0', force=True, **transitive_headers_opt)
|
||||||
self.requires('date/3.0.4', **transitive_headers_opt)
|
self.requires('date/3.0.4', **transitive_headers_opt)
|
||||||
self.requires('lz4/1.10.0', force=True)
|
self.requires('lz4/1.10.0', force=True)
|
||||||
self.requires('protobuf/3.21.12', force=True)
|
self.requires('protobuf/3.21.12', force=True)
|
||||||
@@ -177,7 +175,6 @@ class Xrpl(ConanFile):
|
|||||||
'boost::filesystem',
|
'boost::filesystem',
|
||||||
'boost::json',
|
'boost::json',
|
||||||
'boost::program_options',
|
'boost::program_options',
|
||||||
'boost::process',
|
|
||||||
'boost::regex',
|
'boost::regex',
|
||||||
'boost::system',
|
'boost::system',
|
||||||
'boost::thread',
|
'boost::thread',
|
||||||
|
|||||||
@@ -654,12 +654,14 @@ SharedWeakUnion<T>::convertToWeak()
|
|||||||
break;
|
break;
|
||||||
case destroy:
|
case destroy:
|
||||||
// We just added a weak ref. How could we destroy?
|
// We just added a weak ref. How could we destroy?
|
||||||
|
// LCOV_EXCL_START
|
||||||
UNREACHABLE(
|
UNREACHABLE(
|
||||||
"ripple::SharedWeakUnion::convertToWeak : destroying freshly "
|
"ripple::SharedWeakUnion::convertToWeak : destroying freshly "
|
||||||
"added ref");
|
"added ref");
|
||||||
delete p;
|
delete p;
|
||||||
unsafeSetRawPtr(nullptr);
|
unsafeSetRawPtr(nullptr);
|
||||||
return true; // Should never happen
|
return true; // Should never happen
|
||||||
|
// LCOV_EXCL_STOP
|
||||||
case partialDestroy:
|
case partialDestroy:
|
||||||
// This is a weird case. We just converted the last strong
|
// This is a weird case. We just converted the last strong
|
||||||
// pointer to a weak pointer.
|
// pointer to a weak pointer.
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#include <xrpl/basics/Resolver.h>
|
#include <xrpl/basics/Resolver.h>
|
||||||
#include <xrpl/beast/utility/Journal.h>
|
#include <xrpl/beast/utility/Journal.h>
|
||||||
|
|
||||||
#include <boost/asio/io_context.hpp>
|
#include <boost/asio/io_service.hpp>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ public:
|
|||||||
explicit ResolverAsio() = default;
|
explicit ResolverAsio() = default;
|
||||||
|
|
||||||
static std::unique_ptr<ResolverAsio>
|
static std::unique_ptr<ResolverAsio>
|
||||||
New(boost::asio::io_context&, beast::Journal);
|
New(boost::asio::io_service&, beast::Journal);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace ripple
|
} // namespace ripple
|
||||||
|
|||||||
@@ -632,6 +632,16 @@ to_string(base_uint<Bits, Tag> const& a)
|
|||||||
return strHex(a.cbegin(), a.cend());
|
return strHex(a.cbegin(), a.cend());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <std::size_t Bits, class Tag>
|
||||||
|
inline std::string
|
||||||
|
to_short_string(base_uint<Bits, Tag> const& a)
|
||||||
|
{
|
||||||
|
static_assert(
|
||||||
|
base_uint<Bits, Tag>::bytes > 4,
|
||||||
|
"For 4 bytes or less, use a native type");
|
||||||
|
return strHex(a.cbegin(), a.cbegin() + 4) + "...";
|
||||||
|
}
|
||||||
|
|
||||||
template <std::size_t Bits, class Tag>
|
template <std::size_t Bits, class Tag>
|
||||||
inline std::ostream&
|
inline std::ostream&
|
||||||
operator<<(std::ostream& out, base_uint<Bits, Tag> const& u)
|
operator<<(std::ostream& out, base_uint<Bits, Tag> const& u)
|
||||||
|
|||||||
@@ -28,9 +28,8 @@ namespace ripple {
|
|||||||
// the destination can hold all values of the source. This is particularly
|
// the destination can hold all values of the source. This is particularly
|
||||||
// handy when the source or destination is an enumeration type.
|
// handy when the source or destination is an enumeration type.
|
||||||
|
|
||||||
template <class Dest, class Src>
|
template <class Src, class Dest>
|
||||||
static constexpr bool is_safetocasttovalue_v =
|
concept SafeToCast = (std::is_integral_v<Src> && std::is_integral_v<Dest>) &&
|
||||||
(std::is_integral_v<Src> && std::is_integral_v<Dest>) &&
|
|
||||||
(std::is_signed<Src>::value || std::is_unsigned<Dest>::value) &&
|
(std::is_signed<Src>::value || std::is_unsigned<Dest>::value) &&
|
||||||
(std::is_signed<Src>::value != std::is_signed<Dest>::value
|
(std::is_signed<Src>::value != std::is_signed<Dest>::value
|
||||||
? sizeof(Dest) > sizeof(Src)
|
? sizeof(Dest) > sizeof(Src)
|
||||||
@@ -78,7 +77,7 @@ inline constexpr std::
|
|||||||
unsafe_cast(Src s) noexcept
|
unsafe_cast(Src s) noexcept
|
||||||
{
|
{
|
||||||
static_assert(
|
static_assert(
|
||||||
!is_safetocasttovalue_v<Dest, Src>,
|
!SafeToCast<Src, Dest>,
|
||||||
"Only unsafe if casting signed to unsigned or "
|
"Only unsafe if casting signed to unsigned or "
|
||||||
"destination is too small");
|
"destination is too small");
|
||||||
return static_cast<Dest>(s);
|
return static_cast<Dest>(s);
|
||||||
|
|||||||
@@ -23,8 +23,7 @@
|
|||||||
#include <xrpl/beast/utility/instrumentation.h>
|
#include <xrpl/beast/utility/instrumentation.h>
|
||||||
|
|
||||||
#include <boost/asio/basic_waitable_timer.hpp>
|
#include <boost/asio/basic_waitable_timer.hpp>
|
||||||
#include <boost/asio/io_context.hpp>
|
#include <boost/asio/io_service.hpp>
|
||||||
#include <boost/asio/post.hpp>
|
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
@@ -33,7 +32,7 @@
|
|||||||
|
|
||||||
namespace beast {
|
namespace beast {
|
||||||
|
|
||||||
/** Measures handler latency on an io_context queue. */
|
/** Measures handler latency on an io_service queue. */
|
||||||
template <class Clock>
|
template <class Clock>
|
||||||
class io_latency_probe
|
class io_latency_probe
|
||||||
{
|
{
|
||||||
@@ -45,12 +44,12 @@ private:
|
|||||||
std::condition_variable_any m_cond;
|
std::condition_variable_any m_cond;
|
||||||
std::size_t m_count;
|
std::size_t m_count;
|
||||||
duration const m_period;
|
duration const m_period;
|
||||||
boost::asio::io_context& m_ios;
|
boost::asio::io_service& m_ios;
|
||||||
boost::asio::basic_waitable_timer<std::chrono::steady_clock> m_timer;
|
boost::asio::basic_waitable_timer<std::chrono::steady_clock> m_timer;
|
||||||
bool m_cancel;
|
bool m_cancel;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
io_latency_probe(duration const& period, boost::asio::io_context& ios)
|
io_latency_probe(duration const& period, boost::asio::io_service& ios)
|
||||||
: m_count(1)
|
: m_count(1)
|
||||||
, m_period(period)
|
, m_period(period)
|
||||||
, m_ios(ios)
|
, m_ios(ios)
|
||||||
@@ -65,16 +64,16 @@ public:
|
|||||||
cancel(lock, true);
|
cancel(lock, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return the io_context associated with the latency probe. */
|
/** Return the io_service associated with the latency probe. */
|
||||||
/** @{ */
|
/** @{ */
|
||||||
boost::asio::io_context&
|
boost::asio::io_service&
|
||||||
get_io_context()
|
get_io_service()
|
||||||
{
|
{
|
||||||
return m_ios;
|
return m_ios;
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::asio::io_context const&
|
boost::asio::io_service const&
|
||||||
get_io_context() const
|
get_io_service() const
|
||||||
{
|
{
|
||||||
return m_ios;
|
return m_ios;
|
||||||
}
|
}
|
||||||
@@ -110,9 +109,7 @@ public:
|
|||||||
std::lock_guard lock(m_mutex);
|
std::lock_guard lock(m_mutex);
|
||||||
if (m_cancel)
|
if (m_cancel)
|
||||||
throw std::logic_error("io_latency_probe is canceled");
|
throw std::logic_error("io_latency_probe is canceled");
|
||||||
boost::asio::post(
|
m_ios.post(sample_op<Handler>(
|
||||||
m_ios,
|
|
||||||
sample_op<Handler>(
|
|
||||||
std::forward<Handler>(handler), Clock::now(), false, this));
|
std::forward<Handler>(handler), Clock::now(), false, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,9 +124,7 @@ public:
|
|||||||
std::lock_guard lock(m_mutex);
|
std::lock_guard lock(m_mutex);
|
||||||
if (m_cancel)
|
if (m_cancel)
|
||||||
throw std::logic_error("io_latency_probe is canceled");
|
throw std::logic_error("io_latency_probe is canceled");
|
||||||
boost::asio::post(
|
m_ios.post(sample_op<Handler>(
|
||||||
m_ios,
|
|
||||||
sample_op<Handler>(
|
|
||||||
std::forward<Handler>(handler), Clock::now(), true, this));
|
std::forward<Handler>(handler), Clock::now(), true, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,13 +236,12 @@ private:
|
|||||||
// The latency is too high to maintain the desired
|
// The latency is too high to maintain the desired
|
||||||
// period so don't bother with a timer.
|
// period so don't bother with a timer.
|
||||||
//
|
//
|
||||||
boost::asio::post(
|
m_probe->m_ios.post(
|
||||||
m_probe->m_ios,
|
|
||||||
sample_op<Handler>(m_handler, now, m_repeat, m_probe));
|
sample_op<Handler>(m_handler, now, m_repeat, m_probe));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_probe->m_timer.expires_after(when - now);
|
m_probe->m_timer.expires_from_now(when - now);
|
||||||
m_probe->m_timer.async_wait(
|
m_probe->m_timer.async_wait(
|
||||||
sample_op<Handler>(m_handler, now, m_repeat, m_probe));
|
sample_op<Handler>(m_handler, now, m_repeat, m_probe));
|
||||||
}
|
}
|
||||||
@@ -260,8 +254,7 @@ private:
|
|||||||
if (!m_probe)
|
if (!m_probe)
|
||||||
return;
|
return;
|
||||||
typename Clock::time_point const now(Clock::now());
|
typename Clock::time_point const now(Clock::now());
|
||||||
boost::asio::post(
|
m_probe->m_ios.post(
|
||||||
m_probe->m_ios,
|
|
||||||
sample_op<Handler>(m_handler, now, m_repeat, m_probe));
|
sample_op<Handler>(m_handler, now, m_repeat, m_probe));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -94,7 +94,11 @@ hash_append(Hasher& h, beast::IP::Address const& addr) noexcept
|
|||||||
else if (addr.is_v6())
|
else if (addr.is_v6())
|
||||||
hash_append(h, addr.to_v6().to_bytes());
|
hash_append(h, addr.to_v6().to_bytes());
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
// LCOV_EXCL_START
|
||||||
UNREACHABLE("beast::hash_append : invalid address type");
|
UNREACHABLE("beast::hash_append : invalid address type");
|
||||||
|
// LCOV_EXCL_STOP
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} // namespace beast
|
} // namespace beast
|
||||||
|
|
||||||
|
|||||||
@@ -8,11 +8,9 @@
|
|||||||
#ifndef BEAST_TEST_YIELD_TO_HPP
|
#ifndef BEAST_TEST_YIELD_TO_HPP
|
||||||
#define BEAST_TEST_YIELD_TO_HPP
|
#define BEAST_TEST_YIELD_TO_HPP
|
||||||
|
|
||||||
#include <boost/asio/executor_work_guard.hpp>
|
#include <boost/asio/io_service.hpp>
|
||||||
#include <boost/asio/io_context.hpp>
|
|
||||||
#include <boost/asio/spawn.hpp>
|
#include <boost/asio/spawn.hpp>
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
#include <boost/thread/csbl/memory/allocator_arg.hpp>
|
|
||||||
|
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
@@ -31,12 +29,10 @@ namespace test {
|
|||||||
class enable_yield_to
|
class enable_yield_to
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
boost::asio::io_context ios_;
|
boost::asio::io_service ios_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
boost::optional<boost::asio::executor_work_guard<
|
boost::optional<boost::asio::io_service::work> work_;
|
||||||
boost::asio::io_context::executor_type>>
|
|
||||||
work_;
|
|
||||||
std::vector<std::thread> threads_;
|
std::vector<std::thread> threads_;
|
||||||
std::mutex m_;
|
std::mutex m_;
|
||||||
std::condition_variable cv_;
|
std::condition_variable cv_;
|
||||||
@@ -46,8 +42,7 @@ public:
|
|||||||
/// The type of yield context passed to functions.
|
/// The type of yield context passed to functions.
|
||||||
using yield_context = boost::asio::yield_context;
|
using yield_context = boost::asio::yield_context;
|
||||||
|
|
||||||
explicit enable_yield_to(std::size_t concurrency = 1)
|
explicit enable_yield_to(std::size_t concurrency = 1) : work_(ios_)
|
||||||
: work_(boost::asio::make_work_guard(ios_))
|
|
||||||
{
|
{
|
||||||
threads_.reserve(concurrency);
|
threads_.reserve(concurrency);
|
||||||
while (concurrency--)
|
while (concurrency--)
|
||||||
@@ -61,9 +56,9 @@ public:
|
|||||||
t.join();
|
t.join();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the `io_context` associated with the object
|
/// Return the `io_service` associated with the object
|
||||||
boost::asio::io_context&
|
boost::asio::io_service&
|
||||||
get_io_context()
|
get_io_service()
|
||||||
{
|
{
|
||||||
return ios_;
|
return ios_;
|
||||||
}
|
}
|
||||||
@@ -116,18 +111,13 @@ enable_yield_to::spawn(F0&& f, FN&&... fn)
|
|||||||
{
|
{
|
||||||
boost::asio::spawn(
|
boost::asio::spawn(
|
||||||
ios_,
|
ios_,
|
||||||
boost::allocator_arg,
|
|
||||||
boost::context::fixedsize_stack(2 * 1024 * 1024),
|
|
||||||
[&](yield_context yield) {
|
[&](yield_context yield) {
|
||||||
f(yield);
|
f(yield);
|
||||||
std::lock_guard lock{m_};
|
std::lock_guard lock{m_};
|
||||||
if (--running_ == 0)
|
if (--running_ == 0)
|
||||||
cv_.notify_all();
|
cv_.notify_all();
|
||||||
},
|
},
|
||||||
[](std::exception_ptr e) {
|
boost::coroutines::attributes(2 * 1024 * 1024));
|
||||||
if (e)
|
|
||||||
std::rethrow_exception(e);
|
|
||||||
});
|
|
||||||
spawn(fn...);
|
spawn(fn...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,11 +39,16 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define XRPL_ASSERT ALWAYS_OR_UNREACHABLE
|
#define XRPL_ASSERT ALWAYS_OR_UNREACHABLE
|
||||||
|
#define XRPL_ASSERT_PARTS(cond, function, description, ...) \
|
||||||
|
XRPL_ASSERT(cond, function " : " description)
|
||||||
|
|
||||||
// How to use the instrumentation macros:
|
// How to use the instrumentation macros:
|
||||||
//
|
//
|
||||||
// * XRPL_ASSERT if cond must be true but the line might not be reached during
|
// * XRPL_ASSERT if cond must be true but the line might not be reached during
|
||||||
// fuzzing. Same like `assert` in normal use.
|
// fuzzing. Same like `assert` in normal use.
|
||||||
|
// * XRPL_ASSERT_PARTS is for convenience, and works like XRPL_ASSERT, but
|
||||||
|
// splits the message param into "function" and "description", then joins
|
||||||
|
// them with " : " before passing to XRPL_ASSERT.
|
||||||
// * ALWAYS if cond must be true _and_ the line must be reached during fuzzing.
|
// * ALWAYS if cond must be true _and_ the line must be reached during fuzzing.
|
||||||
// Same like `assert` in normal use.
|
// Same like `assert` in normal use.
|
||||||
// * REACHABLE if the line must be reached during fuzzing
|
// * REACHABLE if the line must be reached during fuzzing
|
||||||
|
|||||||
@@ -217,7 +217,7 @@ Reader::parse(Value& root, BufferSequence const& bs)
|
|||||||
std::string s;
|
std::string s;
|
||||||
s.reserve(buffer_size(bs));
|
s.reserve(buffer_size(bs));
|
||||||
for (auto const& b : bs)
|
for (auto const& b : bs)
|
||||||
s.append(static_cast<char const*>(b.data()), buffer_size(b));
|
s.append(buffer_cast<char const*>(b), buffer_size(b));
|
||||||
return parse(s, root);
|
return parse(s, root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ public:
|
|||||||
* without formatting (not human friendly).
|
* without formatting (not human friendly).
|
||||||
*
|
*
|
||||||
* The JSON document is written in a single line. It is not intended for 'human'
|
* The JSON document is written in a single line. It is not intended for 'human'
|
||||||
* consumption, but may be useful to support feature such as RPC where bandwith
|
* consumption, but may be useful to support feature such as RPC where bandwidth
|
||||||
* is limited. \sa Reader, Value
|
* is limited. \sa Reader, Value
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
@@ -20,11 +20,10 @@
|
|||||||
#ifndef RIPPLE_LEDGER_APPLYVIEW_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_APPLYVIEW_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_APPLYVIEW_H_INCLUDED
|
#define RIPPLE_LEDGER_APPLYVIEW_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/RawView.h>
|
|
||||||
#include <xrpld/ledger/ReadView.h>
|
|
||||||
|
|
||||||
#include <xrpl/basics/safe_cast.h>
|
#include <xrpl/basics/safe_cast.h>
|
||||||
#include <xrpl/beast/utility/instrumentation.h>
|
#include <xrpl/beast/utility/instrumentation.h>
|
||||||
|
#include <xrpl/ledger/RawView.h>
|
||||||
|
#include <xrpl/ledger/ReadView.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|
||||||
@@ -285,12 +284,14 @@ public:
|
|||||||
{
|
{
|
||||||
if (key.type != ltOFFER)
|
if (key.type != ltOFFER)
|
||||||
{
|
{
|
||||||
|
// LCOV_EXCL_START
|
||||||
UNREACHABLE(
|
UNREACHABLE(
|
||||||
"ripple::ApplyView::dirAppend : only Offers are appended to "
|
"ripple::ApplyView::dirAppend : only Offers are appended to "
|
||||||
"book directories");
|
"book directories");
|
||||||
// Only Offers are appended to book directories. Call dirInsert()
|
// Only Offers are appended to book directories. Call dirInsert()
|
||||||
// instead
|
// instead
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
|
// LCOV_EXCL_STOP
|
||||||
}
|
}
|
||||||
return dirAdd(true, directory, key.key, describe);
|
return dirAdd(true, directory, key.key, describe);
|
||||||
}
|
}
|
||||||
@@ -20,9 +20,8 @@
|
|||||||
#ifndef RIPPLE_LEDGER_APPLYVIEWIMPL_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_APPLYVIEWIMPL_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_APPLYVIEWIMPL_H_INCLUDED
|
#define RIPPLE_LEDGER_APPLYVIEWIMPL_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/OpenView.h>
|
#include <xrpl/ledger/OpenView.h>
|
||||||
#include <xrpld/ledger/detail/ApplyViewBase.h>
|
#include <xrpl/ledger/detail/ApplyViewBase.h>
|
||||||
|
|
||||||
#include <xrpl/protocol/STAmount.h>
|
#include <xrpl/protocol/STAmount.h>
|
||||||
#include <xrpl/protocol/TER.h>
|
#include <xrpl/protocol/TER.h>
|
||||||
|
|
||||||
@@ -20,9 +20,8 @@
|
|||||||
#ifndef RIPPLE_LEDGER_BOOK_DIRS_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_BOOK_DIRS_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_BOOK_DIRS_H_INCLUDED
|
#define RIPPLE_LEDGER_BOOK_DIRS_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/ReadView.h>
|
|
||||||
|
|
||||||
#include <xrpl/beast/utility/Journal.h>
|
#include <xrpl/beast/utility/Journal.h>
|
||||||
|
#include <xrpl/ledger/ReadView.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|
||||||
@@ -20,10 +20,9 @@
|
|||||||
#ifndef RIPPLE_LEDGER_CACHEDVIEW_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_CACHEDVIEW_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_CACHEDVIEW_H_INCLUDED
|
#define RIPPLE_LEDGER_CACHEDVIEW_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/CachedSLEs.h>
|
|
||||||
#include <xrpld/ledger/ReadView.h>
|
|
||||||
|
|
||||||
#include <xrpl/basics/hardened_hash.h>
|
#include <xrpl/basics/hardened_hash.h>
|
||||||
|
#include <xrpl/ledger/CachedSLEs.h>
|
||||||
|
#include <xrpl/ledger/ReadView.h>
|
||||||
|
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
@@ -20,12 +20,11 @@
|
|||||||
#ifndef RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED
|
#ifndef RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED
|
||||||
#define RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED
|
#define RIPPLE_APP_MISC_CREDENTIALHELPERS_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/ApplyView.h>
|
|
||||||
#include <xrpld/ledger/ReadView.h>
|
|
||||||
|
|
||||||
#include <xrpl/basics/Log.h>
|
#include <xrpl/basics/Log.h>
|
||||||
#include <xrpl/basics/base_uint.h>
|
#include <xrpl/basics/base_uint.h>
|
||||||
#include <xrpl/beast/utility/Journal.h>
|
#include <xrpl/beast/utility/Journal.h>
|
||||||
|
#include <xrpl/ledger/ApplyView.h>
|
||||||
|
#include <xrpl/ledger/ReadView.h>
|
||||||
#include <xrpl/protocol/AccountID.h>
|
#include <xrpl/protocol/AccountID.h>
|
||||||
#include <xrpl/protocol/STArray.h>
|
#include <xrpl/protocol/STArray.h>
|
||||||
#include <xrpl/protocol/STTx.h>
|
#include <xrpl/protocol/STTx.h>
|
||||||
@@ -20,8 +20,7 @@
|
|||||||
#ifndef RIPPLE_LEDGER_DIR_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_DIR_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_DIR_H_INCLUDED
|
#define RIPPLE_LEDGER_DIR_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/ReadView.h>
|
#include <xrpl/ledger/ReadView.h>
|
||||||
|
|
||||||
#include <xrpl/protocol/Indexes.h>
|
#include <xrpl/protocol/Indexes.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
@@ -20,10 +20,9 @@
|
|||||||
#ifndef RIPPLE_LEDGER_OPENVIEW_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_OPENVIEW_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_OPENVIEW_H_INCLUDED
|
#define RIPPLE_LEDGER_OPENVIEW_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/RawView.h>
|
#include <xrpl/ledger/RawView.h>
|
||||||
#include <xrpld/ledger/ReadView.h>
|
#include <xrpl/ledger/ReadView.h>
|
||||||
#include <xrpld/ledger/detail/RawStateTable.h>
|
#include <xrpl/ledger/detail/RawStateTable.h>
|
||||||
|
|
||||||
#include <xrpl/protocol/STArray.h>
|
#include <xrpl/protocol/STArray.h>
|
||||||
#include <xrpl/protocol/XRPAmount.h>
|
#include <xrpl/protocol/XRPAmount.h>
|
||||||
|
|
||||||
@@ -20,10 +20,9 @@
|
|||||||
#ifndef RIPPLE_LEDGER_PAYMENTSANDBOX_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_PAYMENTSANDBOX_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_PAYMENTSANDBOX_H_INCLUDED
|
#define RIPPLE_LEDGER_PAYMENTSANDBOX_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/RawView.h>
|
#include <xrpl/ledger/RawView.h>
|
||||||
#include <xrpld/ledger/Sandbox.h>
|
#include <xrpl/ledger/Sandbox.h>
|
||||||
#include <xrpld/ledger/detail/ApplyViewBase.h>
|
#include <xrpl/ledger/detail/ApplyViewBase.h>
|
||||||
|
|
||||||
#include <xrpl/protocol/AccountID.h>
|
#include <xrpl/protocol/AccountID.h>
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
@@ -20,8 +20,7 @@
|
|||||||
#ifndef RIPPLE_LEDGER_RAWVIEW_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_RAWVIEW_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_RAWVIEW_H_INCLUDED
|
#define RIPPLE_LEDGER_RAWVIEW_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/ReadView.h>
|
#include <xrpl/ledger/ReadView.h>
|
||||||
|
|
||||||
#include <xrpl/protocol/STLedgerEntry.h>
|
#include <xrpl/protocol/STLedgerEntry.h>
|
||||||
#include <xrpl/protocol/Serializer.h>
|
#include <xrpl/protocol/Serializer.h>
|
||||||
|
|
||||||
@@ -20,10 +20,9 @@
|
|||||||
#ifndef RIPPLE_LEDGER_READVIEW_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_READVIEW_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_READVIEW_H_INCLUDED
|
#define RIPPLE_LEDGER_READVIEW_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/detail/ReadViewFwdRange.h>
|
|
||||||
|
|
||||||
#include <xrpl/basics/chrono.h>
|
#include <xrpl/basics/chrono.h>
|
||||||
#include <xrpl/beast/hash/uhash.h>
|
#include <xrpl/beast/hash/uhash.h>
|
||||||
|
#include <xrpl/ledger/detail/ReadViewFwdRange.h>
|
||||||
#include <xrpl/protocol/Fees.h>
|
#include <xrpl/protocol/Fees.h>
|
||||||
#include <xrpl/protocol/IOUAmount.h>
|
#include <xrpl/protocol/IOUAmount.h>
|
||||||
#include <xrpl/protocol/Indexes.h>
|
#include <xrpl/protocol/Indexes.h>
|
||||||
@@ -280,6 +279,6 @@ makeRulesGivenLedger(
|
|||||||
|
|
||||||
} // namespace ripple
|
} // namespace ripple
|
||||||
|
|
||||||
#include <xrpld/ledger/detail/ReadViewFwdRange.ipp>
|
#include <xrpl/ledger/detail/ReadViewFwdRange.ipp>
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
#ifndef RIPPLE_LEDGER_SANDBOX_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_SANDBOX_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_SANDBOX_H_INCLUDED
|
#define RIPPLE_LEDGER_SANDBOX_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/RawView.h>
|
#include <xrpl/ledger/RawView.h>
|
||||||
#include <xrpld/ledger/detail/ApplyViewBase.h>
|
#include <xrpl/ledger/detail/ApplyViewBase.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|
||||||
@@ -20,11 +20,10 @@
|
|||||||
#ifndef RIPPLE_LEDGER_VIEW_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_VIEW_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_VIEW_H_INCLUDED
|
#define RIPPLE_LEDGER_VIEW_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/ApplyView.h>
|
|
||||||
#include <xrpld/ledger/OpenView.h>
|
|
||||||
#include <xrpld/ledger/ReadView.h>
|
|
||||||
|
|
||||||
#include <xrpl/beast/utility/Journal.h>
|
#include <xrpl/beast/utility/Journal.h>
|
||||||
|
#include <xrpl/ledger/ApplyView.h>
|
||||||
|
#include <xrpl/ledger/OpenView.h>
|
||||||
|
#include <xrpl/ledger/ReadView.h>
|
||||||
#include <xrpl/protocol/Indexes.h>
|
#include <xrpl/protocol/Indexes.h>
|
||||||
#include <xrpl/protocol/MPTIssue.h>
|
#include <xrpl/protocol/MPTIssue.h>
|
||||||
#include <xrpl/protocol/Protocol.h>
|
#include <xrpl/protocol/Protocol.h>
|
||||||
@@ -562,12 +561,28 @@ createPseudoAccount(
|
|||||||
[[nodiscard]] bool
|
[[nodiscard]] bool
|
||||||
isPseudoAccount(std::shared_ptr<SLE const> sleAcct);
|
isPseudoAccount(std::shared_ptr<SLE const> sleAcct);
|
||||||
|
|
||||||
|
// Returns the list of fields that define an ACCOUNT_ROOT as a pseudo-account if
|
||||||
|
// set
|
||||||
|
// Pseudo-account designator fields MUST be maintained by including the
|
||||||
|
// SField::sMD_PseudoAccount flag in the SField definition. (Don't forget to
|
||||||
|
// "| SField::sMD_Default"!) The fields do NOT need to be amendment-gated,
|
||||||
|
// since a non-active amendment will not set any field, by definition.
|
||||||
|
// Specific properties of a pseudo-account are NOT checked here, that's what
|
||||||
|
// InvariantCheck is for.
|
||||||
|
[[nodiscard]] std::vector<SField const*> const&
|
||||||
|
getPseudoAccountFields();
|
||||||
|
|
||||||
[[nodiscard]] inline bool
|
[[nodiscard]] inline bool
|
||||||
isPseudoAccount(ReadView const& view, AccountID accountId)
|
isPseudoAccount(ReadView const& view, AccountID accountId)
|
||||||
{
|
{
|
||||||
return isPseudoAccount(view.read(keylet::account(accountId)));
|
return isPseudoAccount(view.read(keylet::account(accountId)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] TER
|
||||||
|
canAddHolding(ReadView const& view, Asset const& asset);
|
||||||
|
|
||||||
|
/// Any transactors that call addEmptyHolding() in doApply must call
|
||||||
|
/// canAddHolding() in preflight with the same View and Asset
|
||||||
[[nodiscard]] TER
|
[[nodiscard]] TER
|
||||||
addEmptyHolding(
|
addEmptyHolding(
|
||||||
ApplyView& view,
|
ApplyView& view,
|
||||||
@@ -719,7 +734,8 @@ rippleUnlockEscrowMPT(
|
|||||||
ApplyView& view,
|
ApplyView& view,
|
||||||
AccountID const& uGrantorID,
|
AccountID const& uGrantorID,
|
||||||
AccountID const& uGranteeID,
|
AccountID const& uGranteeID,
|
||||||
STAmount const& saAmount,
|
STAmount const& netAmount,
|
||||||
|
STAmount const& grossAmount,
|
||||||
beast::Journal j);
|
beast::Journal j);
|
||||||
|
|
||||||
/** Calls static accountSendIOU if saAmount represents Issue.
|
/** Calls static accountSendIOU if saAmount represents Issue.
|
||||||
@@ -20,11 +20,10 @@
|
|||||||
#ifndef RIPPLE_LEDGER_APPLYSTATETABLE_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_APPLYSTATETABLE_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_APPLYSTATETABLE_H_INCLUDED
|
#define RIPPLE_LEDGER_APPLYSTATETABLE_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/OpenView.h>
|
|
||||||
#include <xrpld/ledger/RawView.h>
|
|
||||||
#include <xrpld/ledger/ReadView.h>
|
|
||||||
|
|
||||||
#include <xrpl/beast/utility/Journal.h>
|
#include <xrpl/beast/utility/Journal.h>
|
||||||
|
#include <xrpl/ledger/OpenView.h>
|
||||||
|
#include <xrpl/ledger/RawView.h>
|
||||||
|
#include <xrpl/ledger/ReadView.h>
|
||||||
#include <xrpl/protocol/TER.h>
|
#include <xrpl/protocol/TER.h>
|
||||||
#include <xrpl/protocol/TxMeta.h>
|
#include <xrpl/protocol/TxMeta.h>
|
||||||
#include <xrpl/protocol/XRPAmount.h>
|
#include <xrpl/protocol/XRPAmount.h>
|
||||||
@@ -20,10 +20,9 @@
|
|||||||
#ifndef RIPPLE_LEDGER_APPLYVIEWBASE_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_APPLYVIEWBASE_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_APPLYVIEWBASE_H_INCLUDED
|
#define RIPPLE_LEDGER_APPLYVIEWBASE_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/ApplyView.h>
|
#include <xrpl/ledger/ApplyView.h>
|
||||||
#include <xrpld/ledger/ReadView.h>
|
#include <xrpl/ledger/ReadView.h>
|
||||||
#include <xrpld/ledger/detail/ApplyStateTable.h>
|
#include <xrpl/ledger/detail/ApplyStateTable.h>
|
||||||
|
|
||||||
#include <xrpl/protocol/XRPAmount.h>
|
#include <xrpl/protocol/XRPAmount.h>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
@@ -20,8 +20,8 @@
|
|||||||
#ifndef RIPPLE_LEDGER_RAWSTATETABLE_H_INCLUDED
|
#ifndef RIPPLE_LEDGER_RAWSTATETABLE_H_INCLUDED
|
||||||
#define RIPPLE_LEDGER_RAWSTATETABLE_H_INCLUDED
|
#define RIPPLE_LEDGER_RAWSTATETABLE_H_INCLUDED
|
||||||
|
|
||||||
#include <xrpld/ledger/RawView.h>
|
#include <xrpl/ledger/RawView.h>
|
||||||
#include <xrpld/ledger/ReadView.h>
|
#include <xrpl/ledger/ReadView.h>
|
||||||
|
|
||||||
#include <boost/container/pmr/monotonic_buffer_resource.hpp>
|
#include <boost/container/pmr/monotonic_buffer_resource.hpp>
|
||||||
#include <boost/container/pmr/polymorphic_allocator.hpp>
|
#include <boost/container/pmr/polymorphic_allocator.hpp>
|
||||||
@@ -47,7 +47,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
AutoSocket(
|
AutoSocket(
|
||||||
boost::asio::io_context& s,
|
boost::asio::io_service& s,
|
||||||
boost::asio::ssl::context& c,
|
boost::asio::ssl::context& c,
|
||||||
bool secureOnly,
|
bool secureOnly,
|
||||||
bool plainOnly)
|
bool plainOnly)
|
||||||
@@ -58,7 +58,7 @@ public:
|
|||||||
mSocket = std::make_unique<ssl_socket>(s, c);
|
mSocket = std::make_unique<ssl_socket>(s, c);
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoSocket(boost::asio::io_context& s, boost::asio::ssl::context& c)
|
AutoSocket(boost::asio::io_service& s, boost::asio::ssl::context& c)
|
||||||
: AutoSocket(s, c, false, false)
|
: AutoSocket(s, c, false, false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#include <xrpl/basics/ByteUtilities.h>
|
#include <xrpl/basics/ByteUtilities.h>
|
||||||
#include <xrpl/beast/utility/Journal.h>
|
#include <xrpl/beast/utility/Journal.h>
|
||||||
|
|
||||||
#include <boost/asio/io_context.hpp>
|
#include <boost/asio/io_service.hpp>
|
||||||
#include <boost/asio/streambuf.hpp>
|
#include <boost/asio/streambuf.hpp>
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@@ -51,7 +51,7 @@ public:
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
get(bool bSSL,
|
get(bool bSSL,
|
||||||
boost::asio::io_context& io_context,
|
boost::asio::io_service& io_service,
|
||||||
std::deque<std::string> deqSites,
|
std::deque<std::string> deqSites,
|
||||||
unsigned short const port,
|
unsigned short const port,
|
||||||
std::string const& strPath,
|
std::string const& strPath,
|
||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
get(bool bSSL,
|
get(bool bSSL,
|
||||||
boost::asio::io_context& io_context,
|
boost::asio::io_service& io_service,
|
||||||
std::string strSite,
|
std::string strSite,
|
||||||
unsigned short const port,
|
unsigned short const port,
|
||||||
std::string const& strPath,
|
std::string const& strPath,
|
||||||
@@ -80,7 +80,7 @@ public:
|
|||||||
static void
|
static void
|
||||||
request(
|
request(
|
||||||
bool bSSL,
|
bool bSSL,
|
||||||
boost::asio::io_context& io_context,
|
boost::asio::io_service& io_service,
|
||||||
std::string strSite,
|
std::string strSite,
|
||||||
unsigned short const port,
|
unsigned short const port,
|
||||||
std::function<
|
std::function<
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ public:
|
|||||||
{
|
{
|
||||||
strm.set_verify_callback(
|
strm.set_verify_callback(
|
||||||
std::bind(
|
std::bind(
|
||||||
&rfc6125_verify,
|
&rfc2818_verify,
|
||||||
host,
|
host,
|
||||||
std::placeholders::_1,
|
std::placeholders::_1,
|
||||||
std::placeholders::_2,
|
std::placeholders::_2,
|
||||||
@@ -167,7 +167,7 @@ public:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief callback invoked for name verification - just passes through
|
* @brief callback invoked for name verification - just passes through
|
||||||
* to the asio `host_name_verification` (rfc6125) implementation.
|
* to the asio rfc2818 implementation.
|
||||||
*
|
*
|
||||||
* @param domain hostname expected
|
* @param domain hostname expected
|
||||||
* @param preverified passed by implementation
|
* @param preverified passed by implementation
|
||||||
@@ -175,13 +175,13 @@ public:
|
|||||||
* @param j journal for logging
|
* @param j journal for logging
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
rfc6125_verify(
|
rfc2818_verify(
|
||||||
std::string const& domain,
|
std::string const& domain,
|
||||||
bool preverified,
|
bool preverified,
|
||||||
boost::asio::ssl::verify_context& ctx,
|
boost::asio::ssl::verify_context& ctx,
|
||||||
beast::Journal j)
|
beast::Journal j)
|
||||||
{
|
{
|
||||||
if (boost::asio::ssl::host_name_verification(domain)(preverified, ctx))
|
if (boost::asio::ssl::rfc2818_verification(domain)(preverified, ctx))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
JLOG(j.warn()) << "Outbound SSL connection to " << domain
|
JLOG(j.warn()) << "Outbound SSL connection to " << domain
|
||||||
|
|||||||
@@ -1,565 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2019 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef BASICS_FEES_H_INCLUDED
|
|
||||||
#define BASICS_FEES_H_INCLUDED
|
|
||||||
|
|
||||||
#include <xrpl/basics/safe_cast.h>
|
|
||||||
#include <xrpl/beast/utility/Zero.h>
|
|
||||||
#include <xrpl/beast/utility/instrumentation.h>
|
|
||||||
#include <xrpl/json/json_value.h>
|
|
||||||
|
|
||||||
#include <boost/multiprecision/cpp_int.hpp>
|
|
||||||
#include <boost/operators.hpp>
|
|
||||||
|
|
||||||
#include <iosfwd>
|
|
||||||
#include <limits>
|
|
||||||
#include <optional>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
|
|
||||||
namespace feeunit {
|
|
||||||
|
|
||||||
/** "drops" are the smallest divisible amount of XRP. This is what most
|
|
||||||
of the code uses. */
|
|
||||||
struct dropTag;
|
|
||||||
/** "fee units" calculations are a not-really-unitless value that is used
|
|
||||||
to express the cost of a given transaction vs. a reference transaction.
|
|
||||||
They are primarily used by the Transactor classes. */
|
|
||||||
struct feeunitTag;
|
|
||||||
/** "fee levels" are used by the transaction queue to compare the relative
|
|
||||||
cost of transactions that require different levels of effort to process.
|
|
||||||
See also: src/ripple/app/misc/FeeEscalation.md#fee-level */
|
|
||||||
struct feelevelTag;
|
|
||||||
/** unitless values are plain scalars wrapped in a TaggedFee. They are
|
|
||||||
used for calculations in this header. */
|
|
||||||
struct unitlessTag;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using enable_if_unit_t = typename std::enable_if_t<
|
|
||||||
std::is_class_v<T> && std::is_object_v<typename T::unit_type> &&
|
|
||||||
std::is_object_v<typename T::value_type>>;
|
|
||||||
|
|
||||||
/** `is_usable_unit_v` is checked to ensure that only values with
|
|
||||||
known valid type tags can be used (sometimes transparently) in
|
|
||||||
non-fee contexts. At the time of implementation, this includes
|
|
||||||
all known tags, but more may be added in the future, and they
|
|
||||||
should not be added automatically unless determined to be
|
|
||||||
appropriate.
|
|
||||||
*/
|
|
||||||
template <class T, class = enable_if_unit_t<T>>
|
|
||||||
constexpr bool is_usable_unit_v =
|
|
||||||
std::is_same_v<typename T::unit_type, feeunitTag> ||
|
|
||||||
std::is_same_v<typename T::unit_type, feelevelTag> ||
|
|
||||||
std::is_same_v<typename T::unit_type, unitlessTag> ||
|
|
||||||
std::is_same_v<typename T::unit_type, dropTag>;
|
|
||||||
|
|
||||||
template <class UnitTag, class T>
|
|
||||||
class TaggedFee : private boost::totally_ordered<TaggedFee<UnitTag, T>>,
|
|
||||||
private boost::additive<TaggedFee<UnitTag, T>>,
|
|
||||||
private boost::equality_comparable<TaggedFee<UnitTag, T>, T>,
|
|
||||||
private boost::dividable<TaggedFee<UnitTag, T>, T>,
|
|
||||||
private boost::modable<TaggedFee<UnitTag, T>, T>,
|
|
||||||
private boost::unit_steppable<TaggedFee<UnitTag, T>>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
using unit_type = UnitTag;
|
|
||||||
using value_type = T;
|
|
||||||
|
|
||||||
private:
|
|
||||||
value_type fee_;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
template <class Other>
|
|
||||||
static constexpr bool is_compatible_v =
|
|
||||||
std::is_arithmetic_v<Other> && std::is_arithmetic_v<value_type> &&
|
|
||||||
std::is_convertible_v<Other, value_type>;
|
|
||||||
|
|
||||||
template <class OtherFee, class = enable_if_unit_t<OtherFee>>
|
|
||||||
static constexpr bool is_compatiblefee_v =
|
|
||||||
is_compatible_v<typename OtherFee::value_type> &&
|
|
||||||
std::is_same_v<UnitTag, typename OtherFee::unit_type>;
|
|
||||||
|
|
||||||
template <class Other>
|
|
||||||
using enable_if_compatible_t =
|
|
||||||
typename std::enable_if_t<is_compatible_v<Other>>;
|
|
||||||
|
|
||||||
template <class OtherFee>
|
|
||||||
using enable_if_compatiblefee_t =
|
|
||||||
typename std::enable_if_t<is_compatiblefee_v<OtherFee>>;
|
|
||||||
|
|
||||||
public:
|
|
||||||
TaggedFee() = default;
|
|
||||||
constexpr TaggedFee(TaggedFee const& other) = default;
|
|
||||||
constexpr TaggedFee&
|
|
||||||
operator=(TaggedFee const& other) = default;
|
|
||||||
|
|
||||||
constexpr explicit TaggedFee(beast::Zero) : fee_(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr TaggedFee&
|
|
||||||
operator=(beast::Zero)
|
|
||||||
{
|
|
||||||
fee_ = 0;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr explicit TaggedFee(value_type fee) : fee_(fee)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
TaggedFee&
|
|
||||||
operator=(value_type fee)
|
|
||||||
{
|
|
||||||
fee_ = fee;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Instances with the same unit, and a type that is
|
|
||||||
"safe" to convert to this one can be converted
|
|
||||||
implicitly */
|
|
||||||
template <
|
|
||||||
class Other,
|
|
||||||
class = std::enable_if_t<
|
|
||||||
is_compatible_v<Other> &&
|
|
||||||
is_safetocasttovalue_v<value_type, Other>>>
|
|
||||||
constexpr TaggedFee(TaggedFee<unit_type, Other> const& fee)
|
|
||||||
: TaggedFee(safe_cast<value_type>(fee.fee()))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr TaggedFee
|
|
||||||
operator*(value_type const& rhs) const
|
|
||||||
{
|
|
||||||
return TaggedFee{fee_ * rhs};
|
|
||||||
}
|
|
||||||
|
|
||||||
friend constexpr TaggedFee
|
|
||||||
operator*(value_type lhs, TaggedFee const& rhs)
|
|
||||||
{
|
|
||||||
// multiplication is commutative
|
|
||||||
return rhs * lhs;
|
|
||||||
}
|
|
||||||
|
|
||||||
constexpr value_type
|
|
||||||
operator/(TaggedFee const& rhs) const
|
|
||||||
{
|
|
||||||
return fee_ / rhs.fee_;
|
|
||||||
}
|
|
||||||
|
|
||||||
TaggedFee&
|
|
||||||
operator+=(TaggedFee const& other)
|
|
||||||
{
|
|
||||||
fee_ += other.fee();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
TaggedFee&
|
|
||||||
operator-=(TaggedFee const& other)
|
|
||||||
{
|
|
||||||
fee_ -= other.fee();
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
TaggedFee&
|
|
||||||
operator++()
|
|
||||||
{
|
|
||||||
++fee_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
TaggedFee&
|
|
||||||
operator--()
|
|
||||||
{
|
|
||||||
--fee_;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
TaggedFee&
|
|
||||||
operator*=(value_type const& rhs)
|
|
||||||
{
|
|
||||||
fee_ *= rhs;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
TaggedFee&
|
|
||||||
operator/=(value_type const& rhs)
|
|
||||||
{
|
|
||||||
fee_ /= rhs;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class transparent = value_type>
|
|
||||||
std::enable_if_t<std::is_integral_v<transparent>, TaggedFee&>
|
|
||||||
operator%=(value_type const& rhs)
|
|
||||||
{
|
|
||||||
fee_ %= rhs;
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
TaggedFee
|
|
||||||
operator-() const
|
|
||||||
{
|
|
||||||
static_assert(
|
|
||||||
std::is_signed_v<T>, "- operator illegal on unsigned fee types");
|
|
||||||
return TaggedFee{-fee_};
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
operator==(TaggedFee const& other) const
|
|
||||||
{
|
|
||||||
return fee_ == other.fee_;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Other, class = enable_if_compatible_t<Other>>
|
|
||||||
bool
|
|
||||||
operator==(TaggedFee<unit_type, Other> const& other) const
|
|
||||||
{
|
|
||||||
return fee_ == other.fee();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
operator==(value_type other) const
|
|
||||||
{
|
|
||||||
return fee_ == other;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Other, class = enable_if_compatible_t<Other>>
|
|
||||||
bool
|
|
||||||
operator!=(TaggedFee<unit_type, Other> const& other) const
|
|
||||||
{
|
|
||||||
return !operator==(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
operator<(TaggedFee const& other) const
|
|
||||||
{
|
|
||||||
return fee_ < other.fee_;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns true if the amount is not zero */
|
|
||||||
explicit constexpr
|
|
||||||
operator bool() const noexcept
|
|
||||||
{
|
|
||||||
return fee_ != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Return the sign of the amount */
|
|
||||||
constexpr int
|
|
||||||
signum() const noexcept
|
|
||||||
{
|
|
||||||
return (fee_ < 0) ? -1 : (fee_ ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns the number of drops */
|
|
||||||
constexpr value_type
|
|
||||||
fee() const
|
|
||||||
{
|
|
||||||
return fee_;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Other>
|
|
||||||
constexpr double
|
|
||||||
decimalFromReference(TaggedFee<unit_type, Other> reference) const
|
|
||||||
{
|
|
||||||
return static_cast<double>(fee_) / reference.fee();
|
|
||||||
}
|
|
||||||
|
|
||||||
// `is_usable_unit_v` is checked to ensure that only values with
|
|
||||||
// known valid type tags can be converted to JSON. At the time
|
|
||||||
// of implementation, that includes all known tags, but more may
|
|
||||||
// be added in the future.
|
|
||||||
std::enable_if_t<is_usable_unit_v<TaggedFee>, Json::Value>
|
|
||||||
jsonClipped() const
|
|
||||||
{
|
|
||||||
if constexpr (std::is_integral_v<value_type>)
|
|
||||||
{
|
|
||||||
using jsontype = std::conditional_t<
|
|
||||||
std::is_signed_v<value_type>,
|
|
||||||
Json::Int,
|
|
||||||
Json::UInt>;
|
|
||||||
|
|
||||||
constexpr auto min = std::numeric_limits<jsontype>::min();
|
|
||||||
constexpr auto max = std::numeric_limits<jsontype>::max();
|
|
||||||
|
|
||||||
if (fee_ < min)
|
|
||||||
return min;
|
|
||||||
if (fee_ > max)
|
|
||||||
return max;
|
|
||||||
return static_cast<jsontype>(fee_);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return fee_;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns the underlying value. Code SHOULD NOT call this
|
|
||||||
function unless the type has been abstracted away,
|
|
||||||
e.g. in a templated function.
|
|
||||||
*/
|
|
||||||
constexpr value_type
|
|
||||||
value() const
|
|
||||||
{
|
|
||||||
return fee_;
|
|
||||||
}
|
|
||||||
|
|
||||||
friend std::istream&
|
|
||||||
operator>>(std::istream& s, TaggedFee& val)
|
|
||||||
{
|
|
||||||
s >> val.fee_;
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Output Fees as just their numeric value.
|
|
||||||
template <class Char, class Traits, class UnitTag, class T>
|
|
||||||
std::basic_ostream<Char, Traits>&
|
|
||||||
operator<<(std::basic_ostream<Char, Traits>& os, TaggedFee<UnitTag, T> const& q)
|
|
||||||
{
|
|
||||||
return os << q.value();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class UnitTag, class T>
|
|
||||||
std::string
|
|
||||||
to_string(TaggedFee<UnitTag, T> const& amount)
|
|
||||||
{
|
|
||||||
return std::to_string(amount.fee());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Source, class = enable_if_unit_t<Source>>
|
|
||||||
constexpr bool can_muldiv_source_v =
|
|
||||||
std::is_convertible_v<typename Source::value_type, std::uint64_t>;
|
|
||||||
|
|
||||||
template <class Dest, class = enable_if_unit_t<Dest>>
|
|
||||||
constexpr bool can_muldiv_dest_v =
|
|
||||||
can_muldiv_source_v<Dest> && // Dest is also a source
|
|
||||||
std::is_convertible_v<std::uint64_t, typename Dest::value_type> &&
|
|
||||||
sizeof(typename Dest::value_type) >= sizeof(std::uint64_t);
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Source1,
|
|
||||||
class Source2,
|
|
||||||
class = enable_if_unit_t<Source1>,
|
|
||||||
class = enable_if_unit_t<Source2>>
|
|
||||||
constexpr bool can_muldiv_sources_v =
|
|
||||||
can_muldiv_source_v<Source1> && can_muldiv_source_v<Source2> &&
|
|
||||||
std::is_same_v<typename Source1::unit_type, typename Source2::unit_type>;
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Source1,
|
|
||||||
class Source2,
|
|
||||||
class Dest,
|
|
||||||
class = enable_if_unit_t<Source1>,
|
|
||||||
class = enable_if_unit_t<Source2>,
|
|
||||||
class = enable_if_unit_t<Dest>>
|
|
||||||
constexpr bool can_muldiv_v =
|
|
||||||
can_muldiv_sources_v<Source1, Source2> && can_muldiv_dest_v<Dest>;
|
|
||||||
// Source and Dest can be the same by default
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Source1,
|
|
||||||
class Source2,
|
|
||||||
class Dest,
|
|
||||||
class = enable_if_unit_t<Source1>,
|
|
||||||
class = enable_if_unit_t<Source2>,
|
|
||||||
class = enable_if_unit_t<Dest>>
|
|
||||||
constexpr bool can_muldiv_commute_v = can_muldiv_v<Source1, Source2, Dest> &&
|
|
||||||
!std::is_same_v<typename Source1::unit_type, typename Dest::unit_type>;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using enable_muldiv_source_t =
|
|
||||||
typename std::enable_if_t<can_muldiv_source_v<T>>;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using enable_muldiv_dest_t = typename std::enable_if_t<can_muldiv_dest_v<T>>;
|
|
||||||
|
|
||||||
template <class Source1, class Source2>
|
|
||||||
using enable_muldiv_sources_t =
|
|
||||||
typename std::enable_if_t<can_muldiv_sources_v<Source1, Source2>>;
|
|
||||||
|
|
||||||
template <class Source1, class Source2, class Dest>
|
|
||||||
using enable_muldiv_t =
|
|
||||||
typename std::enable_if_t<can_muldiv_v<Source1, Source2, Dest>>;
|
|
||||||
|
|
||||||
template <class Source1, class Source2, class Dest>
|
|
||||||
using enable_muldiv_commute_t =
|
|
||||||
typename std::enable_if_t<can_muldiv_commute_v<Source1, Source2, Dest>>;
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
TaggedFee<unitlessTag, T>
|
|
||||||
scalar(T value)
|
|
||||||
{
|
|
||||||
return TaggedFee<unitlessTag, T>{value};
|
|
||||||
}
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Source1,
|
|
||||||
class Source2,
|
|
||||||
class Dest,
|
|
||||||
class = enable_muldiv_t<Source1, Source2, Dest>>
|
|
||||||
std::optional<Dest>
|
|
||||||
mulDivU(Source1 value, Dest mul, Source2 div)
|
|
||||||
{
|
|
||||||
// Fees can never be negative in any context.
|
|
||||||
if (value.value() < 0 || mul.value() < 0 || div.value() < 0)
|
|
||||||
{
|
|
||||||
// split the asserts so if one hits, the user can tell which
|
|
||||||
// without a debugger.
|
|
||||||
XRPL_ASSERT(
|
|
||||||
value.value() >= 0,
|
|
||||||
"ripple::feeunit::mulDivU : minimum value input");
|
|
||||||
XRPL_ASSERT(
|
|
||||||
mul.value() >= 0, "ripple::feeunit::mulDivU : minimum mul input");
|
|
||||||
XRPL_ASSERT(
|
|
||||||
div.value() >= 0, "ripple::feeunit::mulDivU : minimum div input");
|
|
||||||
return std::nullopt;
|
|
||||||
}
|
|
||||||
|
|
||||||
using desttype = typename Dest::value_type;
|
|
||||||
constexpr auto max = std::numeric_limits<desttype>::max();
|
|
||||||
|
|
||||||
// Shortcuts, since these happen a lot in the real world
|
|
||||||
if (value == div)
|
|
||||||
return mul;
|
|
||||||
if (mul.value() == div.value())
|
|
||||||
{
|
|
||||||
if (value.value() > max)
|
|
||||||
return std::nullopt;
|
|
||||||
return Dest{static_cast<desttype>(value.value())};
|
|
||||||
}
|
|
||||||
|
|
||||||
using namespace boost::multiprecision;
|
|
||||||
|
|
||||||
uint128_t product;
|
|
||||||
product = multiply(
|
|
||||||
product,
|
|
||||||
static_cast<std::uint64_t>(value.value()),
|
|
||||||
static_cast<std::uint64_t>(mul.value()));
|
|
||||||
|
|
||||||
auto quotient = product / div.value();
|
|
||||||
|
|
||||||
if (quotient > max)
|
|
||||||
return std::nullopt;
|
|
||||||
|
|
||||||
return Dest{static_cast<desttype>(quotient)};
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace feeunit
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
using FeeLevel = feeunit::TaggedFee<feeunit::feelevelTag, T>;
|
|
||||||
using FeeLevel64 = FeeLevel<std::uint64_t>;
|
|
||||||
using FeeLevelDouble = FeeLevel<double>;
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Source1,
|
|
||||||
class Source2,
|
|
||||||
class Dest,
|
|
||||||
class = feeunit::enable_muldiv_t<Source1, Source2, Dest>>
|
|
||||||
std::optional<Dest>
|
|
||||||
mulDiv(Source1 value, Dest mul, Source2 div)
|
|
||||||
{
|
|
||||||
return feeunit::mulDivU(value, mul, div);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Source1,
|
|
||||||
class Source2,
|
|
||||||
class Dest,
|
|
||||||
class = feeunit::enable_muldiv_commute_t<Source1, Source2, Dest>>
|
|
||||||
std::optional<Dest>
|
|
||||||
mulDiv(Dest value, Source1 mul, Source2 div)
|
|
||||||
{
|
|
||||||
// Multiplication is commutative
|
|
||||||
return feeunit::mulDivU(mul, value, div);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Dest, class = feeunit::enable_muldiv_dest_t<Dest>>
|
|
||||||
std::optional<Dest>
|
|
||||||
mulDiv(std::uint64_t value, Dest mul, std::uint64_t div)
|
|
||||||
{
|
|
||||||
// Give the scalars a non-tag so the
|
|
||||||
// unit-handling version gets called.
|
|
||||||
return feeunit::mulDivU(feeunit::scalar(value), mul, feeunit::scalar(div));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Dest, class = feeunit::enable_muldiv_dest_t<Dest>>
|
|
||||||
std::optional<Dest>
|
|
||||||
mulDiv(Dest value, std::uint64_t mul, std::uint64_t div)
|
|
||||||
{
|
|
||||||
// Multiplication is commutative
|
|
||||||
return mulDiv(mul, value, div);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Source1,
|
|
||||||
class Source2,
|
|
||||||
class = feeunit::enable_muldiv_sources_t<Source1, Source2>>
|
|
||||||
std::optional<std::uint64_t>
|
|
||||||
mulDiv(Source1 value, std::uint64_t mul, Source2 div)
|
|
||||||
{
|
|
||||||
// Give the scalars a dimensionless unit so the
|
|
||||||
// unit-handling version gets called.
|
|
||||||
auto unitresult = feeunit::mulDivU(value, feeunit::scalar(mul), div);
|
|
||||||
|
|
||||||
if (!unitresult)
|
|
||||||
return std::nullopt;
|
|
||||||
|
|
||||||
return unitresult->value();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Source1,
|
|
||||||
class Source2,
|
|
||||||
class = feeunit::enable_muldiv_sources_t<Source1, Source2>>
|
|
||||||
std::optional<std::uint64_t>
|
|
||||||
mulDiv(std::uint64_t value, Source1 mul, Source2 div)
|
|
||||||
{
|
|
||||||
// Multiplication is commutative
|
|
||||||
return mulDiv(mul, value, div);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Dest, class Src>
|
|
||||||
constexpr std::enable_if_t<
|
|
||||||
std::is_same_v<typename Dest::unit_type, typename Src::unit_type> &&
|
|
||||||
std::is_integral_v<typename Dest::value_type> &&
|
|
||||||
std::is_integral_v<typename Src::value_type>,
|
|
||||||
Dest>
|
|
||||||
safe_cast(Src s) noexcept
|
|
||||||
{
|
|
||||||
// Dest may not have an explicit value constructor
|
|
||||||
return Dest{safe_cast<typename Dest::value_type>(s.value())};
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Dest, class Src>
|
|
||||||
constexpr std::enable_if_t<
|
|
||||||
std::is_same_v<typename Dest::unit_type, typename Src::unit_type> &&
|
|
||||||
std::is_integral_v<typename Dest::value_type> &&
|
|
||||||
std::is_integral_v<typename Src::value_type>,
|
|
||||||
Dest>
|
|
||||||
unsafe_cast(Src s) noexcept
|
|
||||||
{
|
|
||||||
// Dest may not have an explicit value constructor
|
|
||||||
return Dest{unsafe_cast<typename Dest::value_type>(s.value())};
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace ripple
|
|
||||||
|
|
||||||
#endif // BASICS_FEES_H_INCLUDED
|
|
||||||
@@ -287,9 +287,11 @@ delegate(AccountID const& account, AccountID const& authorizedAccount) noexcept;
|
|||||||
Keylet
|
Keylet
|
||||||
bridge(STXChainBridge const& bridge, STXChainBridge::ChainType chainType);
|
bridge(STXChainBridge const& bridge, STXChainBridge::ChainType chainType);
|
||||||
|
|
||||||
|
// `seq` is stored as `sfXChainClaimID` in the object
|
||||||
Keylet
|
Keylet
|
||||||
xChainClaimID(STXChainBridge const& bridge, std::uint64_t seq);
|
xChainClaimID(STXChainBridge const& bridge, std::uint64_t seq);
|
||||||
|
|
||||||
|
// `seq` is stored as `sfXChainAccountCreateCount` in the object
|
||||||
Keylet
|
Keylet
|
||||||
xChainCreateAccountClaimID(STXChainBridge const& bridge, std::uint64_t seq);
|
xChainCreateAccountClaimID(STXChainBridge const& bridge, std::uint64_t seq);
|
||||||
|
|
||||||
@@ -349,19 +351,6 @@ permissionedDomain(AccountID const& account, std::uint32_t seq) noexcept;
|
|||||||
|
|
||||||
Keylet
|
Keylet
|
||||||
permissionedDomain(uint256 const& domainID) noexcept;
|
permissionedDomain(uint256 const& domainID) noexcept;
|
||||||
|
|
||||||
Keylet
|
|
||||||
subscription(
|
|
||||||
AccountID const& account,
|
|
||||||
AccountID const& dest,
|
|
||||||
std::uint32_t const& seq) noexcept;
|
|
||||||
|
|
||||||
inline Keylet
|
|
||||||
subscription(uint256 const& key) noexcept
|
|
||||||
{
|
|
||||||
return {ltSUBSCRIPTION, key};
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace keylet
|
} // namespace keylet
|
||||||
|
|
||||||
// Everything below is deprecated and should be removed in favor of keylets:
|
// Everything below is deprecated and should be removed in favor of keylets:
|
||||||
|
|||||||
@@ -56,12 +56,13 @@ enum LedgerEntryType : std::uint16_t
|
|||||||
#pragma push_macro("LEDGER_ENTRY")
|
#pragma push_macro("LEDGER_ENTRY")
|
||||||
#undef LEDGER_ENTRY
|
#undef LEDGER_ENTRY
|
||||||
|
|
||||||
#define LEDGER_ENTRY(tag, value, name, rpcName, fields) tag = value,
|
#define LEDGER_ENTRY(tag, value, ...) tag = value,
|
||||||
|
|
||||||
#include <xrpl/protocol/detail/ledger_entries.macro>
|
#include <xrpl/protocol/detail/ledger_entries.macro>
|
||||||
|
|
||||||
#undef LEDGER_ENTRY
|
#undef LEDGER_ENTRY
|
||||||
#pragma pop_macro("LEDGER_ENTRY")
|
#pragma pop_macro("LEDGER_ENTRY")
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
/** A special type, matching any ledger entry type.
|
/** A special type, matching any ledger entry type.
|
||||||
|
|
||||||
@@ -187,6 +188,15 @@ enum LedgerSpecificFlags {
|
|||||||
lsfMPTCanTransfer = 0x00000020,
|
lsfMPTCanTransfer = 0x00000020,
|
||||||
lsfMPTCanClawback = 0x00000040,
|
lsfMPTCanClawback = 0x00000040,
|
||||||
|
|
||||||
|
lsmfMPTCanMutateCanLock = 0x00000002,
|
||||||
|
lsmfMPTCanMutateRequireAuth = 0x00000004,
|
||||||
|
lsmfMPTCanMutateCanEscrow = 0x00000008,
|
||||||
|
lsmfMPTCanMutateCanTrade = 0x00000010,
|
||||||
|
lsmfMPTCanMutateCanTransfer = 0x00000020,
|
||||||
|
lsmfMPTCanMutateCanClawback = 0x00000040,
|
||||||
|
lsmfMPTCanMutateMetadata = 0x00010000,
|
||||||
|
lsmfMPTCanMutateTransferFee = 0x00020000,
|
||||||
|
|
||||||
// ltMPTOKEN
|
// ltMPTOKEN
|
||||||
lsfMPTAuthorized = 0x00000002,
|
lsfMPTAuthorized = 0x00000002,
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,8 @@
|
|||||||
#ifndef RIPPLE_PROTOCOL_PERMISSION_H_INCLUDED
|
#ifndef RIPPLE_PROTOCOL_PERMISSION_H_INCLUDED
|
||||||
#define RIPPLE_PROTOCOL_PERMISSION_H_INCLUDED
|
#define RIPPLE_PROTOCOL_PERMISSION_H_INCLUDED
|
||||||
|
|
||||||
|
#include <xrpl/protocol/Rules.h>
|
||||||
|
#include <xrpl/protocol/TER.h>
|
||||||
#include <xrpl/protocol/TxFormats.h>
|
#include <xrpl/protocol/TxFormats.h>
|
||||||
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
@@ -53,6 +55,8 @@ class Permission
|
|||||||
private:
|
private:
|
||||||
Permission();
|
Permission();
|
||||||
|
|
||||||
|
std::unordered_map<std::uint16_t, uint256> txFeatureMap_;
|
||||||
|
|
||||||
std::unordered_map<std::uint16_t, Delegation> delegatableTx_;
|
std::unordered_map<std::uint16_t, Delegation> delegatableTx_;
|
||||||
|
|
||||||
std::unordered_map<std::string, GranularPermissionType>
|
std::unordered_map<std::string, GranularPermissionType>
|
||||||
@@ -70,6 +74,9 @@ public:
|
|||||||
Permission&
|
Permission&
|
||||||
operator=(Permission const&) = delete;
|
operator=(Permission const&) = delete;
|
||||||
|
|
||||||
|
std::optional<std::string>
|
||||||
|
getPermissionName(std::uint32_t const value) const;
|
||||||
|
|
||||||
std::optional<std::uint32_t>
|
std::optional<std::uint32_t>
|
||||||
getGranularValue(std::string const& name) const;
|
getGranularValue(std::string const& name) const;
|
||||||
|
|
||||||
@@ -79,8 +86,12 @@ public:
|
|||||||
std::optional<TxType>
|
std::optional<TxType>
|
||||||
getGranularTxType(GranularPermissionType const& gpType) const;
|
getGranularTxType(GranularPermissionType const& gpType) const;
|
||||||
|
|
||||||
|
std::optional<std::reference_wrapper<uint256 const>> const
|
||||||
|
getTxFeature(TxType txType) const;
|
||||||
|
|
||||||
bool
|
bool
|
||||||
isDelegatable(std::uint32_t const& permissionValue) const;
|
isDelegatable(std::uint32_t const& permissionValue, Rules const& rules)
|
||||||
|
const;
|
||||||
|
|
||||||
// for tx level permission, permission value is equal to tx type plus one
|
// for tx level permission, permission value is equal to tx type plus one
|
||||||
uint32_t
|
uint32_t
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
|
|
||||||
#include <xrpl/basics/ByteUtilities.h>
|
#include <xrpl/basics/ByteUtilities.h>
|
||||||
#include <xrpl/basics/base_uint.h>
|
#include <xrpl/basics/base_uint.h>
|
||||||
#include <xrpl/basics/partitioned_unordered_map.h>
|
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
@@ -56,7 +55,10 @@ std::size_t constexpr oversizeMetaDataCap = 5200;
|
|||||||
/** The maximum number of entries per directory page */
|
/** The maximum number of entries per directory page */
|
||||||
std::size_t constexpr dirNodeMaxEntries = 32;
|
std::size_t constexpr dirNodeMaxEntries = 32;
|
||||||
|
|
||||||
/** The maximum number of pages allowed in a directory */
|
/** The maximum number of pages allowed in a directory
|
||||||
|
|
||||||
|
Made obsolete by fixDirectoryLimit amendment.
|
||||||
|
*/
|
||||||
std::uint64_t constexpr dirNodeMaxPages = 262144;
|
std::uint64_t constexpr dirNodeMaxPages = 262144;
|
||||||
|
|
||||||
/** The maximum number of items in an NFT page */
|
/** The maximum number of items in an NFT page */
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include <xrpl/basics/safe_cast.h>
|
#include <xrpl/basics/safe_cast.h>
|
||||||
#include <xrpl/json/json_value.h>
|
#include <xrpl/json/json_value.h>
|
||||||
|
#include <xrpl/protocol/Units.h>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <map>
|
#include <map>
|
||||||
@@ -71,8 +72,10 @@ class STCurrency;
|
|||||||
STYPE(STI_VL, 7) \
|
STYPE(STI_VL, 7) \
|
||||||
STYPE(STI_ACCOUNT, 8) \
|
STYPE(STI_ACCOUNT, 8) \
|
||||||
STYPE(STI_NUMBER, 9) \
|
STYPE(STI_NUMBER, 9) \
|
||||||
|
STYPE(STI_INT32, 10) \
|
||||||
|
STYPE(STI_INT64, 11) \
|
||||||
\
|
\
|
||||||
/* 10-13 are reserved */ \
|
/* 12-13 are reserved */ \
|
||||||
STYPE(STI_OBJECT, 14) \
|
STYPE(STI_OBJECT, 14) \
|
||||||
STYPE(STI_ARRAY, 15) \
|
STYPE(STI_ARRAY, 15) \
|
||||||
\
|
\
|
||||||
@@ -149,7 +152,9 @@ public:
|
|||||||
sMD_DeleteFinal = 0x04, // final value when it is deleted
|
sMD_DeleteFinal = 0x04, // final value when it is deleted
|
||||||
sMD_Create = 0x08, // value when it's created
|
sMD_Create = 0x08, // value when it's created
|
||||||
sMD_Always = 0x10, // value when node containing it is affected at all
|
sMD_Always = 0x10, // value when node containing it is affected at all
|
||||||
sMD_BaseTen = 0x20,
|
sMD_BaseTen = 0x20, // value is treated as base 10, overriding behavior
|
||||||
|
sMD_PseudoAccount = 0x40, // if this field is set in an ACCOUNT_ROOT
|
||||||
|
// _only_, then it is a pseudo-account
|
||||||
sMD_Default =
|
sMD_Default =
|
||||||
sMD_ChangeOrig | sMD_ChangeNew | sMD_DeleteFinal | sMD_Create
|
sMD_ChangeOrig | sMD_ChangeNew | sMD_DeleteFinal | sMD_Create
|
||||||
};
|
};
|
||||||
@@ -184,7 +189,7 @@ public:
|
|||||||
char const* fn,
|
char const* fn,
|
||||||
int meta = sMD_Default,
|
int meta = sMD_Default,
|
||||||
IsSigning signing = IsSigning::yes);
|
IsSigning signing = IsSigning::yes);
|
||||||
explicit SField(private_access_tag_t, int fc);
|
explicit SField(private_access_tag_t, int fc, char const* fn);
|
||||||
|
|
||||||
static SField const&
|
static SField const&
|
||||||
getField(int fieldCode);
|
getField(int fieldCode);
|
||||||
@@ -297,7 +302,7 @@ public:
|
|||||||
static int
|
static int
|
||||||
compare(SField const& f1, SField const& f2);
|
compare(SField const& f1, SField const& f2);
|
||||||
|
|
||||||
static std::map<int, SField const*> const&
|
static std::unordered_map<int, SField const*> const&
|
||||||
getKnownCodeToField()
|
getKnownCodeToField()
|
||||||
{
|
{
|
||||||
return knownCodeToField;
|
return knownCodeToField;
|
||||||
@@ -305,7 +310,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static int num;
|
static int num;
|
||||||
static std::map<int, SField const*> knownCodeToField;
|
static std::unordered_map<int, SField const*> knownCodeToField;
|
||||||
|
static std::unordered_map<std::string, SField const*> knownNameToField;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** A field with a type known at compile time. */
|
/** A field with a type known at compile time. */
|
||||||
@@ -352,6 +358,9 @@ using SF_UINT256 = TypedField<STBitString<256>>;
|
|||||||
using SF_UINT384 = TypedField<STBitString<384>>;
|
using SF_UINT384 = TypedField<STBitString<384>>;
|
||||||
using SF_UINT512 = TypedField<STBitString<512>>;
|
using SF_UINT512 = TypedField<STBitString<512>>;
|
||||||
|
|
||||||
|
using SF_INT32 = TypedField<STInteger<std::int32_t>>;
|
||||||
|
using SF_INT64 = TypedField<STInteger<std::int64_t>>;
|
||||||
|
|
||||||
using SF_ACCOUNT = TypedField<STAccount>;
|
using SF_ACCOUNT = TypedField<STAccount>;
|
||||||
using SF_AMOUNT = TypedField<STAmount>;
|
using SF_AMOUNT = TypedField<STAmount>;
|
||||||
using SF_ISSUE = TypedField<STIssue>;
|
using SF_ISSUE = TypedField<STIssue>;
|
||||||
|
|||||||
@@ -81,6 +81,8 @@ using STUInt16 = STInteger<std::uint16_t>;
|
|||||||
using STUInt32 = STInteger<std::uint32_t>;
|
using STUInt32 = STInteger<std::uint32_t>;
|
||||||
using STUInt64 = STInteger<std::uint64_t>;
|
using STUInt64 = STInteger<std::uint64_t>;
|
||||||
|
|
||||||
|
using STInt32 = STInteger<std::int32_t>;
|
||||||
|
|
||||||
template <typename Integer>
|
template <typename Integer>
|
||||||
inline STInteger<Integer>::STInteger(Integer v) : value_(v)
|
inline STInteger<Integer>::STInteger(Integer v) : value_(v)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,7 +26,9 @@
|
|||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|
||||||
class Rules;
|
class Rules;
|
||||||
|
namespace test {
|
||||||
class Invariants_test;
|
class Invariants_test;
|
||||||
|
}
|
||||||
|
|
||||||
class STLedgerEntry final : public STObject, public CountedObject<STLedgerEntry>
|
class STLedgerEntry final : public STObject, public CountedObject<STLedgerEntry>
|
||||||
{
|
{
|
||||||
@@ -36,6 +38,8 @@ class STLedgerEntry final : public STObject, public CountedObject<STLedgerEntry>
|
|||||||
public:
|
public:
|
||||||
using pointer = std::shared_ptr<STLedgerEntry>;
|
using pointer = std::shared_ptr<STLedgerEntry>;
|
||||||
using ref = std::shared_ptr<STLedgerEntry> const&;
|
using ref = std::shared_ptr<STLedgerEntry> const&;
|
||||||
|
using const_pointer = std::shared_ptr<STLedgerEntry const>;
|
||||||
|
using const_ref = std::shared_ptr<STLedgerEntry const> const&;
|
||||||
|
|
||||||
/** Create an empty object with the given key and type. */
|
/** Create an empty object with the given key and type. */
|
||||||
explicit STLedgerEntry(Keylet const& k);
|
explicit STLedgerEntry(Keylet const& k);
|
||||||
@@ -54,7 +58,7 @@ public:
|
|||||||
getText() const override;
|
getText() const override;
|
||||||
|
|
||||||
Json::Value
|
Json::Value
|
||||||
getJson(JsonOptions options) const override;
|
getJson(JsonOptions options = JsonOptions::none) const override;
|
||||||
|
|
||||||
/** Returns the 'key' (or 'index') of this item.
|
/** Returns the 'key' (or 'index') of this item.
|
||||||
The key identifies this entry's position in
|
The key identifies this entry's position in
|
||||||
@@ -84,7 +88,8 @@ private:
|
|||||||
void
|
void
|
||||||
setSLEType();
|
setSLEType();
|
||||||
|
|
||||||
friend Invariants_test; // this test wants access to the private type_
|
friend test::Invariants_test; // this test wants access to the private
|
||||||
|
// type_
|
||||||
|
|
||||||
STBase*
|
STBase*
|
||||||
copy(std::size_t n, void* buf) const override;
|
copy(std::size_t n, void* buf) const override;
|
||||||
|
|||||||
@@ -25,7 +25,6 @@
|
|||||||
#include <xrpl/basics/chrono.h>
|
#include <xrpl/basics/chrono.h>
|
||||||
#include <xrpl/basics/contract.h>
|
#include <xrpl/basics/contract.h>
|
||||||
#include <xrpl/beast/utility/instrumentation.h>
|
#include <xrpl/beast/utility/instrumentation.h>
|
||||||
#include <xrpl/protocol/FeeUnits.h>
|
|
||||||
#include <xrpl/protocol/HashPrefix.h>
|
#include <xrpl/protocol/HashPrefix.h>
|
||||||
#include <xrpl/protocol/SOTemplate.h>
|
#include <xrpl/protocol/SOTemplate.h>
|
||||||
#include <xrpl/protocol/STAmount.h>
|
#include <xrpl/protocol/STAmount.h>
|
||||||
@@ -34,6 +33,7 @@
|
|||||||
#include <xrpl/protocol/STIssue.h>
|
#include <xrpl/protocol/STIssue.h>
|
||||||
#include <xrpl/protocol/STPathSet.h>
|
#include <xrpl/protocol/STPathSet.h>
|
||||||
#include <xrpl/protocol/STVector256.h>
|
#include <xrpl/protocol/STVector256.h>
|
||||||
|
#include <xrpl/protocol/Units.h>
|
||||||
#include <xrpl/protocol/detail/STVar.h>
|
#include <xrpl/protocol/detail/STVar.h>
|
||||||
|
|
||||||
#include <boost/iterator/transform_iterator.hpp>
|
#include <boost/iterator/transform_iterator.hpp>
|
||||||
@@ -231,6 +231,8 @@ public:
|
|||||||
getFieldH192(SField const& field) const;
|
getFieldH192(SField const& field) const;
|
||||||
uint256
|
uint256
|
||||||
getFieldH256(SField const& field) const;
|
getFieldH256(SField const& field) const;
|
||||||
|
std::int32_t
|
||||||
|
getFieldI32(SField const& field) const;
|
||||||
AccountID
|
AccountID
|
||||||
getAccountID(SField const& field) const;
|
getAccountID(SField const& field) const;
|
||||||
|
|
||||||
@@ -365,6 +367,8 @@ public:
|
|||||||
void
|
void
|
||||||
setFieldH256(SField const& field, uint256 const&);
|
setFieldH256(SField const& field, uint256 const&);
|
||||||
void
|
void
|
||||||
|
setFieldI32(SField const& field, std::int32_t);
|
||||||
|
void
|
||||||
setFieldVL(SField const& field, Blob const&);
|
setFieldVL(SField const& field, Blob const&);
|
||||||
void
|
void
|
||||||
setFieldVL(SField const& field, Slice const&);
|
setFieldVL(SField const& field, Slice const&);
|
||||||
|
|||||||
@@ -54,34 +54,6 @@ public:
|
|||||||
Json::Value error;
|
Json::Value error;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Holds the serialized result of parsing an input JSON array.
|
|
||||||
This does validation and checking on the provided JSON.
|
|
||||||
*/
|
|
||||||
class STParsedJSONArray
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** Parses and creates an STParsedJSON array.
|
|
||||||
The result of the parsing is stored in array and error.
|
|
||||||
Exceptions:
|
|
||||||
Does not throw.
|
|
||||||
@param name The name of the JSON field, used in diagnostics.
|
|
||||||
@param json The JSON-RPC to parse.
|
|
||||||
*/
|
|
||||||
STParsedJSONArray(std::string const& name, Json::Value const& json);
|
|
||||||
|
|
||||||
STParsedJSONArray() = delete;
|
|
||||||
STParsedJSONArray(STParsedJSONArray const&) = delete;
|
|
||||||
STParsedJSONArray&
|
|
||||||
operator=(STParsedJSONArray const&) = delete;
|
|
||||||
~STParsedJSONArray() = default;
|
|
||||||
|
|
||||||
/** The STArray if the parse was successful. */
|
|
||||||
std::optional<STArray> array;
|
|
||||||
|
|
||||||
/** On failure, an appropriate set of error values. */
|
|
||||||
Json::Value error;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace ripple
|
} // namespace ripple
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -22,10 +22,10 @@
|
|||||||
|
|
||||||
#include <xrpl/basics/Log.h>
|
#include <xrpl/basics/Log.h>
|
||||||
#include <xrpl/beast/utility/instrumentation.h>
|
#include <xrpl/beast/utility/instrumentation.h>
|
||||||
#include <xrpl/protocol/FeeUnits.h>
|
|
||||||
#include <xrpl/protocol/PublicKey.h>
|
#include <xrpl/protocol/PublicKey.h>
|
||||||
#include <xrpl/protocol/STObject.h>
|
#include <xrpl/protocol/STObject.h>
|
||||||
#include <xrpl/protocol/SecretKey.h>
|
#include <xrpl/protocol/SecretKey.h>
|
||||||
|
#include <xrpl/protocol/Units.h>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|||||||
@@ -673,7 +673,8 @@ isTerRetry(TER x) noexcept
|
|||||||
inline bool
|
inline bool
|
||||||
isTesSuccess(TER x) noexcept
|
isTesSuccess(TER x) noexcept
|
||||||
{
|
{
|
||||||
return (x == tesSUCCESS);
|
// Makes use of TERSubset::operator bool()
|
||||||
|
return !(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool
|
inline bool
|
||||||
|
|||||||
@@ -127,6 +127,8 @@ constexpr std::uint32_t tfTrustSetPermissionMask = ~(tfUniversal | tfSetfAuth |
|
|||||||
// EnableAmendment flags:
|
// EnableAmendment flags:
|
||||||
constexpr std::uint32_t tfGotMajority = 0x00010000;
|
constexpr std::uint32_t tfGotMajority = 0x00010000;
|
||||||
constexpr std::uint32_t tfLostMajority = 0x00020000;
|
constexpr std::uint32_t tfLostMajority = 0x00020000;
|
||||||
|
constexpr std::uint32_t tfChangeMask =
|
||||||
|
~( tfUniversal | tfGotMajority | tfLostMajority);
|
||||||
|
|
||||||
// PaymentChannelClaim flags:
|
// PaymentChannelClaim flags:
|
||||||
constexpr std::uint32_t tfRenew = 0x00010000;
|
constexpr std::uint32_t tfRenew = 0x00010000;
|
||||||
@@ -141,7 +143,8 @@ constexpr std::uint32_t const tfTransferable = 0x00000008;
|
|||||||
constexpr std::uint32_t const tfMutable = 0x00000010;
|
constexpr std::uint32_t const tfMutable = 0x00000010;
|
||||||
|
|
||||||
// MPTokenIssuanceCreate flags:
|
// MPTokenIssuanceCreate flags:
|
||||||
// NOTE - there is intentionally no flag here for lsfMPTLocked, which this transaction cannot mutate.
|
// Note: tf/lsfMPTLocked is intentionally omitted, since this transaction
|
||||||
|
// is not allowed to modify it.
|
||||||
constexpr std::uint32_t const tfMPTCanLock = lsfMPTCanLock;
|
constexpr std::uint32_t const tfMPTCanLock = lsfMPTCanLock;
|
||||||
constexpr std::uint32_t const tfMPTRequireAuth = lsfMPTRequireAuth;
|
constexpr std::uint32_t const tfMPTRequireAuth = lsfMPTRequireAuth;
|
||||||
constexpr std::uint32_t const tfMPTCanEscrow = lsfMPTCanEscrow;
|
constexpr std::uint32_t const tfMPTCanEscrow = lsfMPTCanEscrow;
|
||||||
@@ -151,6 +154,20 @@ constexpr std::uint32_t const tfMPTCanClawback = lsfMPTCanClawback;
|
|||||||
constexpr std::uint32_t const tfMPTokenIssuanceCreateMask =
|
constexpr std::uint32_t const tfMPTokenIssuanceCreateMask =
|
||||||
~(tfUniversal | tfMPTCanLock | tfMPTRequireAuth | tfMPTCanEscrow | tfMPTCanTrade | tfMPTCanTransfer | tfMPTCanClawback);
|
~(tfUniversal | tfMPTCanLock | tfMPTRequireAuth | tfMPTCanEscrow | tfMPTCanTrade | tfMPTCanTransfer | tfMPTCanClawback);
|
||||||
|
|
||||||
|
// MPTokenIssuanceCreate MutableFlags:
|
||||||
|
// Indicating specific fields or flags may be changed after issuance.
|
||||||
|
constexpr std::uint32_t const tmfMPTCanMutateCanLock = lsmfMPTCanMutateCanLock;
|
||||||
|
constexpr std::uint32_t const tmfMPTCanMutateRequireAuth = lsmfMPTCanMutateRequireAuth;
|
||||||
|
constexpr std::uint32_t const tmfMPTCanMutateCanEscrow = lsmfMPTCanMutateCanEscrow;
|
||||||
|
constexpr std::uint32_t const tmfMPTCanMutateCanTrade = lsmfMPTCanMutateCanTrade;
|
||||||
|
constexpr std::uint32_t const tmfMPTCanMutateCanTransfer = lsmfMPTCanMutateCanTransfer;
|
||||||
|
constexpr std::uint32_t const tmfMPTCanMutateCanClawback = lsmfMPTCanMutateCanClawback;
|
||||||
|
constexpr std::uint32_t const tmfMPTCanMutateMetadata = lsmfMPTCanMutateMetadata;
|
||||||
|
constexpr std::uint32_t const tmfMPTCanMutateTransferFee = lsmfMPTCanMutateTransferFee;
|
||||||
|
constexpr std::uint32_t const tmfMPTokenIssuanceCreateMutableMask =
|
||||||
|
~(tmfMPTCanMutateCanLock | tmfMPTCanMutateRequireAuth | tmfMPTCanMutateCanEscrow | tmfMPTCanMutateCanTrade
|
||||||
|
| tmfMPTCanMutateCanTransfer | tmfMPTCanMutateCanClawback | tmfMPTCanMutateMetadata | tmfMPTCanMutateTransferFee);
|
||||||
|
|
||||||
// MPTokenAuthorize flags:
|
// MPTokenAuthorize flags:
|
||||||
constexpr std::uint32_t const tfMPTUnauthorize = 0x00000001;
|
constexpr std::uint32_t const tfMPTUnauthorize = 0x00000001;
|
||||||
constexpr std::uint32_t const tfMPTokenAuthorizeMask = ~(tfUniversal | tfMPTUnauthorize);
|
constexpr std::uint32_t const tfMPTokenAuthorizeMask = ~(tfUniversal | tfMPTUnauthorize);
|
||||||
@@ -161,6 +178,25 @@ constexpr std::uint32_t const tfMPTUnlock = 0x00000002;
|
|||||||
constexpr std::uint32_t const tfMPTokenIssuanceSetMask = ~(tfUniversal | tfMPTLock | tfMPTUnlock);
|
constexpr std::uint32_t const tfMPTokenIssuanceSetMask = ~(tfUniversal | tfMPTLock | tfMPTUnlock);
|
||||||
constexpr std::uint32_t const tfMPTokenIssuanceSetPermissionMask = ~(tfUniversal | tfMPTLock | tfMPTUnlock);
|
constexpr std::uint32_t const tfMPTokenIssuanceSetPermissionMask = ~(tfUniversal | tfMPTLock | tfMPTUnlock);
|
||||||
|
|
||||||
|
// MPTokenIssuanceSet MutableFlags:
|
||||||
|
// Set or Clear flags.
|
||||||
|
constexpr std::uint32_t const tmfMPTSetCanLock = 0x00000001;
|
||||||
|
constexpr std::uint32_t const tmfMPTClearCanLock = 0x00000002;
|
||||||
|
constexpr std::uint32_t const tmfMPTSetRequireAuth = 0x00000004;
|
||||||
|
constexpr std::uint32_t const tmfMPTClearRequireAuth = 0x00000008;
|
||||||
|
constexpr std::uint32_t const tmfMPTSetCanEscrow = 0x00000010;
|
||||||
|
constexpr std::uint32_t const tmfMPTClearCanEscrow = 0x00000020;
|
||||||
|
constexpr std::uint32_t const tmfMPTSetCanTrade = 0x00000040;
|
||||||
|
constexpr std::uint32_t const tmfMPTClearCanTrade = 0x00000080;
|
||||||
|
constexpr std::uint32_t const tmfMPTSetCanTransfer = 0x00000100;
|
||||||
|
constexpr std::uint32_t const tmfMPTClearCanTransfer = 0x00000200;
|
||||||
|
constexpr std::uint32_t const tmfMPTSetCanClawback = 0x00000400;
|
||||||
|
constexpr std::uint32_t const tmfMPTClearCanClawback = 0x00000800;
|
||||||
|
constexpr std::uint32_t const tmfMPTokenIssuanceSetMutableMask = ~(tmfMPTSetCanLock | tmfMPTClearCanLock |
|
||||||
|
tmfMPTSetRequireAuth | tmfMPTClearRequireAuth | tmfMPTSetCanEscrow | tmfMPTClearCanEscrow |
|
||||||
|
tmfMPTSetCanTrade | tmfMPTClearCanTrade | tmfMPTSetCanTransfer | tmfMPTClearCanTransfer |
|
||||||
|
tmfMPTSetCanClawback | tmfMPTClearCanClawback);
|
||||||
|
|
||||||
// MPTokenIssuanceDestroy flags:
|
// MPTokenIssuanceDestroy flags:
|
||||||
constexpr std::uint32_t const tfMPTokenIssuanceDestroyMask = ~tfUniversal;
|
constexpr std::uint32_t const tfMPTokenIssuanceDestroyMask = ~tfUniversal;
|
||||||
|
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ enum TxType : std::uint16_t
|
|||||||
#pragma push_macro("TRANSACTION")
|
#pragma push_macro("TRANSACTION")
|
||||||
#undef TRANSACTION
|
#undef TRANSACTION
|
||||||
|
|
||||||
#define TRANSACTION(tag, value, name, delegatable, fields) tag = value,
|
#define TRANSACTION(tag, value, ...) tag = value,
|
||||||
|
|
||||||
#include <xrpl/protocol/detail/transactions.macro>
|
#include <xrpl/protocol/detail/transactions.macro>
|
||||||
|
|
||||||
|
|||||||
555
include/xrpl/protocol/Units.h
Normal file
555
include/xrpl/protocol/Units.h
Normal file
@@ -0,0 +1,555 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of rippled: https://github.com/ripple/rippled
|
||||||
|
Copyright (c) 2019 Ripple Labs Inc.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PROTOCOL_UNITS_H_INCLUDED
|
||||||
|
#define PROTOCOL_UNITS_H_INCLUDED
|
||||||
|
|
||||||
|
#include <xrpl/basics/safe_cast.h>
|
||||||
|
#include <xrpl/beast/utility/Zero.h>
|
||||||
|
#include <xrpl/beast/utility/instrumentation.h>
|
||||||
|
#include <xrpl/json/json_value.h>
|
||||||
|
|
||||||
|
#include <boost/multiprecision/cpp_int.hpp>
|
||||||
|
#include <boost/operators.hpp>
|
||||||
|
|
||||||
|
#include <iosfwd>
|
||||||
|
#include <limits>
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
|
namespace ripple {
|
||||||
|
|
||||||
|
namespace unit {
|
||||||
|
|
||||||
|
/** "drops" are the smallest divisible amount of XRP. This is what most
|
||||||
|
of the code uses. */
|
||||||
|
struct dropTag;
|
||||||
|
/** "fee levels" are used by the transaction queue to compare the relative
|
||||||
|
cost of transactions that require different levels of effort to process.
|
||||||
|
See also: src/ripple/app/misc/FeeEscalation.md#fee-level */
|
||||||
|
struct feelevelTag;
|
||||||
|
/** unitless values are plain scalars wrapped in a ValueUnit. They are
|
||||||
|
used for calculations in this header. */
|
||||||
|
struct unitlessTag;
|
||||||
|
|
||||||
|
/** Units to represent basis points (bips) and 1/10 basis points */
|
||||||
|
class BipsTag;
|
||||||
|
class TenthBipsTag;
|
||||||
|
|
||||||
|
// These names don't have to be too descriptive, because we're in the "unit"
|
||||||
|
// namespace.
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
concept Valid = std::is_class_v<T> && std::is_object_v<typename T::unit_type> &&
|
||||||
|
std::is_object_v<typename T::value_type>;
|
||||||
|
|
||||||
|
/** `Usable` is checked to ensure that only values with
|
||||||
|
known valid type tags can be used (sometimes transparently) in
|
||||||
|
non-unit contexts. At the time of implementation, this includes
|
||||||
|
all known tags, but more may be added in the future, and they
|
||||||
|
should not be added automatically unless determined to be
|
||||||
|
appropriate.
|
||||||
|
*/
|
||||||
|
template <class T>
|
||||||
|
concept Usable = Valid<T> &&
|
||||||
|
(std::is_same_v<typename T::unit_type, feelevelTag> ||
|
||||||
|
std::is_same_v<typename T::unit_type, unitlessTag> ||
|
||||||
|
std::is_same_v<typename T::unit_type, dropTag> ||
|
||||||
|
std::is_same_v<typename T::unit_type, BipsTag> ||
|
||||||
|
std::is_same_v<typename T::unit_type, TenthBipsTag>);
|
||||||
|
|
||||||
|
template <class Other, class VU>
|
||||||
|
concept Compatible = Valid<VU> && std::is_arithmetic_v<Other> &&
|
||||||
|
std::is_arithmetic_v<typename VU::value_type> &&
|
||||||
|
std::is_convertible_v<Other, typename VU::value_type>;
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
concept Integral = std::is_integral_v<T>;
|
||||||
|
|
||||||
|
template <class VU>
|
||||||
|
concept IntegralValue = Integral<typename VU::value_type>;
|
||||||
|
|
||||||
|
template <class VU1, class VU2>
|
||||||
|
concept CastableValue = IntegralValue<VU1> && IntegralValue<VU2> &&
|
||||||
|
std::is_same_v<typename VU1::unit_type, typename VU2::unit_type>;
|
||||||
|
|
||||||
|
template <class UnitTag, class T>
|
||||||
|
class ValueUnit : private boost::totally_ordered<ValueUnit<UnitTag, T>>,
|
||||||
|
private boost::additive<ValueUnit<UnitTag, T>>,
|
||||||
|
private boost::equality_comparable<ValueUnit<UnitTag, T>, T>,
|
||||||
|
private boost::dividable<ValueUnit<UnitTag, T>, T>,
|
||||||
|
private boost::modable<ValueUnit<UnitTag, T>, T>,
|
||||||
|
private boost::unit_steppable<ValueUnit<UnitTag, T>>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using unit_type = UnitTag;
|
||||||
|
using value_type = T;
|
||||||
|
|
||||||
|
private:
|
||||||
|
value_type value_;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ValueUnit() = default;
|
||||||
|
constexpr ValueUnit(ValueUnit const& other) = default;
|
||||||
|
constexpr ValueUnit&
|
||||||
|
operator=(ValueUnit const& other) = default;
|
||||||
|
|
||||||
|
constexpr explicit ValueUnit(beast::Zero) : value_(0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ValueUnit&
|
||||||
|
operator=(beast::Zero)
|
||||||
|
{
|
||||||
|
value_ = 0;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr explicit ValueUnit(value_type value) : value_(value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ValueUnit&
|
||||||
|
operator=(value_type value)
|
||||||
|
{
|
||||||
|
value_ = value;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Instances with the same unit, and a type that is
|
||||||
|
"safe" to convert to this one can be converted
|
||||||
|
implicitly */
|
||||||
|
template <Compatible<ValueUnit> Other>
|
||||||
|
constexpr ValueUnit(ValueUnit<unit_type, Other> const& value)
|
||||||
|
requires SafeToCast<Other, value_type>
|
||||||
|
: ValueUnit(safe_cast<value_type>(value.value()))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ValueUnit
|
||||||
|
operator+(value_type const& rhs) const
|
||||||
|
{
|
||||||
|
return ValueUnit{value_ + rhs};
|
||||||
|
}
|
||||||
|
|
||||||
|
friend constexpr ValueUnit
|
||||||
|
operator+(value_type lhs, ValueUnit const& rhs)
|
||||||
|
{
|
||||||
|
// addition is commutative
|
||||||
|
return rhs + lhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ValueUnit
|
||||||
|
operator-(value_type const& rhs) const
|
||||||
|
{
|
||||||
|
return ValueUnit{value_ - rhs};
|
||||||
|
}
|
||||||
|
|
||||||
|
friend constexpr ValueUnit
|
||||||
|
operator-(value_type lhs, ValueUnit const& rhs)
|
||||||
|
{
|
||||||
|
// subtraction is NOT commutative, but (lhs + (-rhs)) is addition, which
|
||||||
|
// is
|
||||||
|
return -rhs + lhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr ValueUnit
|
||||||
|
operator*(value_type const& rhs) const
|
||||||
|
{
|
||||||
|
return ValueUnit{value_ * rhs};
|
||||||
|
}
|
||||||
|
|
||||||
|
friend constexpr ValueUnit
|
||||||
|
operator*(value_type lhs, ValueUnit const& rhs)
|
||||||
|
{
|
||||||
|
// multiplication is commutative
|
||||||
|
return rhs * lhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr value_type
|
||||||
|
operator/(ValueUnit const& rhs) const
|
||||||
|
{
|
||||||
|
return value_ / rhs.value_;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueUnit&
|
||||||
|
operator+=(ValueUnit const& other)
|
||||||
|
{
|
||||||
|
value_ += other.value();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueUnit&
|
||||||
|
operator-=(ValueUnit const& other)
|
||||||
|
{
|
||||||
|
value_ -= other.value();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueUnit&
|
||||||
|
operator++()
|
||||||
|
{
|
||||||
|
++value_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueUnit&
|
||||||
|
operator--()
|
||||||
|
{
|
||||||
|
--value_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueUnit&
|
||||||
|
operator*=(value_type const& rhs)
|
||||||
|
{
|
||||||
|
value_ *= rhs;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueUnit&
|
||||||
|
operator/=(value_type const& rhs)
|
||||||
|
{
|
||||||
|
value_ /= rhs;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <Integral transparent = value_type>
|
||||||
|
ValueUnit&
|
||||||
|
operator%=(value_type const& rhs)
|
||||||
|
{
|
||||||
|
value_ %= rhs;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ValueUnit
|
||||||
|
operator-() const
|
||||||
|
{
|
||||||
|
static_assert(
|
||||||
|
std::is_signed_v<T>, "- operator illegal on unsigned value types");
|
||||||
|
return ValueUnit{-value_};
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool
|
||||||
|
operator==(ValueUnit const& other) const
|
||||||
|
{
|
||||||
|
return value_ == other.value_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <Compatible<ValueUnit> Other>
|
||||||
|
constexpr bool
|
||||||
|
operator==(ValueUnit<unit_type, Other> const& other) const
|
||||||
|
{
|
||||||
|
return value_ == other.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool
|
||||||
|
operator==(value_type other) const
|
||||||
|
{
|
||||||
|
return value_ == other;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <Compatible<ValueUnit> Other>
|
||||||
|
constexpr bool
|
||||||
|
operator!=(ValueUnit<unit_type, Other> const& other) const
|
||||||
|
{
|
||||||
|
return !operator==(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr bool
|
||||||
|
operator<(ValueUnit const& other) const
|
||||||
|
{
|
||||||
|
return value_ < other.value_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns true if the amount is not zero */
|
||||||
|
explicit constexpr
|
||||||
|
operator bool() const noexcept
|
||||||
|
{
|
||||||
|
return value_ != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Return the sign of the amount */
|
||||||
|
constexpr int
|
||||||
|
signum() const noexcept
|
||||||
|
{
|
||||||
|
return (value_ < 0) ? -1 : (value_ ? 1 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the number of drops */
|
||||||
|
// TODO: Move this to a new class, maybe with the old "TaggedFee" name
|
||||||
|
constexpr value_type
|
||||||
|
fee() const
|
||||||
|
{
|
||||||
|
return value_;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Other>
|
||||||
|
constexpr double
|
||||||
|
decimalFromReference(ValueUnit<unit_type, Other> reference) const
|
||||||
|
{
|
||||||
|
return static_cast<double>(value_) / reference.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
// `Usable` is checked to ensure that only values with
|
||||||
|
// known valid type tags can be converted to JSON. At the time
|
||||||
|
// of implementation, that includes all known tags, but more may
|
||||||
|
// be added in the future.
|
||||||
|
Json::Value
|
||||||
|
jsonClipped() const
|
||||||
|
requires Usable<ValueUnit>
|
||||||
|
{
|
||||||
|
if constexpr (std::is_integral_v<value_type>)
|
||||||
|
{
|
||||||
|
using jsontype = std::conditional_t<
|
||||||
|
std::is_signed_v<value_type>,
|
||||||
|
Json::Int,
|
||||||
|
Json::UInt>;
|
||||||
|
|
||||||
|
constexpr auto min = std::numeric_limits<jsontype>::min();
|
||||||
|
constexpr auto max = std::numeric_limits<jsontype>::max();
|
||||||
|
|
||||||
|
if (value_ < min)
|
||||||
|
return min;
|
||||||
|
if (value_ > max)
|
||||||
|
return max;
|
||||||
|
return static_cast<jsontype>(value_);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return value_;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the underlying value. Code SHOULD NOT call this
|
||||||
|
function unless the type has been abstracted away,
|
||||||
|
e.g. in a templated function.
|
||||||
|
*/
|
||||||
|
constexpr value_type
|
||||||
|
value() const
|
||||||
|
{
|
||||||
|
return value_;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend std::istream&
|
||||||
|
operator>>(std::istream& s, ValueUnit& val)
|
||||||
|
{
|
||||||
|
s >> val.value_;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Output Values as just their numeric value.
|
||||||
|
template <class Char, class Traits, class UnitTag, class T>
|
||||||
|
std::basic_ostream<Char, Traits>&
|
||||||
|
operator<<(std::basic_ostream<Char, Traits>& os, ValueUnit<UnitTag, T> const& q)
|
||||||
|
{
|
||||||
|
return os << q.value();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class UnitTag, class T>
|
||||||
|
std::string
|
||||||
|
to_string(ValueUnit<UnitTag, T> const& amount)
|
||||||
|
{
|
||||||
|
return std::to_string(amount.value());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Source>
|
||||||
|
concept muldivSource = Valid<Source> &&
|
||||||
|
std::is_convertible_v<typename Source::value_type, std::uint64_t>;
|
||||||
|
|
||||||
|
template <class Dest>
|
||||||
|
concept muldivDest = muldivSource<Dest> && // Dest is also a source
|
||||||
|
std::is_convertible_v<std::uint64_t, typename Dest::value_type> &&
|
||||||
|
sizeof(typename Dest::value_type) >= sizeof(std::uint64_t);
|
||||||
|
|
||||||
|
template <class Source2, class Source1>
|
||||||
|
concept muldivSources = muldivSource<Source1> && muldivSource<Source2> &&
|
||||||
|
std::is_same_v<typename Source1::unit_type, typename Source2::unit_type>;
|
||||||
|
|
||||||
|
template <class Dest, class Source1, class Source2>
|
||||||
|
concept muldivable = muldivSources<Source1, Source2> && muldivDest<Dest>;
|
||||||
|
// Source and Dest can be the same by default
|
||||||
|
|
||||||
|
template <class Dest, class Source1, class Source2>
|
||||||
|
concept muldivCommutable = muldivable<Dest, Source1, Source2> &&
|
||||||
|
!std::is_same_v<typename Source1::unit_type, typename Dest::unit_type>;
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
ValueUnit<unitlessTag, T>
|
||||||
|
scalar(T value)
|
||||||
|
{
|
||||||
|
return ValueUnit<unitlessTag, T>{value};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Source1, class Source2, unit::muldivable<Source1, Source2> Dest>
|
||||||
|
std::optional<Dest>
|
||||||
|
mulDivU(Source1 value, Dest mul, Source2 div)
|
||||||
|
{
|
||||||
|
// values can never be negative in any context.
|
||||||
|
if (value.value() < 0 || mul.value() < 0 || div.value() < 0)
|
||||||
|
{
|
||||||
|
// split the asserts so if one hits, the user can tell which
|
||||||
|
// without a debugger.
|
||||||
|
XRPL_ASSERT(
|
||||||
|
value.value() >= 0, "ripple::unit::mulDivU : minimum value input");
|
||||||
|
XRPL_ASSERT(
|
||||||
|
mul.value() >= 0, "ripple::unit::mulDivU : minimum mul input");
|
||||||
|
XRPL_ASSERT(
|
||||||
|
div.value() > 0, "ripple::unit::mulDivU : minimum div input");
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
|
using desttype = typename Dest::value_type;
|
||||||
|
constexpr auto max = std::numeric_limits<desttype>::max();
|
||||||
|
|
||||||
|
// Shortcuts, since these happen a lot in the real world
|
||||||
|
if (value == div)
|
||||||
|
return mul;
|
||||||
|
if (mul.value() == div.value())
|
||||||
|
{
|
||||||
|
if (value.value() > max)
|
||||||
|
return std::nullopt;
|
||||||
|
return Dest{static_cast<desttype>(value.value())};
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace boost::multiprecision;
|
||||||
|
|
||||||
|
uint128_t product;
|
||||||
|
product = multiply(
|
||||||
|
product,
|
||||||
|
static_cast<std::uint64_t>(value.value()),
|
||||||
|
static_cast<std::uint64_t>(mul.value()));
|
||||||
|
|
||||||
|
auto quotient = product / div.value();
|
||||||
|
|
||||||
|
if (quotient > max)
|
||||||
|
return std::nullopt;
|
||||||
|
|
||||||
|
return Dest{static_cast<desttype>(quotient)};
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace unit
|
||||||
|
|
||||||
|
// Fee Levels
|
||||||
|
template <class T>
|
||||||
|
using FeeLevel = unit::ValueUnit<unit::feelevelTag, T>;
|
||||||
|
using FeeLevel64 = FeeLevel<std::uint64_t>;
|
||||||
|
using FeeLevelDouble = FeeLevel<double>;
|
||||||
|
|
||||||
|
// Basis points (Bips)
|
||||||
|
template <class T>
|
||||||
|
using Bips = unit::ValueUnit<unit::BipsTag, T>;
|
||||||
|
using Bips16 = Bips<std::uint16_t>;
|
||||||
|
using Bips32 = Bips<std::uint32_t>;
|
||||||
|
template <class T>
|
||||||
|
using TenthBips = unit::ValueUnit<unit::TenthBipsTag, T>;
|
||||||
|
using TenthBips16 = TenthBips<std::uint16_t>;
|
||||||
|
using TenthBips32 = TenthBips<std::uint32_t>;
|
||||||
|
|
||||||
|
template <class Source1, class Source2, unit::muldivable<Source1, Source2> Dest>
|
||||||
|
std::optional<Dest>
|
||||||
|
mulDiv(Source1 value, Dest mul, Source2 div)
|
||||||
|
{
|
||||||
|
return unit::mulDivU(value, mul, div);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <
|
||||||
|
class Source1,
|
||||||
|
class Source2,
|
||||||
|
unit::muldivCommutable<Source1, Source2> Dest>
|
||||||
|
std::optional<Dest>
|
||||||
|
mulDiv(Dest value, Source1 mul, Source2 div)
|
||||||
|
{
|
||||||
|
// Multiplication is commutative
|
||||||
|
return unit::mulDivU(mul, value, div);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <unit::muldivDest Dest>
|
||||||
|
std::optional<Dest>
|
||||||
|
mulDiv(std::uint64_t value, Dest mul, std::uint64_t div)
|
||||||
|
{
|
||||||
|
// Give the scalars a non-tag so the
|
||||||
|
// unit-handling version gets called.
|
||||||
|
return unit::mulDivU(unit::scalar(value), mul, unit::scalar(div));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <unit::muldivDest Dest>
|
||||||
|
std::optional<Dest>
|
||||||
|
mulDiv(Dest value, std::uint64_t mul, std::uint64_t div)
|
||||||
|
{
|
||||||
|
// Multiplication is commutative
|
||||||
|
return mulDiv(mul, value, div);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <unit::muldivSource Source1, unit::muldivSources<Source1> Source2>
|
||||||
|
std::optional<std::uint64_t>
|
||||||
|
mulDiv(Source1 value, std::uint64_t mul, Source2 div)
|
||||||
|
{
|
||||||
|
// Give the scalars a dimensionless unit so the
|
||||||
|
// unit-handling version gets called.
|
||||||
|
auto unitresult = unit::mulDivU(value, unit::scalar(mul), div);
|
||||||
|
|
||||||
|
if (!unitresult)
|
||||||
|
return std::nullopt;
|
||||||
|
|
||||||
|
return unitresult->value();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <unit::muldivSource Source1, unit::muldivSources<Source1> Source2>
|
||||||
|
std::optional<std::uint64_t>
|
||||||
|
mulDiv(std::uint64_t value, Source1 mul, Source2 div)
|
||||||
|
{
|
||||||
|
// Multiplication is commutative
|
||||||
|
return mulDiv(mul, value, div);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <unit::IntegralValue Dest, unit::CastableValue<Dest> Src>
|
||||||
|
constexpr Dest
|
||||||
|
safe_cast(Src s) noexcept
|
||||||
|
{
|
||||||
|
// Dest may not have an explicit value constructor
|
||||||
|
return Dest{safe_cast<typename Dest::value_type>(s.value())};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <unit::IntegralValue Dest, unit::Integral Src>
|
||||||
|
constexpr Dest
|
||||||
|
safe_cast(Src s) noexcept
|
||||||
|
{
|
||||||
|
// Dest may not have an explicit value constructor
|
||||||
|
return Dest{safe_cast<typename Dest::value_type>(s)};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <unit::IntegralValue Dest, unit::CastableValue<Dest> Src>
|
||||||
|
constexpr Dest
|
||||||
|
unsafe_cast(Src s) noexcept
|
||||||
|
{
|
||||||
|
// Dest may not have an explicit value constructor
|
||||||
|
return Dest{unsafe_cast<typename Dest::value_type>(s.value())};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <unit::IntegralValue Dest, unit::Integral Src>
|
||||||
|
constexpr Dest
|
||||||
|
unsafe_cast(Src s) noexcept
|
||||||
|
{
|
||||||
|
// Dest may not have an explicit value constructor
|
||||||
|
return Dest{unsafe_cast<typename Dest::value_type>(s)};
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace ripple
|
||||||
|
|
||||||
|
#endif // PROTOCOL_UNITS_H_INCLUDED
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
#include <xrpl/basics/contract.h>
|
#include <xrpl/basics/contract.h>
|
||||||
#include <xrpl/beast/utility/Zero.h>
|
#include <xrpl/beast/utility/Zero.h>
|
||||||
#include <xrpl/json/json_value.h>
|
#include <xrpl/json/json_value.h>
|
||||||
#include <xrpl/protocol/FeeUnits.h>
|
#include <xrpl/protocol/Units.h>
|
||||||
|
|
||||||
#include <boost/multiprecision/cpp_int.hpp>
|
#include <boost/multiprecision/cpp_int.hpp>
|
||||||
#include <boost/operators.hpp>
|
#include <boost/operators.hpp>
|
||||||
@@ -42,7 +42,7 @@ class XRPAmount : private boost::totally_ordered<XRPAmount>,
|
|||||||
private boost::additive<XRPAmount, std::int64_t>
|
private boost::additive<XRPAmount, std::int64_t>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using unit_type = feeunit::dropTag;
|
using unit_type = unit::dropTag;
|
||||||
using value_type = std::int64_t;
|
using value_type = std::int64_t;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -129,10 +129,12 @@ inplace_bigint_div_rem(std::span<uint64_t> numerator, std::uint64_t divisor)
|
|||||||
{
|
{
|
||||||
// should never happen, but if it does then it seems natural to define
|
// should never happen, but if it does then it seems natural to define
|
||||||
// the a null set of numbers to be zero, so the remainder is also zero.
|
// the a null set of numbers to be zero, so the remainder is also zero.
|
||||||
|
// LCOV_EXCL_START
|
||||||
UNREACHABLE(
|
UNREACHABLE(
|
||||||
"ripple::b58_fast::detail::inplace_bigint_div_rem : empty "
|
"ripple::b58_fast::detail::inplace_bigint_div_rem : empty "
|
||||||
"numerator");
|
"numerator");
|
||||||
return 0;
|
return 0;
|
||||||
|
// LCOV_EXCL_STOP
|
||||||
}
|
}
|
||||||
|
|
||||||
auto to_u128 = [](std::uint64_t high,
|
auto to_u128 = [](std::uint64_t high,
|
||||||
|
|||||||
@@ -29,12 +29,14 @@
|
|||||||
|
|
||||||
// Add new amendments to the top of this list.
|
// Add new amendments to the top of this list.
|
||||||
// Keep it sorted in reverse chronological order.
|
// Keep it sorted in reverse chronological order.
|
||||||
// If you add an amendment here, then do not forget to increment `numFeatures`
|
|
||||||
// in include/xrpl/protocol/Feature.h.
|
|
||||||
|
|
||||||
XRPL_FEATURE(Subscription, Supported::no, VoteBehavior::DefaultNo)
|
XRPL_FIX (DirectoryLimit, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
XRPL_FIX (PriceOracleOrder, Supported::no, VoteBehavior::DefaultNo)
|
XRPL_FIX (IncludeKeyletFields, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
XRPL_FIX (MPTDeliveredAmount, Supported::no, VoteBehavior::DefaultNo)
|
XRPL_FEATURE(DynamicMPT, Supported::no, VoteBehavior::DefaultNo)
|
||||||
|
XRPL_FIX (TokenEscrowV1, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
|
XRPL_FIX (DelegateV1_1, Supported::no, VoteBehavior::DefaultNo)
|
||||||
|
XRPL_FIX (PriceOracleOrder, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
|
XRPL_FIX (MPTDeliveredAmount, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
XRPL_FIX (AMMClawbackRounding, Supported::yes, VoteBehavior::DefaultNo)
|
XRPL_FIX (AMMClawbackRounding, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
XRPL_FEATURE(TokenEscrow, Supported::yes, VoteBehavior::DefaultNo)
|
XRPL_FEATURE(TokenEscrow, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
XRPL_FIX (EnforceNFTokenTrustlineV2, Supported::yes, VoteBehavior::DefaultNo)
|
XRPL_FIX (EnforceNFTokenTrustlineV2, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
@@ -42,7 +44,7 @@ XRPL_FIX (AMMv1_3, Supported::yes, VoteBehavior::DefaultNo
|
|||||||
XRPL_FEATURE(PermissionedDEX, Supported::yes, VoteBehavior::DefaultNo)
|
XRPL_FEATURE(PermissionedDEX, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
XRPL_FEATURE(Batch, Supported::yes, VoteBehavior::DefaultNo)
|
XRPL_FEATURE(Batch, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
XRPL_FEATURE(SingleAssetVault, Supported::no, VoteBehavior::DefaultNo)
|
XRPL_FEATURE(SingleAssetVault, Supported::no, VoteBehavior::DefaultNo)
|
||||||
XRPL_FEATURE(PermissionDelegation, Supported::yes, VoteBehavior::DefaultNo)
|
XRPL_FEATURE(PermissionDelegation, Supported::no, VoteBehavior::DefaultNo)
|
||||||
XRPL_FIX (PayChanCancelAfter, Supported::yes, VoteBehavior::DefaultNo)
|
XRPL_FIX (PayChanCancelAfter, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
// Check flags in Credential transactions
|
// Check flags in Credential transactions
|
||||||
XRPL_FIX (InvalidTxFlags, Supported::yes, VoteBehavior::DefaultNo)
|
XRPL_FIX (InvalidTxFlags, Supported::yes, VoteBehavior::DefaultNo)
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ LEDGER_ENTRY(ltNFTOKEN_PAGE, 0x0050, NFTokenPage, nft_page, ({
|
|||||||
// All fields are soeREQUIRED because there is always a SignerEntries.
|
// All fields are soeREQUIRED because there is always a SignerEntries.
|
||||||
// If there are no SignerEntries the node is deleted.
|
// If there are no SignerEntries the node is deleted.
|
||||||
LEDGER_ENTRY(ltSIGNER_LIST, 0x0053, SignerList, signer_list, ({
|
LEDGER_ENTRY(ltSIGNER_LIST, 0x0053, SignerList, signer_list, ({
|
||||||
|
{sfOwner, soeOPTIONAL},
|
||||||
{sfOwnerNode, soeREQUIRED},
|
{sfOwnerNode, soeREQUIRED},
|
||||||
{sfSignerQuorum, soeREQUIRED},
|
{sfSignerQuorum, soeREQUIRED},
|
||||||
{sfSignerEntries, soeREQUIRED},
|
{sfSignerEntries, soeREQUIRED},
|
||||||
@@ -188,7 +189,7 @@ LEDGER_ENTRY(ltDIR_NODE, 0x0064, DirectoryNode, directory, ({
|
|||||||
{sfNFTokenID, soeOPTIONAL},
|
{sfNFTokenID, soeOPTIONAL},
|
||||||
{sfPreviousTxnID, soeOPTIONAL},
|
{sfPreviousTxnID, soeOPTIONAL},
|
||||||
{sfPreviousTxnLgrSeq, soeOPTIONAL},
|
{sfPreviousTxnLgrSeq, soeOPTIONAL},
|
||||||
{sfDomainID, soeOPTIONAL}
|
{sfDomainID, soeOPTIONAL} // order book directories
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** The ledger object which lists details about amendments on the network.
|
/** The ledger object which lists details about amendments on the network.
|
||||||
@@ -343,6 +344,7 @@ LEDGER_ENTRY(ltXCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID, 0x0074, XChainOwnedCreateAc
|
|||||||
*/
|
*/
|
||||||
LEDGER_ENTRY(ltESCROW, 0x0075, Escrow, escrow, ({
|
LEDGER_ENTRY(ltESCROW, 0x0075, Escrow, escrow, ({
|
||||||
{sfAccount, soeREQUIRED},
|
{sfAccount, soeREQUIRED},
|
||||||
|
{sfSequence, soeOPTIONAL},
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED},
|
{sfAmount, soeREQUIRED},
|
||||||
{sfCondition, soeOPTIONAL},
|
{sfCondition, soeOPTIONAL},
|
||||||
@@ -365,6 +367,7 @@ LEDGER_ENTRY(ltESCROW, 0x0075, Escrow, escrow, ({
|
|||||||
LEDGER_ENTRY(ltPAYCHAN, 0x0078, PayChannel, payment_channel, ({
|
LEDGER_ENTRY(ltPAYCHAN, 0x0078, PayChannel, payment_channel, ({
|
||||||
{sfAccount, soeREQUIRED},
|
{sfAccount, soeREQUIRED},
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
|
{sfSequence, soeOPTIONAL},
|
||||||
{sfAmount, soeREQUIRED},
|
{sfAmount, soeREQUIRED},
|
||||||
{sfBalance, soeREQUIRED},
|
{sfBalance, soeREQUIRED},
|
||||||
{sfPublicKey, soeREQUIRED},
|
{sfPublicKey, soeREQUIRED},
|
||||||
@@ -412,6 +415,7 @@ LEDGER_ENTRY(ltMPTOKEN_ISSUANCE, 0x007e, MPTokenIssuance, mpt_issuance, ({
|
|||||||
{sfPreviousTxnID, soeREQUIRED},
|
{sfPreviousTxnID, soeREQUIRED},
|
||||||
{sfPreviousTxnLgrSeq, soeREQUIRED},
|
{sfPreviousTxnLgrSeq, soeREQUIRED},
|
||||||
{sfDomainID, soeOPTIONAL},
|
{sfDomainID, soeOPTIONAL},
|
||||||
|
{sfMutableFlags, soeDEFAULT},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** A ledger object which tracks MPToken
|
/** A ledger object which tracks MPToken
|
||||||
@@ -432,6 +436,7 @@ LEDGER_ENTRY(ltMPTOKEN, 0x007f, MPToken, mptoken, ({
|
|||||||
*/
|
*/
|
||||||
LEDGER_ENTRY(ltORACLE, 0x0080, Oracle, oracle, ({
|
LEDGER_ENTRY(ltORACLE, 0x0080, Oracle, oracle, ({
|
||||||
{sfOwner, soeREQUIRED},
|
{sfOwner, soeREQUIRED},
|
||||||
|
{sfOracleDocumentID, soeOPTIONAL},
|
||||||
{sfProvider, soeREQUIRED},
|
{sfProvider, soeREQUIRED},
|
||||||
{sfPriceDataSeries, soeREQUIRED},
|
{sfPriceDataSeries, soeREQUIRED},
|
||||||
{sfAssetClass, soeREQUIRED},
|
{sfAssetClass, soeREQUIRED},
|
||||||
@@ -452,7 +457,7 @@ LEDGER_ENTRY(ltCREDENTIAL, 0x0081, Credential, credential, ({
|
|||||||
{sfExpiration, soeOPTIONAL},
|
{sfExpiration, soeOPTIONAL},
|
||||||
{sfURI, soeOPTIONAL},
|
{sfURI, soeOPTIONAL},
|
||||||
{sfIssuerNode, soeREQUIRED},
|
{sfIssuerNode, soeREQUIRED},
|
||||||
{sfSubjectNode, soeREQUIRED},
|
{sfSubjectNode, soeOPTIONAL},
|
||||||
{sfPreviousTxnID, soeREQUIRED},
|
{sfPreviousTxnID, soeREQUIRED},
|
||||||
{sfPreviousTxnLgrSeq, soeREQUIRED},
|
{sfPreviousTxnLgrSeq, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
@@ -504,25 +509,5 @@ LEDGER_ENTRY(ltVAULT, 0x0084, Vault, vault, ({
|
|||||||
// no PermissionedDomainID ever (use MPTIssuance.sfDomainID)
|
// no PermissionedDomainID ever (use MPTIssuance.sfDomainID)
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** A ledger object representing a subscription.
|
|
||||||
|
|
||||||
\sa keylet::mptoken
|
|
||||||
*/
|
|
||||||
LEDGER_ENTRY(ltSUBSCRIPTION, 0x0085, Subscription, subscription, ({
|
|
||||||
{sfPreviousTxnID, soeREQUIRED},
|
|
||||||
{sfPreviousTxnLgrSeq, soeREQUIRED},
|
|
||||||
{sfSequence, soeREQUIRED},
|
|
||||||
{sfOwnerNode, soeREQUIRED},
|
|
||||||
{sfAccount, soeREQUIRED},
|
|
||||||
{sfDestination, soeREQUIRED},
|
|
||||||
{sfDestinationTag, soeOPTIONAL},
|
|
||||||
{sfAmount, soeREQUIRED},
|
|
||||||
{sfBalance, soeREQUIRED},
|
|
||||||
{sfFrequency, soeREQUIRED},
|
|
||||||
{sfNextClaimTime, soeREQUIRED},
|
|
||||||
{sfExpiration, soeOPTIONAL},
|
|
||||||
{sfDestinationNode, soeREQUIRED},
|
|
||||||
}))
|
|
||||||
|
|
||||||
#undef EXPAND
|
#undef EXPAND
|
||||||
#undef LEDGER_ENTRY_DUPLICATE
|
#undef LEDGER_ENTRY_DUPLICATE
|
||||||
|
|||||||
@@ -114,9 +114,7 @@ TYPED_SFIELD(sfVoteWeight, UINT32, 48)
|
|||||||
TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50)
|
TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50)
|
||||||
TYPED_SFIELD(sfOracleDocumentID, UINT32, 51)
|
TYPED_SFIELD(sfOracleDocumentID, UINT32, 51)
|
||||||
TYPED_SFIELD(sfPermissionValue, UINT32, 52)
|
TYPED_SFIELD(sfPermissionValue, UINT32, 52)
|
||||||
TYPED_SFIELD(sfFrequency, UINT32, 53)
|
TYPED_SFIELD(sfMutableFlags, UINT32, 53)
|
||||||
TYPED_SFIELD(sfStartTime, UINT32, 54)
|
|
||||||
TYPED_SFIELD(sfNextClaimTime, UINT32, 55)
|
|
||||||
|
|
||||||
// 64-bit integers (common)
|
// 64-bit integers (common)
|
||||||
TYPED_SFIELD(sfIndexNext, UINT64, 1)
|
TYPED_SFIELD(sfIndexNext, UINT64, 1)
|
||||||
@@ -176,7 +174,8 @@ TYPED_SFIELD(sfNFTokenID, UINT256, 10)
|
|||||||
TYPED_SFIELD(sfEmitParentTxnID, UINT256, 11)
|
TYPED_SFIELD(sfEmitParentTxnID, UINT256, 11)
|
||||||
TYPED_SFIELD(sfEmitNonce, UINT256, 12)
|
TYPED_SFIELD(sfEmitNonce, UINT256, 12)
|
||||||
TYPED_SFIELD(sfEmitHookHash, UINT256, 13)
|
TYPED_SFIELD(sfEmitHookHash, UINT256, 13)
|
||||||
TYPED_SFIELD(sfAMMID, UINT256, 14)
|
TYPED_SFIELD(sfAMMID, UINT256, 14,
|
||||||
|
SField::sMD_PseudoAccount | SField::sMD_Default)
|
||||||
|
|
||||||
// 256-bit (uncommon)
|
// 256-bit (uncommon)
|
||||||
TYPED_SFIELD(sfBookDirectory, UINT256, 16)
|
TYPED_SFIELD(sfBookDirectory, UINT256, 16)
|
||||||
@@ -198,9 +197,9 @@ TYPED_SFIELD(sfHookHash, UINT256, 31)
|
|||||||
TYPED_SFIELD(sfHookNamespace, UINT256, 32)
|
TYPED_SFIELD(sfHookNamespace, UINT256, 32)
|
||||||
TYPED_SFIELD(sfHookSetTxnID, UINT256, 33)
|
TYPED_SFIELD(sfHookSetTxnID, UINT256, 33)
|
||||||
TYPED_SFIELD(sfDomainID, UINT256, 34)
|
TYPED_SFIELD(sfDomainID, UINT256, 34)
|
||||||
TYPED_SFIELD(sfVaultID, UINT256, 35)
|
TYPED_SFIELD(sfVaultID, UINT256, 35,
|
||||||
|
SField::sMD_PseudoAccount | SField::sMD_Default)
|
||||||
TYPED_SFIELD(sfParentBatchID, UINT256, 36)
|
TYPED_SFIELD(sfParentBatchID, UINT256, 36)
|
||||||
TYPED_SFIELD(sfSubscriptionID, UINT256, 37)
|
|
||||||
|
|
||||||
// number (common)
|
// number (common)
|
||||||
TYPED_SFIELD(sfNumber, NUMBER, 1)
|
TYPED_SFIELD(sfNumber, NUMBER, 1)
|
||||||
@@ -209,6 +208,12 @@ TYPED_SFIELD(sfAssetsMaximum, NUMBER, 3)
|
|||||||
TYPED_SFIELD(sfAssetsTotal, NUMBER, 4)
|
TYPED_SFIELD(sfAssetsTotal, NUMBER, 4)
|
||||||
TYPED_SFIELD(sfLossUnrealized, NUMBER, 5)
|
TYPED_SFIELD(sfLossUnrealized, NUMBER, 5)
|
||||||
|
|
||||||
|
// int32
|
||||||
|
// NOTE: Do not use `sfDummyInt32`. It's so far the only use of INT32
|
||||||
|
// in this file and has been defined here for test only.
|
||||||
|
// TODO: Replace `sfDummyInt32` with actually useful field.
|
||||||
|
TYPED_SFIELD(sfDummyInt32, INT32, 1) // for tests only
|
||||||
|
|
||||||
// currency amount (common)
|
// currency amount (common)
|
||||||
TYPED_SFIELD(sfAmount, AMOUNT, 1)
|
TYPED_SFIELD(sfAmount, AMOUNT, 1)
|
||||||
TYPED_SFIELD(sfBalance, AMOUNT, 2)
|
TYPED_SFIELD(sfBalance, AMOUNT, 2)
|
||||||
|
|||||||
@@ -22,14 +22,32 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TRANSACTION(tag, value, name, delegatable, fields)
|
* TRANSACTION(tag, value, name, delegatable, amendments, privileges, fields)
|
||||||
|
*
|
||||||
|
* To ease maintenance, you may replace any unneeded values with "..."
|
||||||
|
* e.g. #define TRANSACTION(tag, value, name, ...)
|
||||||
*
|
*
|
||||||
* You must define a transactor class in the `ripple` namespace named `name`,
|
* You must define a transactor class in the `ripple` namespace named `name`,
|
||||||
* and include its header in `src/xrpld/app/tx/detail/applySteps.cpp`.
|
* and include its header alongside the TRANSACTOR definition using this
|
||||||
|
* format:
|
||||||
|
* #if TRANSACTION_INCLUDE
|
||||||
|
* # include <xrpld/app/tx/detail/HEADER.h>
|
||||||
|
* #endif
|
||||||
|
*
|
||||||
|
* The `privileges` parameter of the TRANSACTION macro is a bitfield
|
||||||
|
* defining which operations the transaction can perform.
|
||||||
|
* The values are defined and used in InvariantCheck.cpp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** This transaction type executes a payment. */
|
/** This transaction type executes a payment. */
|
||||||
TRANSACTION(ttPAYMENT, 0, Payment, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/Payment.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttPAYMENT, 0, Payment,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
createAcct,
|
||||||
|
({
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED, soeMPTSupported},
|
{sfAmount, soeREQUIRED, soeMPTSupported},
|
||||||
{sfSendMax, soeOPTIONAL, soeMPTSupported},
|
{sfSendMax, soeOPTIONAL, soeMPTSupported},
|
||||||
@@ -42,7 +60,14 @@ TRANSACTION(ttPAYMENT, 0, Payment, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type creates an escrow object. */
|
/** This transaction type creates an escrow object. */
|
||||||
TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/Escrow.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED, soeMPTSupported},
|
{sfAmount, soeREQUIRED, soeMPTSupported},
|
||||||
{sfCondition, soeOPTIONAL},
|
{sfCondition, soeOPTIONAL},
|
||||||
@@ -52,7 +77,11 @@ TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type completes an existing escrow. */
|
/** This transaction type completes an existing escrow. */
|
||||||
TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, Delegation::delegatable, ({
|
TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfOwner, soeREQUIRED},
|
{sfOwner, soeREQUIRED},
|
||||||
{sfOfferSequence, soeREQUIRED},
|
{sfOfferSequence, soeREQUIRED},
|
||||||
{sfFulfillment, soeOPTIONAL},
|
{sfFulfillment, soeOPTIONAL},
|
||||||
@@ -62,7 +91,14 @@ TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, Delegation::delegatable, ({
|
|||||||
|
|
||||||
|
|
||||||
/** This transaction type adjusts various account settings. */
|
/** This transaction type adjusts various account settings. */
|
||||||
TRANSACTION(ttACCOUNT_SET, 3, AccountSet, Delegation::notDelegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/SetAccount.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttACCOUNT_SET, 3, AccountSet,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfEmailHash, soeOPTIONAL},
|
{sfEmailHash, soeOPTIONAL},
|
||||||
{sfWalletLocator, soeOPTIONAL},
|
{sfWalletLocator, soeOPTIONAL},
|
||||||
{sfWalletSize, soeOPTIONAL},
|
{sfWalletSize, soeOPTIONAL},
|
||||||
@@ -76,20 +112,41 @@ TRANSACTION(ttACCOUNT_SET, 3, AccountSet, Delegation::notDelegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type cancels an existing escrow. */
|
/** This transaction type cancels an existing escrow. */
|
||||||
TRANSACTION(ttESCROW_CANCEL, 4, EscrowCancel, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/Escrow.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttESCROW_CANCEL, 4, EscrowCancel,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfOwner, soeREQUIRED},
|
{sfOwner, soeREQUIRED},
|
||||||
{sfOfferSequence, soeREQUIRED},
|
{sfOfferSequence, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type sets or clears an account's "regular key". */
|
/** This transaction type sets or clears an account's "regular key". */
|
||||||
TRANSACTION(ttREGULAR_KEY_SET, 5, SetRegularKey, Delegation::notDelegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/SetRegularKey.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttREGULAR_KEY_SET, 5, SetRegularKey,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfRegularKey, soeOPTIONAL},
|
{sfRegularKey, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
// 6 deprecated
|
// 6 deprecated
|
||||||
|
|
||||||
/** This transaction type creates an offer to trade one asset for another. */
|
/** This transaction type creates an offer to trade one asset for another. */
|
||||||
TRANSACTION(ttOFFER_CREATE, 7, OfferCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/CreateOffer.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttOFFER_CREATE, 7, OfferCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfTakerPays, soeREQUIRED},
|
{sfTakerPays, soeREQUIRED},
|
||||||
{sfTakerGets, soeREQUIRED},
|
{sfTakerGets, soeREQUIRED},
|
||||||
{sfExpiration, soeOPTIONAL},
|
{sfExpiration, soeOPTIONAL},
|
||||||
@@ -98,14 +155,28 @@ TRANSACTION(ttOFFER_CREATE, 7, OfferCreate, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type cancels existing offers to trade one asset for another. */
|
/** This transaction type cancels existing offers to trade one asset for another. */
|
||||||
TRANSACTION(ttOFFER_CANCEL, 8, OfferCancel, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/CancelOffer.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttOFFER_CANCEL, 8, OfferCancel,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfOfferSequence, soeREQUIRED},
|
{sfOfferSequence, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
// 9 deprecated
|
// 9 deprecated
|
||||||
|
|
||||||
/** This transaction type creates a new set of tickets. */
|
/** This transaction type creates a new set of tickets. */
|
||||||
TRANSACTION(ttTICKET_CREATE, 10, TicketCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/CreateTicket.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttTICKET_CREATE, 10, TicketCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureTicketBatch,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfTicketCount, soeREQUIRED},
|
{sfTicketCount, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
@@ -114,13 +185,27 @@ TRANSACTION(ttTICKET_CREATE, 10, TicketCreate, Delegation::delegatable, ({
|
|||||||
/** This transaction type modifies the signer list associated with an account. */
|
/** This transaction type modifies the signer list associated with an account. */
|
||||||
// The SignerEntries are optional because a SignerList is deleted by
|
// The SignerEntries are optional because a SignerList is deleted by
|
||||||
// setting the SignerQuorum to zero and omitting SignerEntries.
|
// setting the SignerQuorum to zero and omitting SignerEntries.
|
||||||
TRANSACTION(ttSIGNER_LIST_SET, 12, SignerListSet, Delegation::notDelegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/SetSignerList.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttSIGNER_LIST_SET, 12, SignerListSet,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfSignerQuorum, soeREQUIRED},
|
{sfSignerQuorum, soeREQUIRED},
|
||||||
{sfSignerEntries, soeOPTIONAL},
|
{sfSignerEntries, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type creates a new unidirectional XRP payment channel. */
|
/** This transaction type creates a new unidirectional XRP payment channel. */
|
||||||
TRANSACTION(ttPAYCHAN_CREATE, 13, PaymentChannelCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/PayChan.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttPAYCHAN_CREATE, 13, PaymentChannelCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED},
|
{sfAmount, soeREQUIRED},
|
||||||
{sfSettleDelay, soeREQUIRED},
|
{sfSettleDelay, soeREQUIRED},
|
||||||
@@ -130,14 +215,22 @@ TRANSACTION(ttPAYCHAN_CREATE, 13, PaymentChannelCreate, Delegation::delegatable,
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type funds an existing unidirectional XRP payment channel. */
|
/** This transaction type funds an existing unidirectional XRP payment channel. */
|
||||||
TRANSACTION(ttPAYCHAN_FUND, 14, PaymentChannelFund, Delegation::delegatable, ({
|
TRANSACTION(ttPAYCHAN_FUND, 14, PaymentChannelFund,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfChannel, soeREQUIRED},
|
{sfChannel, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED},
|
{sfAmount, soeREQUIRED},
|
||||||
{sfExpiration, soeOPTIONAL},
|
{sfExpiration, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type submits a claim against an existing unidirectional payment channel. */
|
/** This transaction type submits a claim against an existing unidirectional payment channel. */
|
||||||
TRANSACTION(ttPAYCHAN_CLAIM, 15, PaymentChannelClaim, Delegation::delegatable, ({
|
TRANSACTION(ttPAYCHAN_CLAIM, 15, PaymentChannelClaim,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfChannel, soeREQUIRED},
|
{sfChannel, soeREQUIRED},
|
||||||
{sfAmount, soeOPTIONAL},
|
{sfAmount, soeOPTIONAL},
|
||||||
{sfBalance, soeOPTIONAL},
|
{sfBalance, soeOPTIONAL},
|
||||||
@@ -147,7 +240,14 @@ TRANSACTION(ttPAYCHAN_CLAIM, 15, PaymentChannelClaim, Delegation::delegatable, (
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type creates a new check. */
|
/** This transaction type creates a new check. */
|
||||||
TRANSACTION(ttCHECK_CREATE, 16, CheckCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/CreateCheck.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttCHECK_CREATE, 16, CheckCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureChecks,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
{sfSendMax, soeREQUIRED},
|
{sfSendMax, soeREQUIRED},
|
||||||
{sfExpiration, soeOPTIONAL},
|
{sfExpiration, soeOPTIONAL},
|
||||||
@@ -156,19 +256,40 @@ TRANSACTION(ttCHECK_CREATE, 16, CheckCreate, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type cashes an existing check. */
|
/** This transaction type cashes an existing check. */
|
||||||
TRANSACTION(ttCHECK_CASH, 17, CheckCash, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/CashCheck.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttCHECK_CASH, 17, CheckCash,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureChecks,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfCheckID, soeREQUIRED},
|
{sfCheckID, soeREQUIRED},
|
||||||
{sfAmount, soeOPTIONAL},
|
{sfAmount, soeOPTIONAL},
|
||||||
{sfDeliverMin, soeOPTIONAL},
|
{sfDeliverMin, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type cancels an existing check. */
|
/** This transaction type cancels an existing check. */
|
||||||
TRANSACTION(ttCHECK_CANCEL, 18, CheckCancel, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/CancelCheck.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttCHECK_CANCEL, 18, CheckCancel,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureChecks,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfCheckID, soeREQUIRED},
|
{sfCheckID, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type grants or revokes authorization to transfer funds. */
|
/** This transaction type grants or revokes authorization to transfer funds. */
|
||||||
TRANSACTION(ttDEPOSIT_PREAUTH, 19, DepositPreauth, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/DepositPreauth.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttDEPOSIT_PREAUTH, 19, DepositPreauth,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureDepositPreauth,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfAuthorize, soeOPTIONAL},
|
{sfAuthorize, soeOPTIONAL},
|
||||||
{sfUnauthorize, soeOPTIONAL},
|
{sfUnauthorize, soeOPTIONAL},
|
||||||
{sfAuthorizeCredentials, soeOPTIONAL},
|
{sfAuthorizeCredentials, soeOPTIONAL},
|
||||||
@@ -176,14 +297,28 @@ TRANSACTION(ttDEPOSIT_PREAUTH, 19, DepositPreauth, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type modifies a trustline between two accounts. */
|
/** This transaction type modifies a trustline between two accounts. */
|
||||||
TRANSACTION(ttTRUST_SET, 20, TrustSet, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/SetTrust.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttTRUST_SET, 20, TrustSet,
|
||||||
|
Delegation::delegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfLimitAmount, soeOPTIONAL},
|
{sfLimitAmount, soeOPTIONAL},
|
||||||
{sfQualityIn, soeOPTIONAL},
|
{sfQualityIn, soeOPTIONAL},
|
||||||
{sfQualityOut, soeOPTIONAL},
|
{sfQualityOut, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type deletes an existing account. */
|
/** This transaction type deletes an existing account. */
|
||||||
TRANSACTION(ttACCOUNT_DELETE, 21, AccountDelete, Delegation::notDelegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/DeleteAccount.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttACCOUNT_DELETE, 21, AccountDelete,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
uint256{},
|
||||||
|
mustDeleteAcct,
|
||||||
|
({
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
{sfDestinationTag, soeOPTIONAL},
|
{sfDestinationTag, soeOPTIONAL},
|
||||||
{sfCredentialIDs, soeOPTIONAL},
|
{sfCredentialIDs, soeOPTIONAL},
|
||||||
@@ -192,7 +327,14 @@ TRANSACTION(ttACCOUNT_DELETE, 21, AccountDelete, Delegation::notDelegatable, ({
|
|||||||
// 22 reserved
|
// 22 reserved
|
||||||
|
|
||||||
/** This transaction mints a new NFT. */
|
/** This transaction mints a new NFT. */
|
||||||
TRANSACTION(ttNFTOKEN_MINT, 25, NFTokenMint, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/NFTokenMint.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttNFTOKEN_MINT, 25, NFTokenMint,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureNonFungibleTokensV1,
|
||||||
|
changeNFTCounts,
|
||||||
|
({
|
||||||
{sfNFTokenTaxon, soeREQUIRED},
|
{sfNFTokenTaxon, soeREQUIRED},
|
||||||
{sfTransferFee, soeOPTIONAL},
|
{sfTransferFee, soeOPTIONAL},
|
||||||
{sfIssuer, soeOPTIONAL},
|
{sfIssuer, soeOPTIONAL},
|
||||||
@@ -203,13 +345,27 @@ TRANSACTION(ttNFTOKEN_MINT, 25, NFTokenMint, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction burns (i.e. destroys) an existing NFT. */
|
/** This transaction burns (i.e. destroys) an existing NFT. */
|
||||||
TRANSACTION(ttNFTOKEN_BURN, 26, NFTokenBurn, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/NFTokenBurn.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttNFTOKEN_BURN, 26, NFTokenBurn,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureNonFungibleTokensV1,
|
||||||
|
changeNFTCounts,
|
||||||
|
({
|
||||||
{sfNFTokenID, soeREQUIRED},
|
{sfNFTokenID, soeREQUIRED},
|
||||||
{sfOwner, soeOPTIONAL},
|
{sfOwner, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction creates a new offer to buy or sell an NFT. */
|
/** This transaction creates a new offer to buy or sell an NFT. */
|
||||||
TRANSACTION(ttNFTOKEN_CREATE_OFFER, 27, NFTokenCreateOffer, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/NFTokenCreateOffer.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttNFTOKEN_CREATE_OFFER, 27, NFTokenCreateOffer,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureNonFungibleTokensV1,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfNFTokenID, soeREQUIRED},
|
{sfNFTokenID, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED},
|
{sfAmount, soeREQUIRED},
|
||||||
{sfDestination, soeOPTIONAL},
|
{sfDestination, soeOPTIONAL},
|
||||||
@@ -218,25 +374,53 @@ TRANSACTION(ttNFTOKEN_CREATE_OFFER, 27, NFTokenCreateOffer, Delegation::delegata
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction cancels an existing offer to buy or sell an existing NFT. */
|
/** This transaction cancels an existing offer to buy or sell an existing NFT. */
|
||||||
TRANSACTION(ttNFTOKEN_CANCEL_OFFER, 28, NFTokenCancelOffer, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/NFTokenCancelOffer.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttNFTOKEN_CANCEL_OFFER, 28, NFTokenCancelOffer,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureNonFungibleTokensV1,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfNFTokenOffers, soeREQUIRED},
|
{sfNFTokenOffers, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction accepts an existing offer to buy or sell an existing NFT. */
|
/** This transaction accepts an existing offer to buy or sell an existing NFT. */
|
||||||
TRANSACTION(ttNFTOKEN_ACCEPT_OFFER, 29, NFTokenAcceptOffer, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/NFTokenAcceptOffer.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttNFTOKEN_ACCEPT_OFFER, 29, NFTokenAcceptOffer,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureNonFungibleTokensV1,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfNFTokenBuyOffer, soeOPTIONAL},
|
{sfNFTokenBuyOffer, soeOPTIONAL},
|
||||||
{sfNFTokenSellOffer, soeOPTIONAL},
|
{sfNFTokenSellOffer, soeOPTIONAL},
|
||||||
{sfNFTokenBrokerFee, soeOPTIONAL},
|
{sfNFTokenBrokerFee, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction claws back issued tokens. */
|
/** This transaction claws back issued tokens. */
|
||||||
TRANSACTION(ttCLAWBACK, 30, Clawback, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/Clawback.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttCLAWBACK, 30, Clawback,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureClawback,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfAmount, soeREQUIRED, soeMPTSupported},
|
{sfAmount, soeREQUIRED, soeMPTSupported},
|
||||||
{sfHolder, soeOPTIONAL},
|
{sfHolder, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction claws back tokens from an AMM pool. */
|
/** This transaction claws back tokens from an AMM pool. */
|
||||||
TRANSACTION(ttAMM_CLAWBACK, 31, AMMClawback, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/AMMClawback.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttAMM_CLAWBACK, 31, AMMClawback,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureAMMClawback,
|
||||||
|
mayDeleteAcct | overrideFreeze,
|
||||||
|
({
|
||||||
{sfHolder, soeREQUIRED},
|
{sfHolder, soeREQUIRED},
|
||||||
{sfAsset, soeREQUIRED},
|
{sfAsset, soeREQUIRED},
|
||||||
{sfAsset2, soeREQUIRED},
|
{sfAsset2, soeREQUIRED},
|
||||||
@@ -244,14 +428,28 @@ TRANSACTION(ttAMM_CLAWBACK, 31, AMMClawback, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type creates an AMM instance */
|
/** This transaction type creates an AMM instance */
|
||||||
TRANSACTION(ttAMM_CREATE, 35, AMMCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/AMMCreate.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttAMM_CREATE, 35, AMMCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureAMM,
|
||||||
|
createPseudoAcct,
|
||||||
|
({
|
||||||
{sfAmount, soeREQUIRED},
|
{sfAmount, soeREQUIRED},
|
||||||
{sfAmount2, soeREQUIRED},
|
{sfAmount2, soeREQUIRED},
|
||||||
{sfTradingFee, soeREQUIRED},
|
{sfTradingFee, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type deposits into an AMM instance */
|
/** This transaction type deposits into an AMM instance */
|
||||||
TRANSACTION(ttAMM_DEPOSIT, 36, AMMDeposit, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/AMMDeposit.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttAMM_DEPOSIT, 36, AMMDeposit,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureAMM,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfAsset, soeREQUIRED},
|
{sfAsset, soeREQUIRED},
|
||||||
{sfAsset2, soeREQUIRED},
|
{sfAsset2, soeREQUIRED},
|
||||||
{sfAmount, soeOPTIONAL},
|
{sfAmount, soeOPTIONAL},
|
||||||
@@ -262,7 +460,14 @@ TRANSACTION(ttAMM_DEPOSIT, 36, AMMDeposit, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type withdraws from an AMM instance */
|
/** This transaction type withdraws from an AMM instance */
|
||||||
TRANSACTION(ttAMM_WITHDRAW, 37, AMMWithdraw, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/AMMWithdraw.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttAMM_WITHDRAW, 37, AMMWithdraw,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureAMM,
|
||||||
|
mayDeleteAcct,
|
||||||
|
({
|
||||||
{sfAsset, soeREQUIRED},
|
{sfAsset, soeREQUIRED},
|
||||||
{sfAsset2, soeREQUIRED},
|
{sfAsset2, soeREQUIRED},
|
||||||
{sfAmount, soeOPTIONAL},
|
{sfAmount, soeOPTIONAL},
|
||||||
@@ -272,14 +477,28 @@ TRANSACTION(ttAMM_WITHDRAW, 37, AMMWithdraw, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type votes for the trading fee */
|
/** This transaction type votes for the trading fee */
|
||||||
TRANSACTION(ttAMM_VOTE, 38, AMMVote, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/AMMVote.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttAMM_VOTE, 38, AMMVote,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureAMM,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfAsset, soeREQUIRED},
|
{sfAsset, soeREQUIRED},
|
||||||
{sfAsset2, soeREQUIRED},
|
{sfAsset2, soeREQUIRED},
|
||||||
{sfTradingFee, soeREQUIRED},
|
{sfTradingFee, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type bids for the auction slot */
|
/** This transaction type bids for the auction slot */
|
||||||
TRANSACTION(ttAMM_BID, 39, AMMBid, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/AMMBid.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttAMM_BID, 39, AMMBid,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureAMM,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfAsset, soeREQUIRED},
|
{sfAsset, soeREQUIRED},
|
||||||
{sfAsset2, soeREQUIRED},
|
{sfAsset2, soeREQUIRED},
|
||||||
{sfBidMin, soeOPTIONAL},
|
{sfBidMin, soeOPTIONAL},
|
||||||
@@ -288,20 +507,38 @@ TRANSACTION(ttAMM_BID, 39, AMMBid, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type deletes AMM in the empty state */
|
/** This transaction type deletes AMM in the empty state */
|
||||||
TRANSACTION(ttAMM_DELETE, 40, AMMDelete, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/AMMDelete.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttAMM_DELETE, 40, AMMDelete,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureAMM,
|
||||||
|
mustDeleteAcct,
|
||||||
|
({
|
||||||
{sfAsset, soeREQUIRED},
|
{sfAsset, soeREQUIRED},
|
||||||
{sfAsset2, soeREQUIRED},
|
{sfAsset2, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transactions creates a crosschain sequence number */
|
/** This transactions creates a crosschain sequence number */
|
||||||
TRANSACTION(ttXCHAIN_CREATE_CLAIM_ID, 41, XChainCreateClaimID, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/XChainBridge.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttXCHAIN_CREATE_CLAIM_ID, 41, XChainCreateClaimID,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureXChainBridge,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfXChainBridge, soeREQUIRED},
|
{sfXChainBridge, soeREQUIRED},
|
||||||
{sfSignatureReward, soeREQUIRED},
|
{sfSignatureReward, soeREQUIRED},
|
||||||
{sfOtherChainSource, soeREQUIRED},
|
{sfOtherChainSource, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transactions initiates a crosschain transaction */
|
/** This transactions initiates a crosschain transaction */
|
||||||
TRANSACTION(ttXCHAIN_COMMIT, 42, XChainCommit, Delegation::delegatable, ({
|
TRANSACTION(ttXCHAIN_COMMIT, 42, XChainCommit,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureXChainBridge,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfXChainBridge, soeREQUIRED},
|
{sfXChainBridge, soeREQUIRED},
|
||||||
{sfXChainClaimID, soeREQUIRED},
|
{sfXChainClaimID, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED},
|
{sfAmount, soeREQUIRED},
|
||||||
@@ -309,7 +546,11 @@ TRANSACTION(ttXCHAIN_COMMIT, 42, XChainCommit, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction completes a crosschain transaction */
|
/** This transaction completes a crosschain transaction */
|
||||||
TRANSACTION(ttXCHAIN_CLAIM, 43, XChainClaim, Delegation::delegatable, ({
|
TRANSACTION(ttXCHAIN_CLAIM, 43, XChainClaim,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureXChainBridge,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfXChainBridge, soeREQUIRED},
|
{sfXChainBridge, soeREQUIRED},
|
||||||
{sfXChainClaimID, soeREQUIRED},
|
{sfXChainClaimID, soeREQUIRED},
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
@@ -318,7 +559,11 @@ TRANSACTION(ttXCHAIN_CLAIM, 43, XChainClaim, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction initiates a crosschain account create transaction */
|
/** This transaction initiates a crosschain account create transaction */
|
||||||
TRANSACTION(ttXCHAIN_ACCOUNT_CREATE_COMMIT, 44, XChainAccountCreateCommit, Delegation::delegatable, ({
|
TRANSACTION(ttXCHAIN_ACCOUNT_CREATE_COMMIT, 44, XChainAccountCreateCommit,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureXChainBridge,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfXChainBridge, soeREQUIRED},
|
{sfXChainBridge, soeREQUIRED},
|
||||||
{sfDestination, soeREQUIRED},
|
{sfDestination, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED},
|
{sfAmount, soeREQUIRED},
|
||||||
@@ -326,7 +571,11 @@ TRANSACTION(ttXCHAIN_ACCOUNT_CREATE_COMMIT, 44, XChainAccountCreateCommit, Deleg
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction adds an attestation to a claim */
|
/** This transaction adds an attestation to a claim */
|
||||||
TRANSACTION(ttXCHAIN_ADD_CLAIM_ATTESTATION, 45, XChainAddClaimAttestation, Delegation::delegatable, ({
|
TRANSACTION(ttXCHAIN_ADD_CLAIM_ATTESTATION, 45, XChainAddClaimAttestation,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureXChainBridge,
|
||||||
|
createAcct,
|
||||||
|
({
|
||||||
{sfXChainBridge, soeREQUIRED},
|
{sfXChainBridge, soeREQUIRED},
|
||||||
|
|
||||||
{sfAttestationSignerAccount, soeREQUIRED},
|
{sfAttestationSignerAccount, soeREQUIRED},
|
||||||
@@ -342,7 +591,12 @@ TRANSACTION(ttXCHAIN_ADD_CLAIM_ATTESTATION, 45, XChainAddClaimAttestation, Deleg
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction adds an attestation to an account */
|
/** This transaction adds an attestation to an account */
|
||||||
TRANSACTION(ttXCHAIN_ADD_ACCOUNT_CREATE_ATTESTATION, 46, XChainAddAccountCreateAttestation, Delegation::delegatable, ({
|
TRANSACTION(ttXCHAIN_ADD_ACCOUNT_CREATE_ATTESTATION, 46,
|
||||||
|
XChainAddAccountCreateAttestation,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureXChainBridge,
|
||||||
|
createAcct,
|
||||||
|
({
|
||||||
{sfXChainBridge, soeREQUIRED},
|
{sfXChainBridge, soeREQUIRED},
|
||||||
|
|
||||||
{sfAttestationSignerAccount, soeREQUIRED},
|
{sfAttestationSignerAccount, soeREQUIRED},
|
||||||
@@ -359,31 +613,57 @@ TRANSACTION(ttXCHAIN_ADD_ACCOUNT_CREATE_ATTESTATION, 46, XChainAddAccountCreateA
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction modifies a sidechain */
|
/** This transaction modifies a sidechain */
|
||||||
TRANSACTION(ttXCHAIN_MODIFY_BRIDGE, 47, XChainModifyBridge, Delegation::delegatable, ({
|
TRANSACTION(ttXCHAIN_MODIFY_BRIDGE, 47, XChainModifyBridge,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureXChainBridge,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfXChainBridge, soeREQUIRED},
|
{sfXChainBridge, soeREQUIRED},
|
||||||
{sfSignatureReward, soeOPTIONAL},
|
{sfSignatureReward, soeOPTIONAL},
|
||||||
{sfMinAccountCreateAmount, soeOPTIONAL},
|
{sfMinAccountCreateAmount, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transactions creates a sidechain */
|
/** This transactions creates a sidechain */
|
||||||
TRANSACTION(ttXCHAIN_CREATE_BRIDGE, 48, XChainCreateBridge, Delegation::delegatable, ({
|
TRANSACTION(ttXCHAIN_CREATE_BRIDGE, 48, XChainCreateBridge,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureXChainBridge,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfXChainBridge, soeREQUIRED},
|
{sfXChainBridge, soeREQUIRED},
|
||||||
{sfSignatureReward, soeREQUIRED},
|
{sfSignatureReward, soeREQUIRED},
|
||||||
{sfMinAccountCreateAmount, soeOPTIONAL},
|
{sfMinAccountCreateAmount, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type creates or updates a DID */
|
/** This transaction type creates or updates a DID */
|
||||||
TRANSACTION(ttDID_SET, 49, DIDSet, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/DID.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttDID_SET, 49, DIDSet,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureDID,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfDIDDocument, soeOPTIONAL},
|
{sfDIDDocument, soeOPTIONAL},
|
||||||
{sfURI, soeOPTIONAL},
|
{sfURI, soeOPTIONAL},
|
||||||
{sfData, soeOPTIONAL},
|
{sfData, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type deletes a DID */
|
/** This transaction type deletes a DID */
|
||||||
TRANSACTION(ttDID_DELETE, 50, DIDDelete, Delegation::delegatable, ({}))
|
TRANSACTION(ttDID_DELETE, 50, DIDDelete,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureDID,
|
||||||
|
noPriv,
|
||||||
|
({}))
|
||||||
|
|
||||||
/** This transaction type creates an Oracle instance */
|
/** This transaction type creates an Oracle instance */
|
||||||
TRANSACTION(ttORACLE_SET, 51, OracleSet, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/SetOracle.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttORACLE_SET, 51, OracleSet,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featurePriceOracle,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfOracleDocumentID, soeREQUIRED},
|
{sfOracleDocumentID, soeREQUIRED},
|
||||||
{sfProvider, soeOPTIONAL},
|
{sfProvider, soeOPTIONAL},
|
||||||
{sfURI, soeOPTIONAL},
|
{sfURI, soeOPTIONAL},
|
||||||
@@ -393,45 +673,98 @@ TRANSACTION(ttORACLE_SET, 51, OracleSet, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type deletes an Oracle instance */
|
/** This transaction type deletes an Oracle instance */
|
||||||
TRANSACTION(ttORACLE_DELETE, 52, OracleDelete, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/DeleteOracle.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttORACLE_DELETE, 52, OracleDelete,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featurePriceOracle,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfOracleDocumentID, soeREQUIRED},
|
{sfOracleDocumentID, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type fixes a problem in the ledger state */
|
/** This transaction type fixes a problem in the ledger state */
|
||||||
TRANSACTION(ttLEDGER_STATE_FIX, 53, LedgerStateFix, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/LedgerStateFix.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttLEDGER_STATE_FIX, 53, LedgerStateFix,
|
||||||
|
Delegation::delegatable,
|
||||||
|
fixNFTokenPageLinks,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfLedgerFixType, soeREQUIRED},
|
{sfLedgerFixType, soeREQUIRED},
|
||||||
{sfOwner, soeOPTIONAL},
|
{sfOwner, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type creates a MPTokensIssuance instance */
|
/** This transaction type creates a MPTokensIssuance instance */
|
||||||
TRANSACTION(ttMPTOKEN_ISSUANCE_CREATE, 54, MPTokenIssuanceCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/MPTokenIssuanceCreate.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttMPTOKEN_ISSUANCE_CREATE, 54, MPTokenIssuanceCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureMPTokensV1,
|
||||||
|
createMPTIssuance,
|
||||||
|
({
|
||||||
{sfAssetScale, soeOPTIONAL},
|
{sfAssetScale, soeOPTIONAL},
|
||||||
{sfTransferFee, soeOPTIONAL},
|
{sfTransferFee, soeOPTIONAL},
|
||||||
{sfMaximumAmount, soeOPTIONAL},
|
{sfMaximumAmount, soeOPTIONAL},
|
||||||
{sfMPTokenMetadata, soeOPTIONAL},
|
{sfMPTokenMetadata, soeOPTIONAL},
|
||||||
{sfDomainID, soeOPTIONAL},
|
{sfDomainID, soeOPTIONAL},
|
||||||
|
{sfMutableFlags, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type destroys a MPTokensIssuance instance */
|
/** This transaction type destroys a MPTokensIssuance instance */
|
||||||
TRANSACTION(ttMPTOKEN_ISSUANCE_DESTROY, 55, MPTokenIssuanceDestroy, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/MPTokenIssuanceDestroy.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttMPTOKEN_ISSUANCE_DESTROY, 55, MPTokenIssuanceDestroy,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureMPTokensV1,
|
||||||
|
destroyMPTIssuance,
|
||||||
|
({
|
||||||
{sfMPTokenIssuanceID, soeREQUIRED},
|
{sfMPTokenIssuanceID, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type sets flags on a MPTokensIssuance or MPToken instance */
|
/** This transaction type sets flags on a MPTokensIssuance or MPToken instance */
|
||||||
TRANSACTION(ttMPTOKEN_ISSUANCE_SET, 56, MPTokenIssuanceSet, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/MPTokenIssuanceSet.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttMPTOKEN_ISSUANCE_SET, 56, MPTokenIssuanceSet,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureMPTokensV1,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfMPTokenIssuanceID, soeREQUIRED},
|
{sfMPTokenIssuanceID, soeREQUIRED},
|
||||||
{sfHolder, soeOPTIONAL},
|
{sfHolder, soeOPTIONAL},
|
||||||
{sfDomainID, soeOPTIONAL},
|
{sfDomainID, soeOPTIONAL},
|
||||||
|
{sfMPTokenMetadata, soeOPTIONAL},
|
||||||
|
{sfTransferFee, soeOPTIONAL},
|
||||||
|
{sfMutableFlags, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type authorizes a MPToken instance */
|
/** This transaction type authorizes a MPToken instance */
|
||||||
TRANSACTION(ttMPTOKEN_AUTHORIZE, 57, MPTokenAuthorize, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/MPTokenAuthorize.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttMPTOKEN_AUTHORIZE, 57, MPTokenAuthorize,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureMPTokensV1,
|
||||||
|
mustAuthorizeMPT,
|
||||||
|
({
|
||||||
{sfMPTokenIssuanceID, soeREQUIRED},
|
{sfMPTokenIssuanceID, soeREQUIRED},
|
||||||
{sfHolder, soeOPTIONAL},
|
{sfHolder, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type create an Credential instance */
|
/** This transaction type create an Credential instance */
|
||||||
TRANSACTION(ttCREDENTIAL_CREATE, 58, CredentialCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/Credentials.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttCREDENTIAL_CREATE, 58, CredentialCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureCredentials,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfSubject, soeREQUIRED},
|
{sfSubject, soeREQUIRED},
|
||||||
{sfCredentialType, soeREQUIRED},
|
{sfCredentialType, soeREQUIRED},
|
||||||
{sfExpiration, soeOPTIONAL},
|
{sfExpiration, soeOPTIONAL},
|
||||||
@@ -439,44 +772,87 @@ TRANSACTION(ttCREDENTIAL_CREATE, 58, CredentialCreate, Delegation::delegatable,
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type accept an Credential object */
|
/** This transaction type accept an Credential object */
|
||||||
TRANSACTION(ttCREDENTIAL_ACCEPT, 59, CredentialAccept, Delegation::delegatable, ({
|
TRANSACTION(ttCREDENTIAL_ACCEPT, 59, CredentialAccept,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureCredentials,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfIssuer, soeREQUIRED},
|
{sfIssuer, soeREQUIRED},
|
||||||
{sfCredentialType, soeREQUIRED},
|
{sfCredentialType, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type delete an Credential object */
|
/** This transaction type delete an Credential object */
|
||||||
TRANSACTION(ttCREDENTIAL_DELETE, 60, CredentialDelete, Delegation::delegatable, ({
|
TRANSACTION(ttCREDENTIAL_DELETE, 60, CredentialDelete,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureCredentials,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfSubject, soeOPTIONAL},
|
{sfSubject, soeOPTIONAL},
|
||||||
{sfIssuer, soeOPTIONAL},
|
{sfIssuer, soeOPTIONAL},
|
||||||
{sfCredentialType, soeREQUIRED},
|
{sfCredentialType, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type modify a NFToken */
|
/** This transaction type modify a NFToken */
|
||||||
TRANSACTION(ttNFTOKEN_MODIFY, 61, NFTokenModify, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/NFTokenModify.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttNFTOKEN_MODIFY, 61, NFTokenModify,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureDynamicNFT,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfNFTokenID, soeREQUIRED},
|
{sfNFTokenID, soeREQUIRED},
|
||||||
{sfOwner, soeOPTIONAL},
|
{sfOwner, soeOPTIONAL},
|
||||||
{sfURI, soeOPTIONAL},
|
{sfURI, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type creates or modifies a Permissioned Domain */
|
/** This transaction type creates or modifies a Permissioned Domain */
|
||||||
TRANSACTION(ttPERMISSIONED_DOMAIN_SET, 62, PermissionedDomainSet, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/PermissionedDomainSet.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttPERMISSIONED_DOMAIN_SET, 62, PermissionedDomainSet,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featurePermissionedDomains,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfDomainID, soeOPTIONAL},
|
{sfDomainID, soeOPTIONAL},
|
||||||
{sfAcceptedCredentials, soeREQUIRED},
|
{sfAcceptedCredentials, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type deletes a Permissioned Domain */
|
/** This transaction type deletes a Permissioned Domain */
|
||||||
TRANSACTION(ttPERMISSIONED_DOMAIN_DELETE, 63, PermissionedDomainDelete, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/PermissionedDomainDelete.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttPERMISSIONED_DOMAIN_DELETE, 63, PermissionedDomainDelete,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featurePermissionedDomains,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfDomainID, soeREQUIRED},
|
{sfDomainID, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type delegates authorized account specified permissions */
|
/** This transaction type delegates authorized account specified permissions */
|
||||||
TRANSACTION(ttDELEGATE_SET, 64, DelegateSet, Delegation::notDelegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/DelegateSet.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttDELEGATE_SET, 64, DelegateSet,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
featurePermissionDelegation,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfAuthorize, soeREQUIRED},
|
{sfAuthorize, soeREQUIRED},
|
||||||
{sfPermissions, soeREQUIRED},
|
{sfPermissions, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction creates a single asset vault. */
|
/** This transaction creates a single asset vault. */
|
||||||
TRANSACTION(ttVAULT_CREATE, 65, VaultCreate, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/VaultCreate.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttVAULT_CREATE, 65, VaultCreate,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureSingleAssetVault,
|
||||||
|
createPseudoAcct | createMPTIssuance | mustModifyVault,
|
||||||
|
({
|
||||||
{sfAsset, soeREQUIRED, soeMPTSupported},
|
{sfAsset, soeREQUIRED, soeMPTSupported},
|
||||||
{sfAssetsMaximum, soeOPTIONAL},
|
{sfAssetsMaximum, soeOPTIONAL},
|
||||||
{sfMPTokenMetadata, soeOPTIONAL},
|
{sfMPTokenMetadata, soeOPTIONAL},
|
||||||
@@ -487,7 +863,14 @@ TRANSACTION(ttVAULT_CREATE, 65, VaultCreate, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction updates a single asset vault. */
|
/** This transaction updates a single asset vault. */
|
||||||
TRANSACTION(ttVAULT_SET, 66, VaultSet, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/VaultSet.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttVAULT_SET, 66, VaultSet,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureSingleAssetVault,
|
||||||
|
mustModifyVault,
|
||||||
|
({
|
||||||
{sfVaultID, soeREQUIRED},
|
{sfVaultID, soeREQUIRED},
|
||||||
{sfAssetsMaximum, soeOPTIONAL},
|
{sfAssetsMaximum, soeOPTIONAL},
|
||||||
{sfDomainID, soeOPTIONAL},
|
{sfDomainID, soeOPTIONAL},
|
||||||
@@ -495,18 +878,39 @@ TRANSACTION(ttVAULT_SET, 66, VaultSet, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction deletes a single asset vault. */
|
/** This transaction deletes a single asset vault. */
|
||||||
TRANSACTION(ttVAULT_DELETE, 67, VaultDelete, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/VaultDelete.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttVAULT_DELETE, 67, VaultDelete,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureSingleAssetVault,
|
||||||
|
mustDeleteAcct | destroyMPTIssuance | mustModifyVault,
|
||||||
|
({
|
||||||
{sfVaultID, soeREQUIRED},
|
{sfVaultID, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction trades assets for shares with a vault. */
|
/** This transaction trades assets for shares with a vault. */
|
||||||
TRANSACTION(ttVAULT_DEPOSIT, 68, VaultDeposit, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/VaultDeposit.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttVAULT_DEPOSIT, 68, VaultDeposit,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureSingleAssetVault,
|
||||||
|
mayAuthorizeMPT | mustModifyVault,
|
||||||
|
({
|
||||||
{sfVaultID, soeREQUIRED},
|
{sfVaultID, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED, soeMPTSupported},
|
{sfAmount, soeREQUIRED, soeMPTSupported},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction trades shares for assets with a vault. */
|
/** This transaction trades shares for assets with a vault. */
|
||||||
TRANSACTION(ttVAULT_WITHDRAW, 69, VaultWithdraw, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/VaultWithdraw.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttVAULT_WITHDRAW, 69, VaultWithdraw,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureSingleAssetVault,
|
||||||
|
mayDeleteMPT | mayAuthorizeMPT | mustModifyVault,
|
||||||
|
({
|
||||||
{sfVaultID, soeREQUIRED},
|
{sfVaultID, soeREQUIRED},
|
||||||
{sfAmount, soeREQUIRED, soeMPTSupported},
|
{sfAmount, soeREQUIRED, soeMPTSupported},
|
||||||
{sfDestination, soeOPTIONAL},
|
{sfDestination, soeOPTIONAL},
|
||||||
@@ -514,45 +918,44 @@ TRANSACTION(ttVAULT_WITHDRAW, 69, VaultWithdraw, Delegation::delegatable, ({
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction claws back tokens from a vault. */
|
/** This transaction claws back tokens from a vault. */
|
||||||
TRANSACTION(ttVAULT_CLAWBACK, 70, VaultClawback, Delegation::delegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/VaultClawback.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttVAULT_CLAWBACK, 70, VaultClawback,
|
||||||
|
Delegation::delegatable,
|
||||||
|
featureSingleAssetVault,
|
||||||
|
mayDeleteMPT | mustModifyVault,
|
||||||
|
({
|
||||||
{sfVaultID, soeREQUIRED},
|
{sfVaultID, soeREQUIRED},
|
||||||
{sfHolder, soeREQUIRED},
|
{sfHolder, soeREQUIRED},
|
||||||
{sfAmount, soeOPTIONAL, soeMPTSupported},
|
{sfAmount, soeOPTIONAL, soeMPTSupported},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type batches together transactions. */
|
/** This transaction type batches together transactions. */
|
||||||
TRANSACTION(ttBATCH, 71, Batch, Delegation::notDelegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/Batch.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttBATCH, 71, Batch,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
featureBatch,
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfRawTransactions, soeREQUIRED},
|
{sfRawTransactions, soeREQUIRED},
|
||||||
{sfBatchSigners, soeOPTIONAL},
|
{sfBatchSigners, soeOPTIONAL},
|
||||||
}))
|
}))
|
||||||
|
|
||||||
/** This transaction type batches together transactions. */
|
|
||||||
TRANSACTION(ttSUBSCRIPTION_SET, 72, SubscriptionSet, Delegation::delegatable, ({
|
|
||||||
{sfDestination, soeOPTIONAL},
|
|
||||||
{sfAmount, soeREQUIRED, soeMPTSupported},
|
|
||||||
{sfFrequency, soeOPTIONAL},
|
|
||||||
{sfStartTime, soeOPTIONAL},
|
|
||||||
{sfExpiration, soeOPTIONAL},
|
|
||||||
{sfDestinationTag, soeOPTIONAL},
|
|
||||||
{sfSubscriptionID, soeOPTIONAL},
|
|
||||||
}))
|
|
||||||
|
|
||||||
/** This transaction type batches together transactions. */
|
|
||||||
TRANSACTION(ttSUBSCRIPTION_CANCEL, 73, SubscriptionCancel, Delegation::delegatable, ({
|
|
||||||
{sfSubscriptionID, soeREQUIRED},
|
|
||||||
}))
|
|
||||||
|
|
||||||
/** This transaction type batches together transactions. */
|
|
||||||
TRANSACTION(ttSUBSCRIPTION_CLAIM, 74, SubscriptionClaim, Delegation::delegatable, ({
|
|
||||||
{sfAmount, soeREQUIRED, soeMPTSupported},
|
|
||||||
{sfSubscriptionID, soeREQUIRED},
|
|
||||||
}))
|
|
||||||
|
|
||||||
/** This system-generated transaction type is used to update the status of the various amendments.
|
/** This system-generated transaction type is used to update the status of the various amendments.
|
||||||
|
|
||||||
For details, see: https://xrpl.org/amendments.html
|
For details, see: https://xrpl.org/amendments.html
|
||||||
*/
|
*/
|
||||||
TRANSACTION(ttAMENDMENT, 100, EnableAmendment, Delegation::notDelegatable, ({
|
#if TRANSACTION_INCLUDE
|
||||||
|
# include <xrpld/app/tx/detail/Change.h>
|
||||||
|
#endif
|
||||||
|
TRANSACTION(ttAMENDMENT, 100, EnableAmendment,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfLedgerSequence, soeREQUIRED},
|
{sfLedgerSequence, soeREQUIRED},
|
||||||
{sfAmendment, soeREQUIRED},
|
{sfAmendment, soeREQUIRED},
|
||||||
}))
|
}))
|
||||||
@@ -560,7 +963,11 @@ TRANSACTION(ttAMENDMENT, 100, EnableAmendment, Delegation::notDelegatable, ({
|
|||||||
/** This system-generated transaction type is used to update the network's fee settings.
|
/** This system-generated transaction type is used to update the network's fee settings.
|
||||||
For details, see: https://xrpl.org/fee-voting.html
|
For details, see: https://xrpl.org/fee-voting.html
|
||||||
*/
|
*/
|
||||||
TRANSACTION(ttFEE, 101, SetFee, Delegation::notDelegatable, ({
|
TRANSACTION(ttFEE, 101, SetFee,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfLedgerSequence, soeOPTIONAL},
|
{sfLedgerSequence, soeOPTIONAL},
|
||||||
// Old version uses raw numbers
|
// Old version uses raw numbers
|
||||||
{sfBaseFee, soeOPTIONAL},
|
{sfBaseFee, soeOPTIONAL},
|
||||||
@@ -577,7 +984,11 @@ TRANSACTION(ttFEE, 101, SetFee, Delegation::notDelegatable, ({
|
|||||||
|
|
||||||
For details, see: https://xrpl.org/negative-unl.html
|
For details, see: https://xrpl.org/negative-unl.html
|
||||||
*/
|
*/
|
||||||
TRANSACTION(ttUNL_MODIFY, 102, UNLModify, Delegation::notDelegatable, ({
|
TRANSACTION(ttUNL_MODIFY, 102, UNLModify,
|
||||||
|
Delegation::notDelegatable,
|
||||||
|
uint256{},
|
||||||
|
noPriv,
|
||||||
|
({
|
||||||
{sfUNLModifyDisabling, soeREQUIRED},
|
{sfUNLModifyDisabling, soeREQUIRED},
|
||||||
{sfLedgerSequence, soeREQUIRED},
|
{sfLedgerSequence, soeREQUIRED},
|
||||||
{sfUNLModifyValidator, soeREQUIRED},
|
{sfUNLModifyValidator, soeREQUIRED},
|
||||||
|
|||||||
@@ -99,7 +99,6 @@ JSS(Signer); // field.
|
|||||||
JSS(Signers); // field.
|
JSS(Signers); // field.
|
||||||
JSS(SigningPubKey); // field.
|
JSS(SigningPubKey); // field.
|
||||||
JSS(Subject); // in: Credential transactions
|
JSS(Subject); // in: Credential transactions
|
||||||
JSS(SubscriptionID); // in: Subscription transactions
|
|
||||||
JSS(TakerGets); // field.
|
JSS(TakerGets); // field.
|
||||||
JSS(TakerPays); // field.
|
JSS(TakerPays); // field.
|
||||||
JSS(TradingFee); // in/out: AMM trading fee
|
JSS(TradingFee); // in/out: AMM trading fee
|
||||||
@@ -284,7 +283,6 @@ JSS(fee_mult_max); // in: TransactionSign
|
|||||||
JSS(fee_ref); // out: NetworkOPs, DEPRECATED
|
JSS(fee_ref); // out: NetworkOPs, DEPRECATED
|
||||||
JSS(fetch_pack); // out: NetworkOPs
|
JSS(fetch_pack); // out: NetworkOPs
|
||||||
JSS(FIELDS); // out: RPC server_definitions
|
JSS(FIELDS); // out: RPC server_definitions
|
||||||
JSS(Frequency); // in: Subscription transactions
|
|
||||||
// matches definitions.json format
|
// matches definitions.json format
|
||||||
JSS(first); // out: rpc/Version
|
JSS(first); // out: rpc/Version
|
||||||
JSS(finished);
|
JSS(finished);
|
||||||
@@ -712,7 +710,7 @@ JSS(write_load); // out: GetCounts
|
|||||||
#pragma push_macro("TRANSACTION")
|
#pragma push_macro("TRANSACTION")
|
||||||
#undef TRANSACTION
|
#undef TRANSACTION
|
||||||
|
|
||||||
#define TRANSACTION(tag, value, name, delegatable, fields) JSS(name);
|
#define TRANSACTION(tag, value, name, ...) JSS(name);
|
||||||
|
|
||||||
#include <xrpl/protocol/detail/transactions.macro>
|
#include <xrpl/protocol/detail/transactions.macro>
|
||||||
|
|
||||||
@@ -724,11 +722,11 @@ JSS(write_load); // out: GetCounts
|
|||||||
#pragma push_macro("LEDGER_ENTRY_DUPLICATE")
|
#pragma push_macro("LEDGER_ENTRY_DUPLICATE")
|
||||||
#undef LEDGER_ENTRY_DUPLICATE
|
#undef LEDGER_ENTRY_DUPLICATE
|
||||||
|
|
||||||
#define LEDGER_ENTRY(tag, value, name, rpcName, fields) \
|
#define LEDGER_ENTRY(tag, value, name, rpcName, ...) \
|
||||||
JSS(name); \
|
JSS(name); \
|
||||||
JSS(rpcName);
|
JSS(rpcName);
|
||||||
|
|
||||||
#define LEDGER_ENTRY_DUPLICATE(tag, value, name, rpcName, fields) JSS(rpcName);
|
#define LEDGER_ENTRY_DUPLICATE(tag, value, name, rpcName, ...) JSS(rpcName);
|
||||||
|
|
||||||
#include <xrpl/protocol/detail/ledger_entries.macro>
|
#include <xrpl/protocol/detail/ledger_entries.macro>
|
||||||
|
|
||||||
|
|||||||
@@ -436,10 +436,12 @@ public:
|
|||||||
admin_.erase(admin_.iterator_to(entry));
|
admin_.erase(admin_.iterator_to(entry));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
// LCOV_EXCL_START
|
||||||
UNREACHABLE(
|
UNREACHABLE(
|
||||||
"ripple::Resource::Logic::release : invalid entry "
|
"ripple::Resource::Logic::release : invalid entry "
|
||||||
"kind");
|
"kind");
|
||||||
break;
|
break;
|
||||||
|
// LCOV_EXCL_STOP
|
||||||
}
|
}
|
||||||
inactive_.push_back(entry);
|
inactive_.push_back(entry);
|
||||||
entry.whenExpires = m_clock.now() + secondsUntilExpiration;
|
entry.whenExpires = m_clock.now() + secondsUntilExpiration;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
#include <xrpl/server/Port.h>
|
#include <xrpl/server/Port.h>
|
||||||
#include <xrpl/server/detail/ServerImpl.h>
|
#include <xrpl/server/detail/ServerImpl.h>
|
||||||
|
|
||||||
#include <boost/asio/io_context.hpp>
|
#include <boost/asio/io_service.hpp>
|
||||||
|
|
||||||
namespace ripple {
|
namespace ripple {
|
||||||
|
|
||||||
@@ -34,10 +34,10 @@ template <class Handler>
|
|||||||
std::unique_ptr<Server>
|
std::unique_ptr<Server>
|
||||||
make_Server(
|
make_Server(
|
||||||
Handler& handler,
|
Handler& handler,
|
||||||
boost::asio::io_context& io_context,
|
boost::asio::io_service& io_service,
|
||||||
beast::Journal journal)
|
beast::Journal journal)
|
||||||
{
|
{
|
||||||
return std::make_unique<ServerImpl<Handler>>(handler, io_context, journal);
|
return std::make_unique<ServerImpl<Handler>>(handler, io_service, journal);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ripple
|
} // namespace ripple
|
||||||
|
|||||||
@@ -88,7 +88,9 @@ public:
|
|||||||
++iter)
|
++iter)
|
||||||
{
|
{
|
||||||
typename BufferSequence::value_type const& buffer(*iter);
|
typename BufferSequence::value_type const& buffer(*iter);
|
||||||
write(buffer.data(), boost::asio::buffer_size(buffer));
|
write(
|
||||||
|
boost::asio::buffer_cast<void const*>(buffer),
|
||||||
|
boost::asio::buffer_size(buffer));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,7 +104,7 @@ public:
|
|||||||
|
|
||||||
/** Detach the session.
|
/** Detach the session.
|
||||||
This holds the session open so that the response can be sent
|
This holds the session open so that the response can be sent
|
||||||
asynchronously. Calls to io_context::run made by the server
|
asynchronously. Calls to io_service::run made by the server
|
||||||
will not return until all detached sessions are closed.
|
will not return until all detached sessions are closed.
|
||||||
*/
|
*/
|
||||||
virtual std::shared_ptr<Session>
|
virtual std::shared_ptr<Session>
|
||||||
|
|||||||
@@ -24,13 +24,11 @@
|
|||||||
#include <xrpl/beast/net/IPAddressConversion.h>
|
#include <xrpl/beast/net/IPAddressConversion.h>
|
||||||
#include <xrpl/beast/utility/instrumentation.h>
|
#include <xrpl/beast/utility/instrumentation.h>
|
||||||
#include <xrpl/server/Session.h>
|
#include <xrpl/server/Session.h>
|
||||||
#include <xrpl/server/detail/Spawn.h>
|
|
||||||
#include <xrpl/server/detail/io_list.h>
|
#include <xrpl/server/detail/io_list.h>
|
||||||
|
|
||||||
#include <boost/asio/ip/tcp.hpp>
|
#include <boost/asio/ip/tcp.hpp>
|
||||||
#include <boost/asio/spawn.hpp>
|
#include <boost/asio/spawn.hpp>
|
||||||
#include <boost/asio/ssl/stream.hpp>
|
#include <boost/asio/ssl/stream.hpp>
|
||||||
#include <boost/asio/strand.hpp>
|
|
||||||
#include <boost/asio/streambuf.hpp>
|
#include <boost/asio/streambuf.hpp>
|
||||||
#include <boost/beast/core/stream_traits.hpp>
|
#include <boost/beast/core/stream_traits.hpp>
|
||||||
#include <boost/beast/http/dynamic_body.hpp>
|
#include <boost/beast/http/dynamic_body.hpp>
|
||||||
@@ -217,8 +215,8 @@ BaseHTTPPeer<Handler, Impl>::BaseHTTPPeer(
|
|||||||
ConstBufferSequence const& buffers)
|
ConstBufferSequence const& buffers)
|
||||||
: port_(port)
|
: port_(port)
|
||||||
, handler_(handler)
|
, handler_(handler)
|
||||||
, work_(boost::asio::make_work_guard(executor))
|
, work_(executor)
|
||||||
, strand_(boost::asio::make_strand(executor))
|
, strand_(executor)
|
||||||
, remote_address_(remote_address)
|
, remote_address_(remote_address)
|
||||||
, journal_(journal)
|
, journal_(journal)
|
||||||
{
|
{
|
||||||
@@ -358,7 +356,7 @@ BaseHTTPPeer<Handler, Impl>::on_write(
|
|||||||
return;
|
return;
|
||||||
if (graceful_)
|
if (graceful_)
|
||||||
return do_close();
|
return do_close();
|
||||||
util::spawn(
|
boost::asio::spawn(
|
||||||
strand_,
|
strand_,
|
||||||
std::bind(
|
std::bind(
|
||||||
&BaseHTTPPeer<Handler, Impl>::do_read,
|
&BaseHTTPPeer<Handler, Impl>::do_read,
|
||||||
@@ -377,7 +375,7 @@ BaseHTTPPeer<Handler, Impl>::do_writer(
|
|||||||
{
|
{
|
||||||
auto const p = impl().shared_from_this();
|
auto const p = impl().shared_from_this();
|
||||||
resume = std::function<void(void)>([this, p, writer, keep_alive]() {
|
resume = std::function<void(void)>([this, p, writer, keep_alive]() {
|
||||||
util::spawn(
|
boost::asio::spawn(
|
||||||
strand_,
|
strand_,
|
||||||
std::bind(
|
std::bind(
|
||||||
&BaseHTTPPeer<Handler, Impl>::do_writer,
|
&BaseHTTPPeer<Handler, Impl>::do_writer,
|
||||||
@@ -408,7 +406,7 @@ BaseHTTPPeer<Handler, Impl>::do_writer(
|
|||||||
if (!keep_alive)
|
if (!keep_alive)
|
||||||
return do_close();
|
return do_close();
|
||||||
|
|
||||||
util::spawn(
|
boost::asio::spawn(
|
||||||
strand_,
|
strand_,
|
||||||
std::bind(
|
std::bind(
|
||||||
&BaseHTTPPeer<Handler, Impl>::do_read,
|
&BaseHTTPPeer<Handler, Impl>::do_read,
|
||||||
@@ -450,14 +448,14 @@ BaseHTTPPeer<Handler, Impl>::write(
|
|||||||
std::shared_ptr<Writer> const& writer,
|
std::shared_ptr<Writer> const& writer,
|
||||||
bool keep_alive)
|
bool keep_alive)
|
||||||
{
|
{
|
||||||
util::spawn(
|
boost::asio::spawn(bind_executor(
|
||||||
strand_,
|
strand_,
|
||||||
std::bind(
|
std::bind(
|
||||||
&BaseHTTPPeer<Handler, Impl>::do_writer,
|
&BaseHTTPPeer<Handler, Impl>::do_writer,
|
||||||
impl().shared_from_this(),
|
impl().shared_from_this(),
|
||||||
writer,
|
writer,
|
||||||
keep_alive,
|
keep_alive,
|
||||||
std::placeholders::_1));
|
std::placeholders::_1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED
|
// DEPRECATED
|
||||||
@@ -492,12 +490,12 @@ BaseHTTPPeer<Handler, Impl>::complete()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// keep-alive
|
// keep-alive
|
||||||
util::spawn(
|
boost::asio::spawn(bind_executor(
|
||||||
strand_,
|
strand_,
|
||||||
std::bind(
|
std::bind(
|
||||||
&BaseHTTPPeer<Handler, Impl>::do_read,
|
&BaseHTTPPeer<Handler, Impl>::do_read,
|
||||||
impl().shared_from_this(),
|
impl().shared_from_this(),
|
||||||
std::placeholders::_1));
|
std::placeholders::_1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// DEPRECATED
|
// DEPRECATED
|
||||||
|
|||||||
@@ -91,8 +91,8 @@ BasePeer<Handler, Impl>::BasePeer(
|
|||||||
return "##" + std::to_string(++id) + " ";
|
return "##" + std::to_string(++id) + " ";
|
||||||
}())
|
}())
|
||||||
, j_(sink_)
|
, j_(sink_)
|
||||||
, work_(boost::asio::make_work_guard(executor))
|
, work_(executor)
|
||||||
, strand_(boost::asio::make_strand(executor))
|
, strand_(executor)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user