mirror of
				https://github.com/XRPLF/clio.git
				synced 2025-11-04 11:55:51 +00:00 
			
		
		
		
	Compare commits
	
		
			7 Commits
		
	
	
		
			104ef6a9dc
			...
			7e4e12385f
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					7e4e12385f | ||
| 
						 | 
					c117f470f2 | ||
| 
						 | 
					30e88fe72c | ||
| 
						 | 
					cecf082952 | ||
| 
						 | 
					d5b95c2e61 | ||
| 
						 | 
					8375eb1766 | ||
| 
						 | 
					be6aaffa7a | 
							
								
								
									
										2
									
								
								.github/scripts/conan/generate_matrix.py
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/scripts/conan/generate_matrix.py
									
									
									
									
										vendored
									
									
								
							@@ -4,7 +4,7 @@ import json
 | 
			
		||||
 | 
			
		||||
LINUX_OS = ["heavy", "heavy-arm64"]
 | 
			
		||||
LINUX_CONTAINERS = [
 | 
			
		||||
    '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
    '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
]
 | 
			
		||||
LINUX_COMPILERS = ["gcc", "clang"]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							@@ -45,7 +45,7 @@ jobs:
 | 
			
		||||
        build_type: [Release, Debug]
 | 
			
		||||
        container:
 | 
			
		||||
          [
 | 
			
		||||
            '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }',
 | 
			
		||||
            '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }',
 | 
			
		||||
          ]
 | 
			
		||||
        static: [true]
 | 
			
		||||
 | 
			
		||||
@@ -75,7 +75,7 @@ jobs:
 | 
			
		||||
    uses: ./.github/workflows/reusable-build.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: heavy
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
      conan_profile: gcc
 | 
			
		||||
      build_type: Debug
 | 
			
		||||
      download_ccache: true
 | 
			
		||||
@@ -94,7 +94,7 @@ jobs:
 | 
			
		||||
    uses: ./.github/workflows/reusable-build.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: heavy
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
      conan_profile: gcc
 | 
			
		||||
      build_type: Release
 | 
			
		||||
      download_ccache: true
 | 
			
		||||
@@ -111,7 +111,7 @@ jobs:
 | 
			
		||||
    needs: build-and-test
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								.github/workflows/check-libxrpl.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/check-libxrpl.yml
									
									
									
									
										vendored
									
									
								
							@@ -17,7 +17,7 @@ jobs:
 | 
			
		||||
    name: Build Clio / `libXRPL ${{ github.event.client_payload.version }}`
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
@@ -25,7 +25,7 @@ jobs:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
@@ -67,7 +67,7 @@ jobs:
 | 
			
		||||
    needs: build
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								.github/workflows/clang-tidy.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/clang-tidy.yml
									
									
									
									
										vendored
									
									
								
							@@ -27,7 +27,7 @@ jobs:
 | 
			
		||||
    if: github.event_name != 'push' || contains(github.event.head_commit.message, 'clang-tidy auto fixes')
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a
 | 
			
		||||
 | 
			
		||||
    permissions:
 | 
			
		||||
      contents: write
 | 
			
		||||
@@ -40,7 +40,7 @@ jobs:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								.github/workflows/docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/docs.yml
									
									
									
									
										vendored
									
									
								
							@@ -14,7 +14,7 @@ jobs:
 | 
			
		||||
  build:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - name: Checkout
 | 
			
		||||
@@ -23,7 +23,7 @@ jobs:
 | 
			
		||||
          lfs: true
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								.github/workflows/nightly.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/nightly.yml
									
									
									
									
										vendored
									
									
								
							@@ -39,17 +39,17 @@ jobs:
 | 
			
		||||
            conan_profile: gcc
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            static: true
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
          - os: heavy
 | 
			
		||||
            conan_profile: gcc
 | 
			
		||||
            build_type: Debug
 | 
			
		||||
            static: true
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
          - os: heavy
 | 
			
		||||
            conan_profile: gcc.ubsan
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            static: false
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/reusable-build-test.yml
 | 
			
		||||
    with:
 | 
			
		||||
@@ -73,7 +73,7 @@ jobs:
 | 
			
		||||
        include:
 | 
			
		||||
          - os: heavy
 | 
			
		||||
            conan_profile: clang
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
            static: true
 | 
			
		||||
          - os: macos15
 | 
			
		||||
            conan_profile: apple-clang
 | 
			
		||||
@@ -115,7 +115,7 @@ jobs:
 | 
			
		||||
      header: >
 | 
			
		||||
        > **Note:** Please remember that this is a development release and it is not recommended for production use.
 | 
			
		||||
 | 
			
		||||
        Changelog (including previous releases): <https://github.com/XRPLF/clio/commits/nightly>
 | 
			
		||||
        Changelog (including previous releases): <https://github.com/XRPLF/clio/commits/nightly-${{ needs.get_date.outputs.date }}>
 | 
			
		||||
      generate_changelog: false
 | 
			
		||||
      draft: false
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/pre-commit.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/pre-commit.yml
									
									
									
									
										vendored
									
									
								
							@@ -11,4 +11,4 @@ jobs:
 | 
			
		||||
    uses: XRPLF/actions/.github/workflows/pre-commit.yml@34790936fae4c6c751f62ec8c06696f9c1a5753a
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: heavy
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-pre-commit:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-pre-commit:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							@@ -29,7 +29,7 @@ jobs:
 | 
			
		||||
            conan_profile: gcc
 | 
			
		||||
            build_type: Release
 | 
			
		||||
            static: true
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
            container: '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
 | 
			
		||||
    uses: ./.github/workflows/reusable-build-test.yml
 | 
			
		||||
    with:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/reusable-build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/reusable-build.yml
									
									
									
									
										vendored
									
									
								
							@@ -95,7 +95,7 @@ jobs:
 | 
			
		||||
          ref: ${{ github.ref }}
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: ${{ !inputs.download_ccache }}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								.github/workflows/reusable-release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/reusable-release.yml
									
									
									
									
										vendored
									
									
								
							@@ -42,7 +42,7 @@ jobs:
 | 
			
		||||
  release:
 | 
			
		||||
    runs-on: heavy
 | 
			
		||||
    container:
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
      image: ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a
 | 
			
		||||
    env:
 | 
			
		||||
      GH_REPO: ${{ github.repository }}
 | 
			
		||||
      GH_TOKEN: ${{ github.token }}
 | 
			
		||||
@@ -56,7 +56,7 @@ jobs:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/sanitizers.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/sanitizers.yml
									
									
									
									
										vendored
									
									
								
							@@ -44,7 +44,7 @@ jobs:
 | 
			
		||||
    uses: ./.github/workflows/reusable-build-test.yml
 | 
			
		||||
    with:
 | 
			
		||||
      runs_on: heavy
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d" }'
 | 
			
		||||
      container: '{ "image": "ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a" }'
 | 
			
		||||
      download_ccache: false
 | 
			
		||||
      upload_ccache: false
 | 
			
		||||
      conan_profile: ${{ matrix.compiler }}${{ matrix.sanitizer_ext }}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.github/workflows/upload-conan-deps.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/upload-conan-deps.yml
									
									
									
									
										vendored
									
									
								
							@@ -72,7 +72,7 @@ jobs:
 | 
			
		||||
      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
 | 
			
		||||
 | 
			
		||||
      - name: Prepare runner
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@7951b682e5a2973b28b0719a72f01fc4b0d0c34f
 | 
			
		||||
        uses: XRPLF/actions/.github/actions/prepare-runner@99685816bb60a95a66852f212f382580e180df3a
 | 
			
		||||
        with:
 | 
			
		||||
          disable_ccache: true
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -11,7 +11,10 @@
 | 
			
		||||
#
 | 
			
		||||
# See https://pre-commit.com for more information
 | 
			
		||||
# See https://pre-commit.com/hooks.html for more hooks
 | 
			
		||||
exclude: ^(docs/doxygen-awesome-theme/|conan\.lock$)
 | 
			
		||||
exclude: |
 | 
			
		||||
  (?x)^(
 | 
			
		||||
    docs/doxygen-awesome-theme/.*
 | 
			
		||||
  )$
 | 
			
		||||
 | 
			
		||||
repos:
 | 
			
		||||
  # `pre-commit sample-config` default hooks
 | 
			
		||||
 
 | 
			
		||||
@@ -55,4 +55,4 @@
 | 
			
		||||
        ]
 | 
			
		||||
    },
 | 
			
		||||
    "config_requires": []
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -55,8 +55,11 @@ RUN pip install -q --no-cache-dir \
 | 
			
		||||
        # lxml 6.0.0 is not compatible with our image
 | 
			
		||||
        'lxml<6.0.0' \
 | 
			
		||||
        cmake \
 | 
			
		||||
        conan==2.20.1 \
 | 
			
		||||
        gcovr
 | 
			
		||||
        conan==2.22.1 \
 | 
			
		||||
        gcovr \
 | 
			
		||||
        # We're adding pre-commit to this image as well,
 | 
			
		||||
        # because clang-tidy workflow requires it
 | 
			
		||||
        pre-commit
 | 
			
		||||
 | 
			
		||||
# Install LLVM tools
 | 
			
		||||
ARG LLVM_TOOLS_VERSION=20
 | 
			
		||||
 
 | 
			
		||||
@@ -5,17 +5,17 @@ It is used in [Clio Github Actions](https://github.com/XRPLF/clio/actions) but c
 | 
			
		||||
 | 
			
		||||
The image is based on Ubuntu 20.04 and contains:
 | 
			
		||||
 | 
			
		||||
- ccache 4.11.3
 | 
			
		||||
- ccache 4.12.1
 | 
			
		||||
- Clang 19
 | 
			
		||||
- ClangBuildAnalyzer 1.6.0
 | 
			
		||||
- Conan 2.20.1
 | 
			
		||||
- Doxygen 1.14
 | 
			
		||||
- Conan 2.22.1
 | 
			
		||||
- Doxygen 1.15.0
 | 
			
		||||
- GCC 15.2.0
 | 
			
		||||
- GDB 16.3
 | 
			
		||||
- gh 2.74
 | 
			
		||||
- git-cliff 2.9.1
 | 
			
		||||
- mold 2.40.1
 | 
			
		||||
- Python 3.13
 | 
			
		||||
- gh 2.82.1
 | 
			
		||||
- git-cliff 2.10.1
 | 
			
		||||
- mold 2.40.4
 | 
			
		||||
- Python 3.8
 | 
			
		||||
- and some other useful tools
 | 
			
		||||
 | 
			
		||||
Conan is set up to build Clio without any additional steps.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
services:
 | 
			
		||||
  clio_develop:
 | 
			
		||||
    image: ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
    image: ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a
 | 
			
		||||
    volumes:
 | 
			
		||||
      - clio_develop_conan_data:/root/.conan2/p
 | 
			
		||||
      - clio_develop_ccache:/root/.ccache
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ ARG TARGETARCH
 | 
			
		||||
 | 
			
		||||
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 | 
			
		||||
 | 
			
		||||
ARG BUILD_VERSION=2
 | 
			
		||||
ARG BUILD_VERSION=0
 | 
			
		||||
 | 
			
		||||
RUN apt-get update \
 | 
			
		||||
    && apt-get install -y --no-install-recommends --no-install-suggests \
 | 
			
		||||
@@ -24,7 +24,7 @@ RUN apt-get update \
 | 
			
		||||
 | 
			
		||||
WORKDIR /tmp
 | 
			
		||||
 | 
			
		||||
ARG MOLD_VERSION=2.40.1
 | 
			
		||||
ARG MOLD_VERSION=2.40.4
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/rui314/mold/archive/refs/tags/v${MOLD_VERSION}.tar.gz" \
 | 
			
		||||
    && tar xf "v${MOLD_VERSION}.tar.gz" \
 | 
			
		||||
    && cd "mold-${MOLD_VERSION}" \
 | 
			
		||||
@@ -34,7 +34,7 @@ RUN wget --progress=dot:giga "https://github.com/rui314/mold/archive/refs/tags/v
 | 
			
		||||
    && ninja install \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
ARG CCACHE_VERSION=4.11.3
 | 
			
		||||
ARG CCACHE_VERSION=4.12.1
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/ccache/ccache/releases/download/v${CCACHE_VERSION}/ccache-${CCACHE_VERSION}.tar.gz" \
 | 
			
		||||
    && tar xf "ccache-${CCACHE_VERSION}.tar.gz" \
 | 
			
		||||
    && cd "ccache-${CCACHE_VERSION}" \
 | 
			
		||||
@@ -51,7 +51,7 @@ RUN apt-get update \
 | 
			
		||||
    && apt-get clean \
 | 
			
		||||
    && rm -rf /var/lib/apt/lists/*
 | 
			
		||||
 | 
			
		||||
ARG DOXYGEN_VERSION=1.14.0
 | 
			
		||||
ARG DOXYGEN_VERSION=1.15.0
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/doxygen/doxygen/releases/download/Release_${DOXYGEN_VERSION//./_}/doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
 | 
			
		||||
    && tar xf "doxygen-${DOXYGEN_VERSION}.src.tar.gz" \
 | 
			
		||||
    && cd "doxygen-${DOXYGEN_VERSION}" \
 | 
			
		||||
@@ -71,13 +71,13 @@ RUN wget --progress=dot:giga "https://github.com/aras-p/ClangBuildAnalyzer/archi
 | 
			
		||||
    && ninja install \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
ARG GIT_CLIFF_VERSION=2.9.1
 | 
			
		||||
ARG GIT_CLIFF_VERSION=2.10.1
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/orhun/git-cliff/releases/download/v${GIT_CLIFF_VERSION}/git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz" \
 | 
			
		||||
    && tar xf git-cliff-${GIT_CLIFF_VERSION}-x86_64-unknown-linux-musl.tar.gz \
 | 
			
		||||
    && mv git-cliff-${GIT_CLIFF_VERSION}/git-cliff /usr/local/bin/git-cliff \
 | 
			
		||||
    && rm -rf /tmp/* /var/tmp/*
 | 
			
		||||
 | 
			
		||||
ARG GH_VERSION=2.74.0
 | 
			
		||||
ARG GH_VERSION=2.82.1
 | 
			
		||||
RUN wget --progress=dot:giga "https://github.com/cli/cli/releases/download/v${GH_VERSION}/gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz" \
 | 
			
		||||
    && tar xf gh_${GH_VERSION}_linux_${TARGETARCH}.tar.gz \
 | 
			
		||||
    && mv gh_${GH_VERSION}_linux_${TARGETARCH}/bin/gh /usr/local/bin/gh \
 | 
			
		||||
 
 | 
			
		||||
@@ -191,7 +191,7 @@ Open the `index.html` file in your browser to see the documentation pages.
 | 
			
		||||
It is also possible to build Clio using [Docker](https://www.docker.com/) if you don't want to install all the dependencies on your machine.
 | 
			
		||||
 | 
			
		||||
```sh
 | 
			
		||||
docker run -it ghcr.io/xrplf/clio-ci:b2be4b51d1d81548ca48e2f2b8f67356b880c96d
 | 
			
		||||
docker run -it ghcr.io/xrplf/clio-ci:c117f470f2ef954520ab5d1c8a5ed2b9e68d6f8a
 | 
			
		||||
git clone https://github.com/XRPLF/clio
 | 
			
		||||
cd clio
 | 
			
		||||
```
 | 
			
		||||
 
 | 
			
		||||
@@ -36,9 +36,7 @@
 | 
			
		||||
#include <xrpl/protocol/LedgerFormats.h>
 | 
			
		||||
#include <xrpl/protocol/LedgerHeader.h>
 | 
			
		||||
#include <xrpl/protocol/SField.h>
 | 
			
		||||
#include <xrpl/protocol/STAmount.h>
 | 
			
		||||
#include <xrpl/protocol/STLedgerEntry.h>
 | 
			
		||||
#include <xrpl/protocol/UintTypes.h>
 | 
			
		||||
#include <xrpl/protocol/jss.h>
 | 
			
		||||
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
 
 | 
			
		||||
@@ -64,8 +64,8 @@ public:
 | 
			
		||||
        std::string issuer;
 | 
			
		||||
        uint32_t sequence{};
 | 
			
		||||
 | 
			
		||||
        std::optional<uint16_t> transferFee{};
 | 
			
		||||
        std::optional<uint8_t> assetScale{};
 | 
			
		||||
        std::optional<uint16_t> transferFee;
 | 
			
		||||
        std::optional<uint8_t> assetScale;
 | 
			
		||||
 | 
			
		||||
        std::optional<std::uint64_t> maximumAmount;
 | 
			
		||||
        std::optional<std::uint64_t> outstandingAmount;
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@
 | 
			
		||||
#include <boost/json/conversion.hpp>
 | 
			
		||||
#include <boost/json/object.hpp>
 | 
			
		||||
#include <boost/json/value.hpp>
 | 
			
		||||
#include <boost/json/value_from.hpp>
 | 
			
		||||
#include <boost/json/value_to.hpp>
 | 
			
		||||
#include <xrpl/basics/strHex.h>
 | 
			
		||||
#include <xrpl/protocol/AccountID.h>
 | 
			
		||||
@@ -36,9 +37,7 @@
 | 
			
		||||
#include <xrpl/protocol/LedgerFormats.h>
 | 
			
		||||
#include <xrpl/protocol/LedgerHeader.h>
 | 
			
		||||
#include <xrpl/protocol/SField.h>
 | 
			
		||||
#include <xrpl/protocol/STAmount.h>
 | 
			
		||||
#include <xrpl/protocol/STLedgerEntry.h>
 | 
			
		||||
#include <xrpl/protocol/UintTypes.h>
 | 
			
		||||
#include <xrpl/protocol/jss.h>
 | 
			
		||||
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@
 | 
			
		||||
#include "util/NameGenerator.hpp"
 | 
			
		||||
#include "util/TestObject.hpp"
 | 
			
		||||
 | 
			
		||||
#include <boost/asio/spawn.hpp>
 | 
			
		||||
#include <boost/json/parse.hpp>
 | 
			
		||||
#include <boost/json/value.hpp>
 | 
			
		||||
#include <boost/json/value_to.hpp>
 | 
			
		||||
@@ -40,6 +41,7 @@
 | 
			
		||||
#include <xrpl/protocol/STObject.h>
 | 
			
		||||
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <optional>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
@@ -136,48 +138,54 @@ static auto
 | 
			
		||||
generateTestValuesForInvalidParamsTest()
 | 
			
		||||
{
 | 
			
		||||
    return std::vector<AccountMPTokenIssuancesParamTestCaseBundle>{
 | 
			
		||||
        {"NonHexLedgerHash",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "ledger_hash": "xxx" }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "ledger_hashMalformed"},
 | 
			
		||||
        {"NonStringLedgerHash",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "ledger_hash": 123 }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "ledger_hashNotString"},
 | 
			
		||||
        {"InvalidLedgerIndexString",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "ledger_index": "notvalidated" }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "ledgerIndexMalformed"},
 | 
			
		||||
        {"MarkerNotString",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "marker": 9 }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "markerNotString"},
 | 
			
		||||
        {"InvalidMarkerContent",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "marker": "123invalid" }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Malformed cursor."},
 | 
			
		||||
        {"AccountMissing", R"JSON({ "limit": 10 })JSON", "invalidParams", "Required field 'account' missing"},
 | 
			
		||||
        {"AccountNotString", R"JSON({ "account": 123 })JSON", "actMalformed", "Account malformed."},
 | 
			
		||||
        {"AccountMalformed",
 | 
			
		||||
         R"JSON({ "account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jp" })JSON",
 | 
			
		||||
         "actMalformed",
 | 
			
		||||
         "Account malformed."},
 | 
			
		||||
        {"LimitNotInteger",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "limit": "t" }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Invalid parameters."},
 | 
			
		||||
        {"LimitNegative",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "limit": -1 }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Invalid parameters."},
 | 
			
		||||
        {"LimitZero",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "limit": 0 }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Invalid parameters."},
 | 
			
		||||
        {"LimitTypeInvalid",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "limit": true }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Invalid parameters."}
 | 
			
		||||
        {.testName = "NonHexLedgerHash",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "ledger_hash": "xxx" }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "ledger_hashMalformed"},
 | 
			
		||||
        {.testName = "NonStringLedgerHash",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "ledger_hash": 123 }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "ledger_hashNotString"},
 | 
			
		||||
        {.testName = "InvalidLedgerIndexString",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "ledger_index": "notvalidated" }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "ledgerIndexMalformed"},
 | 
			
		||||
        {.testName = "MarkerNotString",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "marker": 9 }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "markerNotString"},
 | 
			
		||||
        {.testName = "InvalidMarkerContent",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "marker": "123invalid" }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Malformed cursor."},
 | 
			
		||||
        {.testName = "AccountMissing",
 | 
			
		||||
         .testJson = R"JSON({ "limit": 10 })JSON",
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Required field 'account' missing"},
 | 
			
		||||
        {.testName = "AccountNotString",
 | 
			
		||||
         .testJson = R"JSON({ "account": 123 })JSON",
 | 
			
		||||
         .expectedError = "actMalformed",
 | 
			
		||||
         .expectedErrorMessage = "Account malformed."},
 | 
			
		||||
        {.testName = "AccountMalformed",
 | 
			
		||||
         .testJson = R"JSON({ "account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jp" })JSON",
 | 
			
		||||
         .expectedError = "actMalformed",
 | 
			
		||||
         .expectedErrorMessage = "Account malformed."},
 | 
			
		||||
        {.testName = "LimitNotInteger",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "limit": "t" }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Invalid parameters."},
 | 
			
		||||
        {.testName = "LimitNegative",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "limit": -1 }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Invalid parameters."},
 | 
			
		||||
        {.testName = "LimitZero",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "limit": 0 }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Invalid parameters."},
 | 
			
		||||
        {.testName = "LimitTypeInvalid",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "limit": true }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Invalid parameters."}
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -436,7 +444,7 @@ TEST_F(RPCAccountMPTokenIssuancesHandlerTest, DefaultParameters)
 | 
			
		||||
 | 
			
		||||
TEST_F(RPCAccountMPTokenIssuancesHandlerTest, UseLimit)
 | 
			
		||||
{
 | 
			
		||||
    constexpr int limit = 20;
 | 
			
		||||
    constexpr int kLIMIT = 20;
 | 
			
		||||
    auto ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
 | 
			
		||||
    ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
 | 
			
		||||
 | 
			
		||||
@@ -449,7 +457,7 @@ TEST_F(RPCAccountMPTokenIssuancesHandlerTest, UseLimit)
 | 
			
		||||
    std::vector<Blob> bbs;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 50; ++i) {
 | 
			
		||||
        indexes.emplace_back(ripple::uint256{kISSUANCE_INDEX1});
 | 
			
		||||
        indexes.emplace_back(kISSUANCE_INDEX1);
 | 
			
		||||
        auto const issuance = createMptIssuanceObject(kACCOUNT, i);
 | 
			
		||||
        bbs.push_back(issuance.getSerializer().peekData());
 | 
			
		||||
    }
 | 
			
		||||
@@ -462,7 +470,7 @@ TEST_F(RPCAccountMPTokenIssuancesHandlerTest, UseLimit)
 | 
			
		||||
    ON_CALL(*backend_, doFetchLedgerObjects).WillByDefault(Return(bbs));
 | 
			
		||||
    EXPECT_CALL(*backend_, doFetchLedgerObjects).Times(3);
 | 
			
		||||
 | 
			
		||||
    runSpawn([this, limit](auto yield) {
 | 
			
		||||
    runSpawn([this, kLIMIT](auto yield) {
 | 
			
		||||
        auto const input = json::parse(
 | 
			
		||||
            fmt::format(
 | 
			
		||||
                R"JSON({{
 | 
			
		||||
@@ -470,7 +478,7 @@ TEST_F(RPCAccountMPTokenIssuancesHandlerTest, UseLimit)
 | 
			
		||||
                    "limit": {}
 | 
			
		||||
                }})JSON",
 | 
			
		||||
                kACCOUNT,
 | 
			
		||||
                limit
 | 
			
		||||
                kLIMIT
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
@@ -479,7 +487,7 @@ TEST_F(RPCAccountMPTokenIssuancesHandlerTest, UseLimit)
 | 
			
		||||
        ASSERT_TRUE(output);
 | 
			
		||||
 | 
			
		||||
        auto const resultJson = (*output.result).as_object();
 | 
			
		||||
        EXPECT_EQ(resultJson.at("mpt_issuances").as_array().size(), limit);
 | 
			
		||||
        EXPECT_EQ(resultJson.at("mpt_issuances").as_array().size(), kLIMIT);
 | 
			
		||||
        ASSERT_TRUE(resultJson.contains("marker"));
 | 
			
		||||
        EXPECT_THAT(boost::json::value_to<std::string>(resultJson.at("marker")), EndsWith(",0"));
 | 
			
		||||
    });
 | 
			
		||||
@@ -534,11 +542,13 @@ TEST_F(RPCAccountMPTokenIssuancesHandlerTest, MarkerOutput)
 | 
			
		||||
    EXPECT_CALL(*backend_, doFetchLedgerObject).Times(3);
 | 
			
		||||
 | 
			
		||||
    std::vector<ripple::uint256> indexes;
 | 
			
		||||
    indexes.reserve(10);
 | 
			
		||||
    for (int i = 0; i < 10; ++i) {
 | 
			
		||||
        indexes.emplace_back(kISSUANCE_INDEX1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::vector<Blob> bbs;
 | 
			
		||||
    bbs.reserve(kLIMIT);
 | 
			
		||||
    for (int i = 0; i < kLIMIT; ++i) {
 | 
			
		||||
        bbs.push_back(createMptIssuanceObject(kACCOUNT, i).getSerializer().peekData());
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -112,48 +112,54 @@ static auto
 | 
			
		||||
generateTestValuesForInvalidParamsTest()
 | 
			
		||||
{
 | 
			
		||||
    return std::vector<AccountMPTokensParamTestCaseBundle>{
 | 
			
		||||
        {"NonHexLedgerHash",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "ledger_hash": "xxx" }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "ledger_hashMalformed"},
 | 
			
		||||
        {"NonStringLedgerHash",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "ledger_hash": 123 }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "ledger_hashNotString"},
 | 
			
		||||
        {"InvalidLedgerIndexString",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "ledger_index": "notvalidated" }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "ledgerIndexMalformed"},
 | 
			
		||||
        {"MarkerNotString",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "marker": 9 }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "markerNotString"},
 | 
			
		||||
        {"InvalidMarkerContent",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "marker": "123invalid" }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Malformed cursor."},
 | 
			
		||||
        {"AccountMissing", R"JSON({ "limit": 10 })JSON", "invalidParams", "Required field 'account' missing"},
 | 
			
		||||
        {"AccountNotString", R"JSON({ "account": 123 })JSON", "actMalformed", "Account malformed."},
 | 
			
		||||
        {"AccountMalformed",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}" }})JSON", "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jp"),
 | 
			
		||||
         "actMalformed",
 | 
			
		||||
         "Account malformed."},
 | 
			
		||||
        {"LimitNotInteger",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "limit": "t" }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Invalid parameters."},
 | 
			
		||||
        {"LimitNegative",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "limit": -1 }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Invalid parameters."},
 | 
			
		||||
        {"LimitZero",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "limit": 0 }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Invalid parameters."},
 | 
			
		||||
        {"LimitTypeInvalid",
 | 
			
		||||
         fmt::format(R"JSON({{ "account": "{}", "limit": true }})JSON", kACCOUNT),
 | 
			
		||||
         "invalidParams",
 | 
			
		||||
         "Invalid parameters."}
 | 
			
		||||
        {.testName = "NonHexLedgerHash",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "ledger_hash": "xxx" }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "ledger_hashMalformed"},
 | 
			
		||||
        {.testName = "NonStringLedgerHash",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "ledger_hash": 123 }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "ledger_hashNotString"},
 | 
			
		||||
        {.testName = "InvalidLedgerIndexString",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "ledger_index": "notvalidated" }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "ledgerIndexMalformed"},
 | 
			
		||||
        {.testName = "MarkerNotString",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "marker": 9 }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "markerNotString"},
 | 
			
		||||
        {.testName = "InvalidMarkerContent",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "marker": "123invalid" }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Malformed cursor."},
 | 
			
		||||
        {.testName = "AccountMissing",
 | 
			
		||||
         .testJson = R"JSON({ "limit": 10 })JSON",
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Required field 'account' missing"},
 | 
			
		||||
        {.testName = "AccountNotString",
 | 
			
		||||
         .testJson = R"JSON({ "account": 123 })JSON",
 | 
			
		||||
         .expectedError = "actMalformed",
 | 
			
		||||
         .expectedErrorMessage = "Account malformed."},
 | 
			
		||||
        {.testName = "AccountMalformed",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}" }})JSON", "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jp"),
 | 
			
		||||
         .expectedError = "actMalformed",
 | 
			
		||||
         .expectedErrorMessage = "Account malformed."},
 | 
			
		||||
        {.testName = "LimitNotInteger",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "limit": "t" }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Invalid parameters."},
 | 
			
		||||
        {.testName = "LimitNegative",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "limit": -1 }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Invalid parameters."},
 | 
			
		||||
        {.testName = "LimitZero",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "limit": 0 }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Invalid parameters."},
 | 
			
		||||
        {.testName = "LimitTypeInvalid",
 | 
			
		||||
         .testJson = fmt::format(R"JSON({{ "account": "{}", "limit": true }})JSON", kACCOUNT),
 | 
			
		||||
         .expectedError = "invalidParams",
 | 
			
		||||
         .expectedErrorMessage = "Invalid parameters."}
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -388,7 +394,7 @@ TEST_F(RPCAccountMPTokensHandlerTest, DefaultParameters)
 | 
			
		||||
 | 
			
		||||
TEST_F(RPCAccountMPTokensHandlerTest, UseLimit)
 | 
			
		||||
{
 | 
			
		||||
    constexpr int limit = 20;
 | 
			
		||||
    constexpr int kLIMIT = 20;
 | 
			
		||||
    auto ledgerHeader = createLedgerHeader(kLEDGER_HASH, 30);
 | 
			
		||||
    ON_CALL(*backend_, fetchLedgerBySequence).WillByDefault(Return(ledgerHeader));
 | 
			
		||||
 | 
			
		||||
@@ -401,7 +407,7 @@ TEST_F(RPCAccountMPTokensHandlerTest, UseLimit)
 | 
			
		||||
    std::vector<Blob> bbs;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 50; ++i) {
 | 
			
		||||
        indexes.emplace_back(ripple::uint256{kTOKEN_INDEX1});
 | 
			
		||||
        indexes.emplace_back(kTOKEN_INDEX1);
 | 
			
		||||
        auto const token = createMpTokenObject(kACCOUNT, ripple::uint192(kISSUANCE_ID_HEX), i, 0, std::nullopt);
 | 
			
		||||
        bbs.push_back(token.getSerializer().peekData());
 | 
			
		||||
    }
 | 
			
		||||
@@ -414,7 +420,7 @@ TEST_F(RPCAccountMPTokensHandlerTest, UseLimit)
 | 
			
		||||
    ON_CALL(*backend_, doFetchLedgerObjects).WillByDefault(Return(bbs));
 | 
			
		||||
    EXPECT_CALL(*backend_, doFetchLedgerObjects).Times(3);
 | 
			
		||||
 | 
			
		||||
    runSpawn([this, limit](auto yield) {
 | 
			
		||||
    runSpawn([this, kLIMIT](auto yield) {
 | 
			
		||||
        auto const input = json::parse(
 | 
			
		||||
            fmt::format(
 | 
			
		||||
                R"JSON({{
 | 
			
		||||
@@ -422,7 +428,7 @@ TEST_F(RPCAccountMPTokensHandlerTest, UseLimit)
 | 
			
		||||
                    "limit": {}
 | 
			
		||||
                }})JSON",
 | 
			
		||||
                kACCOUNT,
 | 
			
		||||
                limit
 | 
			
		||||
                kLIMIT
 | 
			
		||||
            )
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
@@ -431,7 +437,7 @@ TEST_F(RPCAccountMPTokensHandlerTest, UseLimit)
 | 
			
		||||
        ASSERT_TRUE(output);
 | 
			
		||||
 | 
			
		||||
        auto const resultJson = (*output.result).as_object();
 | 
			
		||||
        EXPECT_EQ(resultJson.at("mptokens").as_array().size(), limit);
 | 
			
		||||
        EXPECT_EQ(resultJson.at("mptokens").as_array().size(), kLIMIT);
 | 
			
		||||
        ASSERT_TRUE(resultJson.contains("marker"));
 | 
			
		||||
        EXPECT_THAT(boost::json::value_to<std::string>(resultJson.at("marker")), EndsWith(",0"));
 | 
			
		||||
    });
 | 
			
		||||
@@ -487,6 +493,7 @@ TEST_F(RPCAccountMPTokensHandlerTest, MarkerOutput)
 | 
			
		||||
    ON_CALL(*backend_, doFetchLedgerObject(accountKk, _, _)).WillByDefault(Return(Blob{'f', 'a', 'k', 'e'}));
 | 
			
		||||
 | 
			
		||||
    std::vector<Blob> bbs;
 | 
			
		||||
    bbs.reserve(kLIMIT);
 | 
			
		||||
    for (int i = 0; i < kLIMIT; ++i) {
 | 
			
		||||
        bbs.push_back(createMpTokenObject(kACCOUNT, ripple::uint192(kISSUANCE_ID_HEX), i, 0, std::nullopt)
 | 
			
		||||
                          .getSerializer()
 | 
			
		||||
@@ -495,6 +502,7 @@ TEST_F(RPCAccountMPTokensHandlerTest, MarkerOutput)
 | 
			
		||||
    EXPECT_CALL(*backend_, doFetchLedgerObjects).WillOnce(Return(bbs));
 | 
			
		||||
 | 
			
		||||
    std::vector<ripple::uint256> indexes1;
 | 
			
		||||
    indexes1.reserve(10);
 | 
			
		||||
    for (int i = 0; i < 10; ++i) {
 | 
			
		||||
        indexes1.emplace_back(kTOKEN_INDEX1);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user