From 7dee5129917d1ebd4211153bca0fc9695074752a Mon Sep 17 00:00:00 2001 From: Denis Angell Date: Wed, 1 Nov 2023 14:56:12 +0100 Subject: [PATCH] Housekeeping (#170) * Update pull_request_template.md * strip out unused files * Update CONTRIBUTING.md * fix docker * remove conan stuff * update license * update hook directory * Delete .codecov.yml * Update .dockerignore * Update genesis.json * update validator list example * Update rippled-standalone.cfg * Update CONTRIBUTING.md --- .codecov.yml | 5 - .github/pull_request_template.md | 23 +- .gitlab-ci.yml | 169 -- .pre-commit-config.yaml | 6 + .travis.yml | 460 --- Builds/Test.py | 405 --- Builds/VisualStudio2017/README.md | 1 - .../CMakeSettings-example.json | 45 - Builds/VisualStudio2019/README.md | 263 -- Builds/build_all.sh | 7 - Builds/containers/README.md | 31 - Builds/containers/centos-builder/Dockerfile | 26 - .../containers/centos-builder/centos_setup.sh | 22 - .../containers/gitlab-ci/build_container.sh | 28 - Builds/containers/gitlab-ci/build_package.sh | 28 - .../gitlab-ci/docker_alpine_setup.sh | 15 - Builds/containers/gitlab-ci/get_component.sh | 16 - Builds/containers/gitlab-ci/pkgbuild.yml | 646 ----- .../gitlab-ci/push_to_artifactory.sh | 92 - Builds/containers/gitlab-ci/sign_package.sh | 38 - Builds/containers/gitlab-ci/smoketest.sh | 108 - .../containers/gitlab-ci/tag_docker_image.sh | 21 - .../gitlab-ci/verify_head_commit.sh | 17 - .../containers/packaging/dpkg/build_dpkg.sh | 95 - .../packaging/dpkg/debian/README.Debian | 3 - .../containers/packaging/dpkg/debian/compat | 1 - .../containers/packaging/dpkg/debian/control | 19 - .../packaging/dpkg/debian/copyright | 86 - Builds/containers/packaging/dpkg/debian/dirs | 3 - Builds/containers/packaging/dpkg/debian/docs | 3 - .../packaging/dpkg/debian/rippled-dev.install | 3 - .../dpkg/debian/rippled-reporting.dirs | 3 - .../dpkg/debian/rippled-reporting.install | 8 - .../dpkg/debian/rippled-reporting.links | 3 - .../dpkg/debian/rippled-reporting.postinst | 33 - .../packaging/dpkg/debian/rippled.conffiles | 2 - .../packaging/dpkg/debian/rippled.install | 8 - .../packaging/dpkg/debian/rippled.links | 3 - .../packaging/dpkg/debian/rippled.postinst | 35 - .../packaging/dpkg/debian/rippled.postrm | 17 - .../packaging/dpkg/debian/rippled.preinst | 20 - .../packaging/dpkg/debian/rippled.prerm | 20 - Builds/containers/packaging/dpkg/debian/rules | 80 - .../packaging/dpkg/debian/source/format | 1 - .../dpkg/debian/source/local-options | 2 - .../packaging/rpm/50-rippled-reporting.preset | 1 - .../packaging/rpm/50-rippled.preset | 1 - Builds/containers/packaging/rpm/build_rpm.sh | 82 - Builds/containers/packaging/rpm/rippled.spec | 236 -- Builds/containers/shared/install_cmake.sh | 37 - Builds/containers/shared/rippled-logrotate | 15 - .../shared/rippled-reporting.service | 15 - Builds/containers/shared/rippled.service | 15 - Builds/containers/shared/update-rippled-cron | 10 - Builds/containers/shared/update-rippled.sh | 65 - Builds/containers/shared/update_sources.sh | 20 - Builds/containers/ubuntu-builder/Dockerfile | 15 - .../containers/ubuntu-builder/ubuntu_setup.sh | 76 - Builds/linux/README.md | 1 - Builds/macos/README.md | 1 - CONTRIBUTING.md | 211 +- LICENSE.md | 1 + bin/browser.js | 470 ---- bin/ci/README.md | 24 - bin/ci/build.sh | 31 - bin/ci/test.sh | 41 - bin/ci/ubuntu/build-and-test.sh | 274 -- bin/ci/ubuntu/build-in-docker.sh | 36 - bin/ci/ubuntu/travis-cache-start.sh | 44 - bin/debug_local_sign.js | 64 - bin/email_hash.js | 18 - bin/flash_policy.js | 31 - bin/getRippledInfo | 150 - bin/hexify.js | 23 - bin/jsonrpc_request.js | 42 - bin/jsonrpc_server.js | 68 - bin/rlint.js | 252 -- bin/sh/install-vcpkg.sh | 51 - bin/sh/setup-msvc.sh | 40 - bin/start_sync_stop.py | 246 -- bin/stop-test.js | 133 - bin/update_binformat.js | 119 - cfg/genesis.json | 171 +- cfg/initdb.sh | 10 - cfg/rippled-standalone.cfg | 9 +- cfg/validators-example.txt | 16 + docker/Dockerfile | 43 - docker/build_docker_xrpllabs.sh | 6 - docs/.gitignore | 3 - docs/0001-negative-unl/README.md | 597 ---- .../negativeUNLSqDiagram.puml | 79 - .../negativeUNL_highLevel_sequence.png | Bin 140927 -> 0 bytes docs/0010-ledger-replay/README.md | 88 - .../ledger_replay_classes.png | Bin 91658 -> 0 bytes .../ledger_replay_classes.puml | 98 - .../ledger_replay_sequence.png | Bin 124133 -> 0 bytes .../ledger_replay_sequence.puml | 85 - docs/CheatSheet.md | 20 - docs/CodingStyle.md | 82 - docs/Docker.md | 5 - docs/Dockerfile | 32 - docs/Doxyfile | 344 --- docs/HeapProfiling.md | 63 - docs/NodeStoreRefactoringCaseStudy.pdf | Bin 393922 -> 0 bytes docs/README.md | 63 - docs/consensus.md | 683 ----- docs/images/consensus/EffCloseTime.png | Bin 1975 -> 0 bytes docs/images/consensus/block_chain.png | Bin 5217 -> 0 bytes docs/images/consensus/consensus_modes.png | Bin 14411 -> 0 bytes docs/images/consensus/consensus_overview.png | Bin 34251 -> 0 bytes docs/images/consensus/disputes.png | Bin 34557 -> 0 bytes docs/images/consensus/ledger_chain.png | Bin 25726 -> 0 bytes docs/images/consensus/threshold.png | Bin 13245 -> 0 bytes docs/images/xrp-text-mark-black-small@2x.png | Bin 1462 -> 0 bytes docs/sample_chart.doc | 24 - external/snappy/conandata.yml | 16 - external/snappy/conanfile.py | 89 - .../1.1.9-0001-fix-inlining-failure.patch | 14 - .../snappy/patches/1.1.9-0002-no-Werror.patch | 12 - ...1.9-0003-fix-clobber-list-older-llvm.patch | 12 - .../patches/1.1.9-0004-rtti-by-default.patch | 20 - hook/LaunchHooks.md | 68 - hook/definitions.json | 2473 ----------------- hook/{ => genesis}/govern.c | 0 hook/{ => genesis}/makefile | 0 hook/{ => genesis}/mint.c | 0 hook/{ => genesis}/nftoken.c | 0 hook/{ => genesis}/rekey-validator.js | 0 hook/{ => genesis}/reward.c | 0 hook/utils-tests.js | 637 ----- hook/v3l1s | 13 - hook/v3l2s | 150 - 132 files changed, 375 insertions(+), 11529 deletions(-) delete mode 100644 .codecov.yml delete mode 100644 .gitlab-ci.yml create mode 100644 .pre-commit-config.yaml delete mode 100644 .travis.yml delete mode 100755 Builds/Test.py delete mode 100644 Builds/VisualStudio2017/README.md delete mode 100644 Builds/VisualStudio2019/CMakeSettings-example.json delete mode 100644 Builds/VisualStudio2019/README.md delete mode 100755 Builds/build_all.sh delete mode 100644 Builds/containers/README.md delete mode 100644 Builds/containers/centos-builder/Dockerfile delete mode 100755 Builds/containers/centos-builder/centos_setup.sh delete mode 100644 Builds/containers/gitlab-ci/build_container.sh delete mode 100644 Builds/containers/gitlab-ci/build_package.sh delete mode 100644 Builds/containers/gitlab-ci/docker_alpine_setup.sh delete mode 100644 Builds/containers/gitlab-ci/get_component.sh delete mode 100644 Builds/containers/gitlab-ci/pkgbuild.yml delete mode 100644 Builds/containers/gitlab-ci/push_to_artifactory.sh delete mode 100644 Builds/containers/gitlab-ci/sign_package.sh delete mode 100644 Builds/containers/gitlab-ci/smoketest.sh delete mode 100644 Builds/containers/gitlab-ci/tag_docker_image.sh delete mode 100644 Builds/containers/gitlab-ci/verify_head_commit.sh delete mode 100755 Builds/containers/packaging/dpkg/build_dpkg.sh delete mode 100644 Builds/containers/packaging/dpkg/debian/README.Debian delete mode 100644 Builds/containers/packaging/dpkg/debian/compat delete mode 100644 Builds/containers/packaging/dpkg/debian/control delete mode 100644 Builds/containers/packaging/dpkg/debian/copyright delete mode 100644 Builds/containers/packaging/dpkg/debian/dirs delete mode 100644 Builds/containers/packaging/dpkg/debian/docs delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled-dev.install delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled-reporting.dirs delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled-reporting.install delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled-reporting.links delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled-reporting.postinst delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled.conffiles delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled.install delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled.links delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled.postinst delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled.postrm delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled.preinst delete mode 100644 Builds/containers/packaging/dpkg/debian/rippled.prerm delete mode 100755 Builds/containers/packaging/dpkg/debian/rules delete mode 100644 Builds/containers/packaging/dpkg/debian/source/format delete mode 100644 Builds/containers/packaging/dpkg/debian/source/local-options delete mode 100644 Builds/containers/packaging/rpm/50-rippled-reporting.preset delete mode 100644 Builds/containers/packaging/rpm/50-rippled.preset delete mode 100755 Builds/containers/packaging/rpm/build_rpm.sh delete mode 100644 Builds/containers/packaging/rpm/rippled.spec delete mode 100755 Builds/containers/shared/install_cmake.sh delete mode 100644 Builds/containers/shared/rippled-logrotate delete mode 100644 Builds/containers/shared/rippled-reporting.service delete mode 100644 Builds/containers/shared/rippled.service delete mode 100644 Builds/containers/shared/update-rippled-cron delete mode 100755 Builds/containers/shared/update-rippled.sh delete mode 100755 Builds/containers/shared/update_sources.sh delete mode 100644 Builds/containers/ubuntu-builder/Dockerfile delete mode 100755 Builds/containers/ubuntu-builder/ubuntu_setup.sh delete mode 100644 Builds/linux/README.md delete mode 100644 Builds/macos/README.md delete mode 100755 bin/browser.js delete mode 100644 bin/ci/README.md delete mode 100755 bin/ci/build.sh delete mode 100755 bin/ci/test.sh delete mode 100755 bin/ci/ubuntu/build-and-test.sh delete mode 100755 bin/ci/ubuntu/build-in-docker.sh delete mode 100755 bin/ci/ubuntu/travis-cache-start.sh delete mode 100644 bin/debug_local_sign.js delete mode 100755 bin/email_hash.js delete mode 100755 bin/flash_policy.js delete mode 100755 bin/getRippledInfo delete mode 100755 bin/hexify.js delete mode 100755 bin/jsonrpc_request.js delete mode 100755 bin/jsonrpc_server.js delete mode 100755 bin/rlint.js delete mode 100755 bin/sh/install-vcpkg.sh delete mode 100755 bin/sh/setup-msvc.sh delete mode 100644 bin/start_sync_stop.py delete mode 100644 bin/stop-test.js delete mode 100644 bin/update_binformat.js delete mode 100755 cfg/initdb.sh delete mode 100644 docker/Dockerfile delete mode 100755 docker/build_docker_xrpllabs.sh delete mode 100644 docs/.gitignore delete mode 100644 docs/0001-negative-unl/README.md delete mode 100644 docs/0001-negative-unl/negativeUNLSqDiagram.puml delete mode 100644 docs/0001-negative-unl/negativeUNL_highLevel_sequence.png delete mode 100644 docs/0010-ledger-replay/README.md delete mode 100644 docs/0010-ledger-replay/ledger_replay_classes.png delete mode 100644 docs/0010-ledger-replay/ledger_replay_classes.puml delete mode 100644 docs/0010-ledger-replay/ledger_replay_sequence.png delete mode 100644 docs/0010-ledger-replay/ledger_replay_sequence.puml delete mode 100644 docs/CheatSheet.md delete mode 100644 docs/CodingStyle.md delete mode 100644 docs/Docker.md delete mode 100644 docs/Dockerfile delete mode 100644 docs/Doxyfile delete mode 100644 docs/HeapProfiling.md delete mode 100644 docs/NodeStoreRefactoringCaseStudy.pdf delete mode 100644 docs/README.md delete mode 100644 docs/consensus.md delete mode 100644 docs/images/consensus/EffCloseTime.png delete mode 100644 docs/images/consensus/block_chain.png delete mode 100644 docs/images/consensus/consensus_modes.png delete mode 100644 docs/images/consensus/consensus_overview.png delete mode 100644 docs/images/consensus/disputes.png delete mode 100644 docs/images/consensus/ledger_chain.png delete mode 100644 docs/images/consensus/threshold.png delete mode 100644 docs/images/xrp-text-mark-black-small@2x.png delete mode 100644 docs/sample_chart.doc delete mode 100644 external/snappy/conandata.yml delete mode 100644 external/snappy/conanfile.py delete mode 100644 external/snappy/patches/1.1.9-0001-fix-inlining-failure.patch delete mode 100644 external/snappy/patches/1.1.9-0002-no-Werror.patch delete mode 100644 external/snappy/patches/1.1.9-0003-fix-clobber-list-older-llvm.patch delete mode 100644 external/snappy/patches/1.1.9-0004-rtti-by-default.patch delete mode 100644 hook/LaunchHooks.md delete mode 100644 hook/definitions.json rename hook/{ => genesis}/govern.c (100%) rename hook/{ => genesis}/makefile (100%) rename hook/{ => genesis}/mint.c (100%) rename hook/{ => genesis}/nftoken.c (100%) rename hook/{ => genesis}/rekey-validator.js (100%) rename hook/{ => genesis}/reward.c (100%) delete mode 100644 hook/utils-tests.js delete mode 100644 hook/v3l1s delete mode 100644 hook/v3l2s diff --git a/.codecov.yml b/.codecov.yml deleted file mode 100644 index b2bc67814..000000000 --- a/.codecov.yml +++ /dev/null @@ -1,5 +0,0 @@ - -codecov: - ci: - - !appveyor - - travis diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index ca7367b87..553fa2be1 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -33,10 +33,27 @@ Please check [x] relevant options, delete irrelevant ones. - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [ ] Refactor (non-breaking change that only restructures code) -- [ ] Tests (You added tests for code that already exists, or your new feature included in this PR) -- [ ] Documentation Updates +- [ ] Tests (you added tests for code that already exists, or your new feature included in this PR) +- [ ] Documentation update +- [ ] Chore (no impact to binary, e.g. `.gitignore`, formatting, dropping support for older tooling) - [ ] Release +### API Impact + + + +- [ ] Public API: New feature (new methods and/or new fields) +- [ ] Public API: Breaking change (in general, breaking changes should only impact the next api_version) +- [ ] `libxrpl` change (any change that may affect `libxrpl` or dependents of `libxrpl`) +- [ ] Peer protocol change (must be backward compatible or bump the peer protocol version) + +--> \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 02475adf0..000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,169 +0,0 @@ -# I don't know what the minimum size is, but we cannot build on t3.micro. - -# TODO: Factor common builds between different tests. - -# The parameters for our job matrix: -# -# 1. Generator (Make, Ninja, MSBuild) -# 2. Compiler (GCC, Clang, MSVC) -# 3. Build type (Debug, Release) -# 4. Definitions (-Dunity=OFF, -Dassert=ON, ...) - - -.job_linux_build_test: - only: - variables: - - $CI_PROJECT_URL =~ /^https?:\/\/gitlab.com\// - stage: build - tags: - - linux - - c5.2xlarge - image: thejohnfreeman/rippled-build-ubuntu:4b73694e07f0 - script: - - bin/ci/build.sh - - bin/ci/test.sh - cache: - # Use a different key for each unique combination of (generator, compiler, - # build type). Caches are stored as `.zip` files; they are not merged. - # Generate a new key whenever you want to bust the cache, e.g. when the - # dependency versions have been bumped. - # By default, jobs pull the cache. Only a few specially chosen jobs update - # the cache (with policy `pull-push`); one for each unique combination of - # (generator, compiler, build type). - policy: pull - paths: - - .nih_c/ - -'build+test Make GCC Debug': - extends: .job_linux_build_test - variables: - GENERATOR: Unix Makefiles - COMPILER: gcc - BUILD_TYPE: Debug - cache: - key: 62ada41c-fc9e-4949-9533-736d4d6512b6 - policy: pull-push - -'build+test Ninja GCC Debug': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: gcc - BUILD_TYPE: Debug - cache: - key: 1665d3eb-6233-4eef-9f57-172636899faa - policy: pull-push - -'build+test Ninja GCC Debug -Dstatic=OFF': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: gcc - BUILD_TYPE: Debug - CMAKE_ARGS: '-Dstatic=OFF' - cache: - key: 1665d3eb-6233-4eef-9f57-172636899faa - -'build+test Ninja GCC Debug -Dstatic=OFF -DBUILD_SHARED_LIBS=ON': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: gcc - BUILD_TYPE: Debug - CMAKE_ARGS: '-Dstatic=OFF -DBUILD_SHARED_LIBS=ON' - cache: - key: 1665d3eb-6233-4eef-9f57-172636899faa - -'build+test Ninja GCC Debug -Dunity=OFF': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: gcc - BUILD_TYPE: Debug - CMAKE_ARGS: '-Dunity=OFF' - cache: - key: 1665d3eb-6233-4eef-9f57-172636899faa - -'build+test Ninja GCC Release -Dassert=ON': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: gcc - BUILD_TYPE: Release - CMAKE_ARGS: '-Dassert=ON' - cache: - key: c45ec125-9625-4c19-acf7-4e889d5f90bd - policy: pull-push - -'build+test(manual) Ninja GCC Release -Dassert=ON': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: gcc - BUILD_TYPE: Release - CMAKE_ARGS: '-Dassert=ON' - MANUAL_TEST: 'true' - cache: - key: c45ec125-9625-4c19-acf7-4e889d5f90bd - -'build+test Make clang Debug': - extends: .job_linux_build_test - variables: - GENERATOR: Unix Makefiles - COMPILER: clang - BUILD_TYPE: Debug - cache: - key: bf578dc2-5277-4580-8de5-6b9523118b19 - policy: pull-push - -'build+test Ninja clang Debug': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: clang - BUILD_TYPE: Debug - cache: - key: 762514c5-3d4c-4c7c-8da2-2df9d8839cbe - policy: pull-push - -'build+test Ninja clang Debug -Dunity=OFF': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: clang - BUILD_TYPE: Debug - CMAKE_ARGS: '-Dunity=OFF' - cache: - key: 762514c5-3d4c-4c7c-8da2-2df9d8839cbe - -'build+test Ninja clang Debug -Dunity=OFF -Dsan=address': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: clang - BUILD_TYPE: Debug - CMAKE_ARGS: '-Dunity=OFF -Dsan=address' - CONCURRENT_TESTS: 1 - cache: - key: 762514c5-3d4c-4c7c-8da2-2df9d8839cbe - -'build+test Ninja clang Debug -Dunity=OFF -Dsan=undefined': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: clang - BUILD_TYPE: Debug - CMAKE_ARGS: '-Dunity=OFF -Dsan=undefined' - cache: - key: 762514c5-3d4c-4c7c-8da2-2df9d8839cbe - -'build+test Ninja clang Release -Dassert=ON': - extends: .job_linux_build_test - variables: - GENERATOR: Ninja - COMPILER: clang - BUILD_TYPE: Release - CMAKE_ARGS: '-Dassert=ON' - cache: - key: 7751be37-2358-4f08-b1d0-7e72e0ad266d - policy: pull-push diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..04893e956 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,6 @@ +# .pre-commit-config.yaml +repos: +- repo: https://github.com/pre-commit/mirrors-clang-format + rev: v10.0.1 + hooks: + - id: clang-format diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index d8cbf4344..000000000 --- a/.travis.yml +++ /dev/null @@ -1,460 +0,0 @@ -# There is a known issue where Travis will have trouble fetching the cache, -# particularly on non-linux builds. Try restarting the individual build -# (probably will not be necessary in the "windep" stages) if the end of the -# log looks like: -# -#--------------------------------------- -# attempting to download cache archive -# fetching travisorder/cache--windows-1809-containers-f2bf1c76c7fb4095c897a4999bd7c9b3fb830414dfe91f33d665443b52416d39--compiler-gpp.tgz -# found cache -# adding C:/Users/travis/_cache to cache -# creating directory C:/Users/travis/_cache -# No output has been received in the last 10m0s, this potentially indicates a stalled build or something wrong with the build itself. -# Check the details on how to adjust your build configuration on: https://docs.travis-ci.com/user/common-build-problems/#build-times-out-because-no-output-was-received -# The build has been terminated -#--------------------------------------- - -language: cpp -dist: bionic - -services: - - docker - -stages: - - windep-vcpkg - - windep-boost - - build - -env: - global: - - DOCKER_IMAGE="rippleci/rippled-ci-builder:2020-01-08" - - CMAKE_EXTRA_ARGS="-Dwerr=ON -Dwextra=ON" - - NINJA_BUILD=true - # change this if we get more VM capacity - - MAX_TIME_MIN=80 - - CACHE_DIR=${TRAVIS_HOME}/_cache - - NIH_CACHE_ROOT=${CACHE_DIR}/nih_c - - PARALLEL_TESTS=true - # this is NOT used by linux container based builds (which already have boost installed) - - BOOST_URL='https://boostorg.jfrog.io/artifactory/main/release/1.75.0/source/boost_1_75_0.tar.gz' - # Alternate dowload location - - BOOST_URL2='https://downloads.sourceforge.net/project/boost/boost/1.75.0/boost_1_75_0.tar.bz2?r=&ts=1594393912&use_mirror=newcontinuum' - # Travis downloader doesn't seem to have updated certs. Using this option - # introduces obvious security risks, but they're Travis's risks. - # Note that this option is only used if the "normal" build fails. - - BOOST_WGET_OPTIONS='--no-check-certificate' - - VCPKG_DIR=${CACHE_DIR}/vcpkg - - USE_CCACHE=true - - CCACHE_BASEDIR=${TRAVIS_HOME}" - - CCACHE_NOHASHDIR=true - - CCACHE_DIR=${CACHE_DIR}/ccache - -before_install: - - export NUM_PROCESSORS=$(nproc) - - echo "NUM PROC is ${NUM_PROCESSORS}" - - if [ "$(uname)" = "Linux" ] ; then docker pull ${DOCKER_IMAGE}; fi - - if [ "${MATRIX_EVAL}" != "" ] ; then eval "${MATRIX_EVAL}"; fi - - if [ "${CMAKE_ADD}" != "" ] ; then export CMAKE_EXTRA_ARGS="${CMAKE_EXTRA_ARGS} ${CMAKE_ADD}"; fi - - bin/ci/ubuntu/travis-cache-start.sh - -matrix: - fast_finish: true - allow_failures: - # TODO these need more investigation - # - # there are a number of UBs caught currently that need triage - - name: ubsan, clang-8 - # this one often runs out of memory: - - name: manual tests, gcc-8, release - # The Windows build may fail if any of the dependencies fail, but - # allow the rest of the builds to continue. They may succeed if the - # dependency is already cached. These do not need to be retried if - # _any_ of the Windows builds succeed. - - stage: windep-vcpkg - - stage: windep-boost - - # https://docs.travis-ci.com/user/build-config-yaml#usage-of-yaml-anchors-and-aliases - include: - # debug builds - - &linux - stage: build - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ - compiler: gcc-8 - name: gcc-8, debug - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - script: - - sudo chmod -R a+rw ${CACHE_DIR} - - ccache -s - - travis_wait ${MAX_TIME_MIN} bin/ci/ubuntu/build-in-docker.sh - - ccache -s - - <<: *linux - compiler: clang-8 - name: clang-8, debug - env: - - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - - BUILD_TYPE=Debug - - <<: *linux - compiler: clang-8 - name: reporting, clang-8, debug - env: - - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dreporting=ON" - # coverage builds - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_cov/ - compiler: gcc-8 - name: coverage, gcc-8 - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dcoverage=ON" - - TARGET=coverage_report - - SKIP_TESTS=true - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_cov/ - compiler: clang-8 - name: coverage, clang-8 - env: - - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dcoverage=ON" - - TARGET=coverage_report - - SKIP_TESTS=true - # test-free builds - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ - compiler: gcc-8 - name: no-tests-unity, gcc-8 - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dtests=OFF" - - SKIP_TESTS=true - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ - compiler: clang-8 - name: no-tests-non-unity, clang-8 - env: - - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dtests=OFF -Dunity=OFF" - - SKIP_TESTS=true - # nounity - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_nounity/ - compiler: gcc-8 - name: non-unity, gcc-8 - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dunity=OFF" - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_nounity/ - compiler: clang-8 - name: non-unity, clang-8 - env: - - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dunity=OFF" - # manual tests - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_man/ - compiler: gcc-8 - name: manual tests, gcc-8, debug - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - MANUAL_TESTS=true - # manual tests - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_man/ - compiler: gcc-8 - name: manual tests, gcc-8, release - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Release - - CMAKE_ADD="-Dassert=ON -Dunity=OFF" - - MANUAL_TESTS=true - # release builds - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_release/ - compiler: gcc-8 - name: gcc-8, release - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Release - - CMAKE_ADD="-Dassert=ON -Dunity=OFF" - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_release/ - compiler: clang-8 - name: clang-8, release - env: - - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - - BUILD_TYPE=Release - - CMAKE_ADD="-Dassert=ON" - # asan - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_san/ - compiler: clang-8 - name: asan, clang-8 - env: - - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - - BUILD_TYPE=Release - - CMAKE_ADD="-Dsan=address" - - ASAN_OPTIONS="print_stats=true:atexit=true" - #- LSAN_OPTIONS="verbosity=1:log_threads=1" - - PARALLEL_TESTS=false - # ubsan - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_san/ - compiler: clang-8 - name: ubsan, clang-8 - env: - - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - - BUILD_TYPE=Release - - CMAKE_ADD="-Dsan=undefined" - # once we can run clean under ubsan, add halt_on_error=1 to options below - - UBSAN_OPTIONS="print_stacktrace=1:report_error_type=1" - - PARALLEL_TESTS=false - # tsan - # current tsan failure *might* be related to: - # https://github.com/google/sanitizers/issues/1104 - # but we can't get it to run, so leave it disabled for now - # - <<: *linux - # if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_linux/ OR commit_message =~ /travis_run_san/ - # compiler: clang-8 - # name: tsan, clang-8 - # env: - # - MATRIX_EVAL="CC=clang-8 && CXX=clang++-8" - # - BUILD_TYPE=Release - # - CMAKE_ADD="-Dsan=thread" - # - TSAN_OPTIONS="history_size=3 external_symbolizer_path=/usr/bin/llvm-symbolizer verbosity=1" - # - PARALLEL_TESTS=false - # dynamic lib builds - - <<: *linux - compiler: gcc-8 - name: non-static, gcc-8 - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dstatic=OFF" - - <<: *linux - compiler: gcc-8 - name: non-static + BUILD_SHARED_LIBS, gcc-8 - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dstatic=OFF -DBUILD_SHARED_LIBS=ON" - # makefile - - <<: *linux - compiler: gcc-8 - name: makefile generator, gcc-8 - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - NINJA_BUILD=false - # misc alternative compilers - - <<: *linux - compiler: gcc-9 - name: gcc-9 - env: - - MATRIX_EVAL="CC=gcc-9 && CXX=g++-9" - - BUILD_TYPE=Debug - - <<: *linux - compiler: clang-9 - name: clang-9, debug - env: - - MATRIX_EVAL="CC=clang-9 && CXX=clang++-9" - - BUILD_TYPE=Debug - - <<: *linux - compiler: clang-9 - name: clang-9, release - env: - - MATRIX_EVAL="CC=clang-9 && CXX=clang++-9" - - BUILD_TYPE=Release - # verify build with min version of cmake - - <<: *linux - compiler: gcc-8 - name: min cmake version - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - CMAKE_EXE=/opt/local/cmake/bin/cmake - - SKIP_TESTS=true - # validator keys project as subproj of rippled - - <<: *linux - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_vkeys/ - compiler: gcc-8 - name: validator-keys - env: - - MATRIX_EVAL="CC=gcc-8 && CXX=g++-8" - - BUILD_TYPE=Debug - - CMAKE_ADD="-Dvalidator_keys=ON" - - TARGET=validator-keys - # macos - - &macos - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_mac/ - stage: build - os: osx - osx_image: xcode13.1 - name: xcode13.1, debug - env: - # put NIH in non-cache location since it seems to - # cause failures when homebrew updates - - NIH_CACHE_ROOT=${TRAVIS_BUILD_DIR}/nih_c - - BLD_CONFIG=Debug - - TEST_EXTRA_ARGS="" - - BOOST_ROOT=${CACHE_DIR}/boost_1_75_0 - - >- - CMAKE_ADD=" - -DBOOST_ROOT=${BOOST_ROOT}/_INSTALLED_ - -DBoost_ARCHITECTURE=-x64 - -DBoost_NO_SYSTEM_PATHS=ON - -DCMAKE_VERBOSE_MAKEFILE=ON" - addons: - homebrew: - packages: - - protobuf - - grpc - - pkg-config - - bash - - ninja - - cmake - - wget - - zstd - - libarchive - - openssl@1.1 - update: true - install: - - export OPENSSL_ROOT=$(brew --prefix openssl@1.1) - - travis_wait ${MAX_TIME_MIN} Builds/containers/shared/install_boost.sh - - brew uninstall --ignore-dependencies boost - script: - - mkdir -p build.macos && cd build.macos - - cmake -G Ninja ${CMAKE_EXTRA_ARGS} -DCMAKE_BUILD_TYPE=${BLD_CONFIG} .. - - travis_wait ${MAX_TIME_MIN} cmake --build . --parallel --verbose - - ./rippled --unittest --quiet --unittest-log --unittest-jobs ${NUM_PROCESSORS} ${TEST_EXTRA_ARGS} - - <<: *macos - name: xcode13.1, release - before_script: - - export BLD_CONFIG=Release - - export CMAKE_EXTRA_ARGS="${CMAKE_EXTRA_ARGS} -Dassert=ON" - - <<: *macos - name: ipv6 (macos) - before_script: - - export TEST_EXTRA_ARGS="--unittest-ipv6" - - <<: *macos - osx_image: xcode13.1 - name: xcode13.1, debug - # windows - - &windows - if: commit_message !~ /travis_run_/ OR commit_message =~ /travis_run_win/ - os: windows - env: - # put NIH in a non-cached location until - # we come up with a way to stabilize that - # cache on windows (minimize incremental changes) - - CACHE_NAME=win_01 - - NIH_CACHE_ROOT=${TRAVIS_BUILD_DIR}/nih_c - - VCPKG_DEFAULT_TRIPLET="x64-windows-static" - - MATRIX_EVAL="CC=cl.exe && CXX=cl.exe" - - BOOST_ROOT=${CACHE_DIR}/boost_1_75 - - >- - CMAKE_ADD=" - -DCMAKE_PREFIX_PATH=${BOOST_ROOT}/_INSTALLED_ - -DBOOST_ROOT=${BOOST_ROOT}/_INSTALLED_ - -DBoost_ROOT=${BOOST_ROOT}/_INSTALLED_ - -DBoost_DIR=${BOOST_ROOT}/_INSTALLED_/lib/cmake/Boost-1.75.0 - -DBoost_COMPILER=vc141 - -DCMAKE_VERBOSE_MAKEFILE=ON - -DCMAKE_TOOLCHAIN_FILE=${VCPKG_DIR}/scripts/buildsystems/vcpkg.cmake - -DVCPKG_TARGET_TRIPLET=x64-windows-static" - stage: windep-vcpkg - name: prereq-vcpkg - install: - - choco upgrade cmake.install - - choco install ninja visualstudio2017-workload-vctools -y - script: - - df -h - - env - - travis_wait ${MAX_TIME_MIN} bin/sh/install-vcpkg.sh openssl - - travis_wait ${MAX_TIME_MIN} bin/sh/install-vcpkg.sh grpc - - travis_wait ${MAX_TIME_MIN} bin/sh/install-vcpkg.sh libarchive[lz4] - # TBD consider rocksdb via vcpkg if/when we can build with the - # vcpkg version - # - travis_wait ${MAX_TIME_MIN} bin/sh/install-vcpkg.sh rocksdb[snappy,lz4,zlib] - - <<: *windows - stage: windep-boost - name: prereq-keep-boost - install: - - choco upgrade cmake.install - - choco install ninja visualstudio2017-workload-vctools -y - - choco install visualstudio2019buildtools visualstudio2019community visualstudio2019-workload-vctools -y - script: - - export BOOST_TOOLSET=msvc-14.1 - - travis_wait ${MAX_TIME_MIN} Builds/containers/shared/install_boost.sh - - &windows-bld - <<: *windows - stage: build - name: windows, debug - before_script: - - export BLD_CONFIG=Debug - script: - - df -h - - . ./bin/sh/setup-msvc.sh - - mkdir -p build.ms && cd build.ms - - cmake -G Ninja ${CMAKE_EXTRA_ARGS} -DCMAKE_BUILD_TYPE=${BLD_CONFIG} .. - - travis_wait ${MAX_TIME_MIN} cmake --build . --parallel --verbose - # override num procs to force fewer unit test jobs - - export NUM_PROCESSORS=2 - - travis_wait ${MAX_TIME_MIN} ./rippled.exe --unittest --quiet --unittest-log --unittest-jobs ${NUM_PROCESSORS} - - <<: *windows-bld - name: windows, release - before_script: - - export BLD_CONFIG=Release - - <<: *windows-bld - name: windows, visual studio, debug - script: - - mkdir -p build.ms && cd build.ms - - export CMAKE_EXTRA_ARGS="${CMAKE_EXTRA_ARGS} -DCMAKE_GENERATOR_TOOLSET=host=x64" - - cmake -G "Visual Studio 15 2017 Win64" ${CMAKE_EXTRA_ARGS} .. - - export DESTDIR=${PWD}/_installed_ - - travis_wait ${MAX_TIME_MIN} cmake --build . --parallel --verbose --config ${BLD_CONFIG} --target install - # override num procs to force fewer unit test jobs - - export NUM_PROCESSORS=2 - - >- - travis_wait ${MAX_TIME_MIN} "./_installed_/Program Files/rippled/bin/rippled.exe" --unittest --quiet --unittest-log --unittest-jobs ${NUM_PROCESSORS} - - <<: *windows-bld - name: windows, vc2019 - install: - - choco upgrade cmake.install - - choco install ninja -y - - choco install visualstudio2019buildtools visualstudio2019community visualstudio2019-workload-vctools -y - before_script: - - export BLD_CONFIG=Release - # we want to use the boost build from cache, which was built using the - # vs2017 compiler so we need to specify the Boost_COMPILER. BUT, we - # can't use the cmake config files generated by boost b/c they are - # broken for Boost_COMPILER override, so we need to specify both - # Boost_NO_BOOST_CMAKE and a slightly different Boost_COMPILER string - # to make the legacy find module work for us. If the cmake configs are - # fixed in the future, it should be possible to remove these - # workarounds. - - export CMAKE_EXTRA_ARGS="${CMAKE_EXTRA_ARGS} -DBoost_NO_BOOST_CMAKE=ON -DBoost_COMPILER=-vc141" - -before_cache: - - if [ $(uname) = "Linux" ] ; then SUDO="sudo"; else SUDO=""; fi - - cd ${TRAVIS_HOME} - - if [ -f cache_ignore.tar ] ; then $SUDO tar xvf cache_ignore.tar; fi - - cd ${TRAVIS_BUILD_DIR} - -cache: - timeout: 900 - directories: - - $CACHE_DIR - -notifications: - email: false diff --git a/Builds/Test.py b/Builds/Test.py deleted file mode 100755 index 29cf8ea8a..000000000 --- a/Builds/Test.py +++ /dev/null @@ -1,405 +0,0 @@ -#!/usr/bin/env python - -# This file is part of rippled: https://github.com/ripple/rippled -# Copyright (c) 2012 - 2017 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. - -""" -Invocation: - - ./Builds/Test.py - builds and tests all configurations - -The build must succeed without shell aliases for this to work. - -To pass flags to cmake, put them at the very end of the command line, after -the -- flag - like this: - - ./Builds/Test.py -- -j4 # Pass -j4 to cmake --build - - -Common problems: - -1) Boost not found. Solution: export BOOST_ROOT=[path to boost folder] - -2) OpenSSL not found. Solution: export OPENSSL_ROOT=[path to OpenSSL folder] - -3) cmake is not found. Solution: Be sure cmake directory is on your $PATH - -""" -from __future__ import absolute_import, division, print_function, unicode_literals - -import argparse -import itertools -import os -import platform -import re -import shutil -import sys -import subprocess - - -def powerset(iterable): - """powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)""" - s = list(iterable) - return itertools.chain.from_iterable(itertools.combinations(s, r) for r in range(len(s) + 1)) - -IS_WINDOWS = platform.system().lower() == 'windows' -IS_OS_X = platform.system().lower() == 'darwin' - -# CMake -if IS_WINDOWS: - CMAKE_UNITY_CONFIGS = ['Debug', 'Release'] - CMAKE_NONUNITY_CONFIGS = ['Debug', 'Release'] -else: - CMAKE_UNITY_CONFIGS = [] - CMAKE_NONUNITY_CONFIGS = [] -CMAKE_UNITY_COMBOS = { '' : [['rippled'], CMAKE_UNITY_CONFIGS], - '.nounity' : [['rippled'], CMAKE_NONUNITY_CONFIGS] } - -if IS_WINDOWS: - CMAKE_DIR_TARGETS = { ('msvc' + unity,) : targets for unity, targets in - CMAKE_UNITY_COMBOS.items() } -elif IS_OS_X: - CMAKE_DIR_TARGETS = { (build + unity,) : targets - for build in ['debug', 'release'] - for unity, targets in CMAKE_UNITY_COMBOS.items() } -else: - CMAKE_DIR_TARGETS = { (cc + "." + build + unity,) : targets - for cc in ['gcc', 'clang'] - for build in ['debug', 'release', 'coverage', 'profile'] - for unity, targets in CMAKE_UNITY_COMBOS.items() } - -# list of tuples of all possible options -if IS_WINDOWS or IS_OS_X: - CMAKE_ALL_GENERATE_OPTIONS = [tuple(x) for x in powerset(['-GNinja', '-Dassert=true'])] -else: - CMAKE_ALL_GENERATE_OPTIONS = list(set( - [tuple(x) for x in powerset(['-GNinja', '-Dstatic=true', '-Dassert=true', '-Dsan=address'])] + - [tuple(x) for x in powerset(['-GNinja', '-Dstatic=true', '-Dassert=true', '-Dsan=thread'])])) - -parser = argparse.ArgumentParser( - description='Test.py - run ripple tests' -) - -parser.add_argument( - '--all', '-a', - action='store_true', - help='Build all configurations.', -) - -parser.add_argument( - '--keep_going', '-k', - action='store_true', - help='Keep going after one configuration has failed.', -) - -parser.add_argument( - '--silent', '-s', - action='store_true', - help='Silence all messages except errors', -) - -parser.add_argument( - '--verbose', '-v', - action='store_true', - help=('Report more information about which commands are executed and the ' - 'results.'), -) - -parser.add_argument( - '--test', '-t', - default='', - help='Add a prefix for unit tests', -) - -parser.add_argument( - '--testjobs', - default='0', - type=int, - help='Run tests in parallel' -) - -parser.add_argument( - '--ipv6', - action='store_true', - help='Use IPv6 localhost when running unit tests.', -) - -parser.add_argument( - '--clean', '-c', - action='store_true', - help='delete all build artifacts after testing', -) - -parser.add_argument( - '--quiet', '-q', - action='store_true', - help='Reduce output where possible (unit tests)', -) - -parser.add_argument( - '--dir', '-d', - default=(), - nargs='*', - help='Specify one or more CMake dir names. ' - 'Will also be used as -Dtarget= running cmake.' -) - -parser.add_argument( - '--target', - default=(), - nargs='*', - help='Specify one or more CMake build targets. ' - 'Will be used as --target running cmake --build.' - ) - -parser.add_argument( - '--config', - default=(), - nargs='*', - help='Specify one or more CMake build configs. ' - 'Will be used as --config running cmake --build.' - ) - -parser.add_argument( - '--generator_option', - action='append', - help='Specify a CMake generator option. Repeat for multiple options. ' - 'Will be passed to the cmake generator. ' - 'Due to limits of the argument parser, arguments starting with \'-\' ' - 'must be attached to this option. e.g. --generator_option=-GNinja.') - -parser.add_argument( - '--build_option', - action='append', - help='Specify a build option. Repeat for multiple options. ' - 'Will be passed to the build tool via cmake --build. ' - 'Due to limits of the argument parser, arguments starting with \'-\' ' - 'must be attached to this option. e.g. --build_option=-j8.') - -parser.add_argument( - 'extra_args', - default=(), - nargs='*', - help='Extra arguments are passed through to the tools' -) - -ARGS = parser.parse_args() - -def decodeString(line): - # Python 2 vs. Python 3 - if isinstance(line, str): - return line - else: - return line.decode() - -def shell(cmd, args=(), silent=False, cust_env=None): - """"Execute a shell command and return the output.""" - silent = ARGS.silent or silent - verbose = not silent and ARGS.verbose - if verbose: - print('$' + cmd, *args) - - command = (cmd,) + args - - # shell is needed in Windows to find executable in the path - process = subprocess.Popen( - command, - stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - env=cust_env, - shell=IS_WINDOWS) - lines = [] - count = 0 - # readline returns '' at EOF - for line in iter(process.stdout.readline, ''): - if process.poll() is None: - decoded = decodeString(line) - lines.append(decoded) - if verbose: - print(decoded, end='') - elif not silent: - count += 1 - if count >= 80: - print() - count = 0 - else: - print('.', end='') - else: - break - - if not verbose and count: - print() - process.wait() - return process.returncode, lines - -def get_cmake_dir(cmake_dir): - return os.path.join('build' , 'cmake' , cmake_dir) - -def run_cmake(directory, cmake_dir, args): - print('Generating build in', directory, 'with', *args or ('default options',)) - old_dir = os.getcwd() - if not os.path.exists(directory): - os.makedirs(directory) - os.chdir(directory) - if IS_WINDOWS and not any(arg.startswith("-G") for arg in args) and not os.path.exists("CMakeCache.txt"): - if '--ninja' in args: - args += ( '-GNinja', ) - else: - args += ( '-GVisual Studio 14 2015 Win64', ) - # hack to extract cmake options/args from the legacy target format - if re.search('\.unity', cmake_dir): - args += ( '-Dunity=ON', ) - if re.search('\.nounity', cmake_dir): - args += ( '-Dunity=OFF', ) - if re.search('coverage', cmake_dir): - args += ( '-Dcoverage=ON', ) - if re.search('profile', cmake_dir): - args += ( '-Dprofile=ON', ) - if re.search('debug', cmake_dir): - args += ( '-DCMAKE_BUILD_TYPE=Debug', ) - if re.search('release', cmake_dir): - args += ( '-DCMAKE_BUILD_TYPE=Release', ) - m = re.search('gcc(-[^.]*)', cmake_dir) - if m: - args += ( '-DCMAKE_C_COMPILER=' + m.group(0), - '-DCMAKE_CXX_COMPILER=g++' + m.group(1), ) - elif re.search('gcc', cmake_dir): - args += ( '-DCMAKE_C_COMPILER=gcc', '-DCMAKE_CXX_COMPILER=g++', ) - m = re.search('clang(-[^.]*)', cmake_dir) - if m: - args += ( '-DCMAKE_C_COMPILER=' + m.group(0), - '-DCMAKE_CXX_COMPILER=clang++' + m.group(1), ) - elif re.search('clang', cmake_dir): - args += ( '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', ) - - args += ( os.path.join('..', '..', '..'), ) - resultcode, lines = shell('cmake', args) - - if resultcode: - print('Generating FAILED:') - if not ARGS.verbose: - print(*lines, sep='') - sys.exit(1) - - os.chdir(old_dir) - -def run_cmake_build(directory, target, config, args): - print('Building', target, config, 'in', directory, 'with', *args or ('default options',)) - build_args=('--build', directory) - if target: - build_args += ('--target', target) - if config: - build_args += ('--config', config) - if args: - build_args += ('--',) - build_args += tuple(args) - resultcode, lines = shell('cmake', build_args) - - if resultcode: - print('Build FAILED:') - if not ARGS.verbose: - print(*lines, sep='') - sys.exit(1) - -def run_cmake_tests(directory, target, config): - failed = [] - if IS_WINDOWS: - target += '.exe' - executable = os.path.join(directory, config if config else 'Debug', target) - if(not os.path.exists(executable)): - executable = os.path.join(directory, target) - print('Unit tests for', executable) - testflag = '--unittest' - quiet = '' - testjobs = '' - ipv6 = '' - if ARGS.test: - testflag += ('=' + ARGS.test) - if ARGS.quiet: - quiet = '-q' - if ARGS.ipv6: - ipv6 = '--unittest-ipv6' - if ARGS.testjobs: - testjobs = ('--unittest-jobs=' + str(ARGS.testjobs)) - resultcode, lines = shell(executable, (testflag, quiet, testjobs, ipv6)) - - if resultcode: - if not ARGS.verbose: - print('ERROR:', *lines, sep='') - failed.append([target, 'unittest']) - - return failed - -def main(): - all_failed = [] - if ARGS.all: - build_dir_targets = CMAKE_DIR_TARGETS - generator_options = CMAKE_ALL_GENERATE_OPTIONS - else: - build_dir_targets = { tuple(ARGS.dir) : [ARGS.target, ARGS.config] } - if ARGS.generator_option: - generator_options = [tuple(ARGS.generator_option)] - else: - generator_options = [tuple()] - - if not build_dir_targets: - # Let CMake choose the build tool. - build_dir_targets = { () : [] } - - if ARGS.build_option: - ARGS.build_option = ARGS.build_option + list(ARGS.extra_args) - else: - ARGS.build_option = list(ARGS.extra_args) - - for args in generator_options: - for build_dirs, (build_targets, build_configs) in build_dir_targets.items(): - if not build_dirs: - build_dirs = ('default',) - if not build_targets: - build_targets = ('rippled',) - if not build_configs: - build_configs = ('',) - for cmake_dir in build_dirs: - cmake_full_dir = get_cmake_dir(cmake_dir) - run_cmake(cmake_full_dir, cmake_dir, args) - - for target in build_targets: - for config in build_configs: - run_cmake_build(cmake_full_dir, target, config, ARGS.build_option) - failed = run_cmake_tests(cmake_full_dir, target, config) - - if failed: - print('FAILED:', *(':'.join(f) for f in failed)) - if not ARGS.keep_going: - sys.exit(1) - else: - all_failed.extend([decodeString(cmake_dir + - "." + target + "." + config), ':'.join(f)] - for f in failed) - else: - print('Success') - if ARGS.clean: - shutil.rmtree(cmake_full_dir) - - if all_failed: - if len(all_failed) > 1: - print() - print('FAILED:', *(':'.join(f) for f in all_failed)) - sys.exit(1) - -if __name__ == '__main__': - main() - sys.exit(0) diff --git a/Builds/VisualStudio2017/README.md b/Builds/VisualStudio2017/README.md deleted file mode 100644 index fce8e824a..000000000 --- a/Builds/VisualStudio2017/README.md +++ /dev/null @@ -1 +0,0 @@ -[Build instructions are currently located in `BUILD.md`](../../BUILD.md) diff --git a/Builds/VisualStudio2019/CMakeSettings-example.json b/Builds/VisualStudio2019/CMakeSettings-example.json deleted file mode 100644 index b90bfce6b..000000000 --- a/Builds/VisualStudio2019/CMakeSettings-example.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file. - "configurations": [ - { - "name": "x64-Debug", - "generator": "Visual Studio 16 2019", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${thisFileDir}\\build\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "-v:minimal", - "ctestCommandArgs": "", - "variables": [ - { - "name": "BOOST_ROOT", - "value": "C:\\lib\\boost" - }, - { - "name": "OPENSSL_ROOT", - "value": "C:\\lib\\OpenSSL-Win64" - } - ] - }, - { - "name": "x64-Release", - "generator": "Visual Studio 16 2019", - "configurationType": "Release", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${thisFileDir}\\build\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "-v:minimal", - "ctestCommandArgs": "", - "variables": [ - { - "name": "BOOST_ROOT", - "value": "C:\\lib\\boost" - }, - { - "name": "OPENSSL_ROOT", - "value": "C:\\lib\\OpenSSL-Win64" - } - ] - } - ] -} diff --git a/Builds/VisualStudio2019/README.md b/Builds/VisualStudio2019/README.md deleted file mode 100644 index e369eac67..000000000 --- a/Builds/VisualStudio2019/README.md +++ /dev/null @@ -1,263 +0,0 @@ -# Visual Studio 2019 Build Instructions - -## Important - -We do not recommend Windows for rippled production use at this time. Currently, -the Ubuntu platform has received the highest level of quality assurance, -testing, and support. Additionally, 32-bit Windows versions are not supported. - -## Prerequisites - -To clone the source code repository, create branches for inspection or -modification, build rippled under Visual Studio, and run the unit tests you will -need these software components - -| Component | Minimum Recommended Version | -|-----------|-----------------------| -| [Visual Studio 2019](README.md#install-visual-studio-2019)| 15.5.4 | -| [Git for Windows](README.md#install-git-for-windows)| 2.16.1 | -| [OpenSSL Library](README.md#install-openssl) | 1.1.1L | -| [Boost library](README.md#build-boost) | 1.70.0 | -| [CMake for Windows](README.md#optional-install-cmake-for-windows)* | 3.12 | - -\* Only needed if not using the integrated CMake in VS 2019 and prefer generating dedicated project/solution files. - -## Install Software - -### Install Visual Studio 2019 - -If not already installed on your system, download your choice of installer from -the [Visual Studio 2019 -Download](https://www.visualstudio.com/downloads/download-visual-studio-vs) -page, run the installer, and follow the directions. **You may need to choose the -`Desktop development with C++` workload to install all necessary C++ features.** - -Any version of Visual Studio 2019 may be used to build rippled. The **Visual -Studio 2019 Community** edition is available free of charge (see [the product -page](https://www.visualstudio.com/products/visual-studio-community-vs) for -licensing details), while paid editions may be used for an initial free-trial -period. - -### Install Git for Windows - -Git is a distributed revision control system. The Windows version also provides -the bash shell and many Windows versions of Unix commands. While there are other -varieties of Git (such as TortoiseGit, which has a native Windows interface and -integrates with the Explorer shell), we recommend installing [Git for -Windows](https://git-scm.com/) since it provides a Unix-like command line -environment useful for running shell scripts. Use of the bash shell under -Windows is mandatory for running the unit tests. - -### Install OpenSSL - -[Download the latest version of -OpenSSL.](http://slproweb.com/products/Win32OpenSSL.html) There will -several `Win64` bit variants available, you want the non-light -`v1.1` line. As of this writing, you **should** select - -* Win64 OpenSSL v1.1.1q - -and should **not** select - -* Anything with "Win32" in the name -* Anything with "light" in the name -* Anything with "EXPERIMENTAL" in the name -* Anything in the 3.0 line - rippled won't currently build with this version. - -Run the installer, and choose an appropriate location for your OpenSSL -installation. In this guide we use `C:\lib\OpenSSL-Win64` as the destination -location. - -You may be informed on running the installer that "Visual C++ 2008 -Redistributables" must first be installed first. If so, download it from the -[same page](http://slproweb.com/products/Win32OpenSSL.html), again making sure -to get the correct 32-/64-bit variant. - -* NOTE: Since rippled links statically to OpenSSL, it does not matter where the - OpenSSL .DLL files are placed, or what version they are. rippled does not use - or require any external .DLL files to run other than the standard operating - system ones. - -### Build Boost - -Boost 1.70 or later is required. - -[Download boost](http://www.boost.org/users/download/) and unpack it -to `c:\lib`. As of this writing, the most recent version of boost is 1.80.0, -which will unpack into a directory named `boost_1_80_0`. We recommended either -renaming this directory to `boost`, or creating a junction link `mklink /J boost -boost_1_80_0`, so that you can more easily switch between versions. - -Next, open **Developer Command Prompt** and type the following commands - -```powershell -cd C:\lib\boost -bootstrap -``` - -The rippled application is linked statically to the standard runtimes and -external dependencies on Windows, to ensure that the behavior of the executable -is not affected by changes in outside files. Therefore, it is necessary to build -the required boost static libraries using this command: - -```powershell -b2 -j --toolset=msvc-14.2 address-model=64 architecture=x86 link=static threading=multi runtime-link=shared,static stage -``` - -where you should replace `` with the number of parallel -invocations to use build, e.g. `bjam -j8 ...` would use up to 8 concurrent build -shell commands for the build. - -Building the boost libraries may take considerable time. When the build process -is completed, take note of both the reported compiler include paths and linker -library paths as they will be required later. - -### (Optional) Install CMake for Windows - -[CMake](http://cmake.org) is a cross platform build system generator. Visual -Studio 2019 includes an integrated version of CMake that avoids having to -manually run CMake, but it is undergoing continuous improvement. Users that -prefer to use standard Visual Studio project and solution files need to install -a dedicated version of CMake to generate them. The latest version can be found -at the [CMake download site](https://cmake.org/download/). It is recommended you -select the install option to add CMake to your path. - -## Clone the rippled repository - -If you are familiar with cloning github repositories, just follow your normal -process and clone `git@github.com:ripple/rippled.git`. Otherwise follow this -section for instructions. - -1. If you don't have a github account, sign up for one at - [github.com](https://github.com/). -2. Make sure you have Github ssh keys. For help see - [generating-ssh-keys](https://help.github.com/articles/generating-ssh-keys). - -Open the "Git Bash" shell that was installed with "Git for Windows" in the step -above. Navigate to the directory where you want to clone rippled (git bash uses -`/c` for windows's `C:` and forward slash where windows uses backslash, so -`C:\Users\joe\projs` would be `/c/Users/joe/projs` in git bash). Now clone the -repository and optionally switch to the *master* branch. Type the following at -the bash prompt: - -```powershell -git clone git@github.com:XRPLF/rippled.git -cd rippled -``` -If you receive an error about not having the "correct access rights" make sure -you have Github ssh keys, as described above. - -For a stable release, choose the `master` branch or one of the tagged releases -listed on [rippled's GitHub page](https://github.com/ripple/rippled/releases). - -``` -git checkout master -``` - -To test the latest release candidate, choose the `release` branch. - -``` -git checkout release -``` - -If you are doing development work and want the latest set of beta features, -you can consider using the `develop` branch instead. - -``` -git checkout develop -``` - -# Build using Visual Studio integrated CMake - -In Visual Studio 2017, Microsoft added [integrated IDE support for -cmake](https://blogs.msdn.microsoft.com/vcblog/2016/10/05/cmake-support-in-visual-studio/). -To begin, simply: - -1. Launch Visual Studio and choose **File | Open | Folder**, navigating to the - cloned rippled folder. -2. Right-click on `CMakeLists.txt` in the **Solution Explorer - Folder View** to - generate a `CMakeSettings.json` file. A sample settings file is provided - [here](/Builds/VisualStudio2019/CMakeSettings-example.json). Customize the - settings for `BOOST_ROOT`, `OPENSSL_ROOT` to match the install paths if they - differ from those in the file. -4. Select either the `x64-Release` or `x64-Debug` configuration from the - **Project Settings** drop-down. This should invoke the built-in CMake project - generator. If not, you can right-click on the `CMakeLists.txt` file and - choose **Configure rippled**. -5. Select the `rippled.exe` - option in the **Select Startup Item** drop-down. This will be the target - built when you press F7. Alternatively, you can choose a target to build from - the top-level **CMake | Build** menu. Note that at this time, there are other - targets listed that come from third party visual studio files embedded in the - rippled repo, e.g. `datagen.vcxproj`. Please ignore them. - -For details on configuring debugging sessions or further customization of CMake, -please refer to the [CMake tools for VS -documentation](https://docs.microsoft.com/en-us/cpp/ide/cmake-tools-for-visual-cpp). - -If using the provided `CMakeSettings.json` file, the executable will be in -``` -.\build\x64-Release\Release\rippled.exe -``` -or -``` -.\build\x64-Debug\Debug\rippled.exe -``` -These paths are relative to your cloned git repository. - -# Build using stand-alone CMake - -This requires having installed [CMake for -Windows](README.md#optional-install-cmake-for-windows). We do not recommend -mixing this method with the integrated CMake method for the same repository -clone. Assuming you included the cmake executable folder in your path, -execute the following commands within your `rippled` cloned repository: - -``` -mkdir build\cmake -cd build\cmake -cmake ..\.. -G"Visual Studio 16 2019" -Ax64 -DBOOST_ROOT="C:\lib\boost" -DOPENSSL_ROOT="C:\lib\OpenSSL-Win64" -DCMAKE_GENERATOR_TOOLSET=host=x64 -``` -Now launch Visual Studio 2019 and select **File | Open | Project/Solution**. -Navigate to the `build\cmake` folder created above and select the `rippled.sln` -file. You can then choose whether to build the `Debug` or `Release` solution -configuration. - -The executable will be in -``` -.\build\cmake\Release\rippled.exe -``` -or -``` -.\build\cmake\Debug\rippled.exe -``` -These paths are relative to your cloned git repository. - -# Unity/No-Unity Builds - -The rippled build system defaults to using -[unity source files](http://onqtam.com/programming/2018-07-07-unity-builds/) -to improve build times. In some cases it might be desirable to disable the -unity build and compile individual translation units. Here is how you can -switch to a "no-unity" build configuration: - -## Visual Studio Integrated CMake - -Edit your `CmakeSettings.json` (described above) by adding `-Dunity=OFF` -to the `cmakeCommandArgs` entry for each build configuration. - -## Standalone CMake Builds - -When running cmake to generate the Visual Studio project files, add -`-Dunity=OFF` to the command line options passed to cmake. - -**Note:** you will need to re-run the cmake configuration step anytime you -want to switch between unity/no-unity builds. - -# Unit Test (Recommended) - -`rippled` builds a set of unit tests into the server executable. To run these -unit tests after building, pass the `--unittest` option to the compiled -`rippled` executable. The executable will exit with summary info after running -the unit tests. - diff --git a/Builds/build_all.sh b/Builds/build_all.sh deleted file mode 100755 index 3a08e3b5a..000000000 --- a/Builds/build_all.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -num_procs=$(lscpu -p | grep -v '^#' | sort -u -t, -k 2,4 | wc -l) # number of physical cores - -path=$(cd $(dirname $0) && pwd) -cd $(dirname $path) -${path}/Test.py -a -c --testjobs=${num_procs} -- -j${num_procs} diff --git a/Builds/containers/README.md b/Builds/containers/README.md deleted file mode 100644 index 9d96eb771..000000000 --- a/Builds/containers/README.md +++ /dev/null @@ -1,31 +0,0 @@ - -# rippled Packaging and Containers - -This folder contains docker container definitions and configuration -files to support building rpm and deb packages of rippled. The container -definitions include some additional software/packages that are used -for general build/test CI workflows of rippled but are not explicitly -needed for the package building workflow. - -## CMake Targets - -If you have docker installed on your local system, then the main -CMake file will enable several targets related to building packages: -`rpm_container`, `rpm`, `dpkg_container`, and `dpkg`. The package targets -depend on the container targets and will trigger a build of those first. -The container builds can take several dozen minutes to complete (depending -on hardware specs), so quick build cycles are not possible currently. As -such, these targets are often best suited to CI/automated build systems. - -The package build can be invoked like any other cmake target from the -rippled root folder: -``` -mkdir -p build/pkg && cd build/pkg -cmake -Dpackages_only=ON ../.. -cmake --build . --target rpm -``` -Upon successful completion, the generated package files will be in -the `build/pkg/packages` directory. For deb packages, simply replace -`rpm` with `dpkg` in the build command above. - - diff --git a/Builds/containers/centos-builder/Dockerfile b/Builds/containers/centos-builder/Dockerfile deleted file mode 100644 index ef5f80f7b..000000000 --- a/Builds/containers/centos-builder/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM rippleci/centos:7 -ARG GIT_COMMIT=unknown -ARG CI_USE=false - -LABEL git-commit=$GIT_COMMIT - -COPY centos-builder/centos_setup.sh /tmp/ -COPY shared/install_cmake.sh /tmp/ -RUN chmod +x /tmp/centos_setup.sh && \ - chmod +x /tmp/install_cmake.sh -RUN /tmp/centos_setup.sh - -RUN /tmp/install_cmake.sh 3.16.3 /opt/local/cmake-3.16 -RUN ln -s /opt/local/cmake-3.16 /opt/local/cmake -ENV PATH="/opt/local/cmake/bin:$PATH" -# TODO: Install latest CMake for testing -RUN if [ "${CI_USE}" = true ] ; then /tmp/install_cmake.sh 3.16.3 /opt/local/cmake-3.16; fi - -RUN mkdir -m 777 -p /opt/rippled_bld/pkg - -WORKDIR /opt/rippled_bld/pkg -RUN mkdir -m 777 ./rpmbuild -RUN mkdir -m 777 ./rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} - -COPY packaging/rpm/build_rpm.sh ./ -CMD ./build_rpm.sh diff --git a/Builds/containers/centos-builder/centos_setup.sh b/Builds/containers/centos-builder/centos_setup.sh deleted file mode 100755 index ea110058b..000000000 --- a/Builds/containers/centos-builder/centos_setup.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env bash -set -ex - -source /etc/os-release - -yum -y upgrade -yum -y update -yum -y install epel-release centos-release-scl -yum -y install \ - wget curl time gcc-c++ yum-utils autoconf automake pkgconfig libtool \ - libstdc++-static rpm-build gnupg which make cmake \ - devtoolset-11 devtoolset-11-gdb devtoolset-11-binutils devtoolset-11-libstdc++-devel \ - devtoolset-11-libasan-devel devtoolset-11-libtsan-devel devtoolset-11-libubsan-devel devtoolset-11-liblsan-devel \ - flex flex-devel bison bison-devel parallel \ - ncurses ncurses-devel ncurses-libs graphviz graphviz-devel \ - lzip p7zip bzip2 bzip2-devel lzma-sdk lzma-sdk-devel xz-devel \ - zlib zlib-devel zlib-static texinfo openssl openssl-static \ - jemalloc jemalloc-devel \ - libicu-devel htop \ - rh-python38 \ - ninja-build git svn \ - swig perl-Digest-MD5 diff --git a/Builds/containers/gitlab-ci/build_container.sh b/Builds/containers/gitlab-ci/build_container.sh deleted file mode 100644 index ea47b4a11..000000000 --- a/Builds/containers/gitlab-ci/build_container.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env sh -set -ex -pkgtype=$1 -if [ "${pkgtype}" = "rpm" ] ; then - container_name="${RPM_CONTAINER_NAME}" -elif [ "${pkgtype}" = "dpkg" ] ; then - container_name="${DPKG_CONTAINER_NAME}" -else - echo "invalid package type" - exit 1 -fi - -if docker pull "${ARTIFACTORY_HUB}/${container_name}:latest_${CI_COMMIT_REF_SLUG}"; then - echo "found container for latest - using as cache." - docker tag \ - "${ARTIFACTORY_HUB}/${container_name}:latest_${CI_COMMIT_REF_SLUG}" \ - "${container_name}:latest_${CI_COMMIT_REF_SLUG}" - CMAKE_EXTRA="-D${pkgtype}_cache_from=${container_name}:latest_${CI_COMMIT_REF_SLUG}" -fi - -cmake --version -test -d build && rm -rf build -mkdir -p build/container && cd build/container -eval time \ - cmake -Dpackages_only=ON -DCMAKE_VERBOSE_MAKEFILE=ON ${CMAKE_EXTRA} \ - -G Ninja ../.. -time cmake --build . --target "${pkgtype}_container" -- -v - diff --git a/Builds/containers/gitlab-ci/build_package.sh b/Builds/containers/gitlab-ci/build_package.sh deleted file mode 100644 index 4c591677f..000000000 --- a/Builds/containers/gitlab-ci/build_package.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env sh -set -ex -pkgtype=$1 -if [ "${pkgtype}" = "rpm" ] ; then - container_name="${RPM_CONTAINER_FULLNAME}" - container_tag="${RPM_CONTAINER_TAG}" -elif [ "${pkgtype}" = "dpkg" ] ; then - container_name="${DPKG_CONTAINER_FULLNAME}" - container_tag="${DPKG_CONTAINER_TAG}" -else - echo "invalid package type" - exit 1 -fi -time docker pull "${ARTIFACTORY_HUB}/${container_name}" -docker tag \ - "${ARTIFACTORY_HUB}/${container_name}" \ - "${container_name}" -docker images -test -d build && rm -rf build -mkdir -p build/${pkgtype} && cd build/${pkgtype} -time cmake \ - -Dpackages_only=ON \ - -Dcontainer_label="${container_tag}" \ - -Dhave_package_container=ON \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - -Dunity=OFF \ - -G Ninja ../.. -time cmake --build . --target ${pkgtype} -- -v diff --git a/Builds/containers/gitlab-ci/docker_alpine_setup.sh b/Builds/containers/gitlab-ci/docker_alpine_setup.sh deleted file mode 100644 index a36543192..000000000 --- a/Builds/containers/gitlab-ci/docker_alpine_setup.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env sh -set -e -# used as a before/setup script for docker steps in gitlab-ci -# expects to be run in standard alpine/dind image -echo $(nproc) -docker login -u rippled \ - -p ${ARTIFACTORY_DEPLOY_KEY_RIPPLED} ${ARTIFACTORY_HUB} -apk add --update py-pip -apk add \ - bash util-linux coreutils binutils grep \ - make ninja cmake build-base gcc g++ abuild git \ - python3 python3-dev -pip3 install awscli -# list curdir contents to build log: -ls -la diff --git a/Builds/containers/gitlab-ci/get_component.sh b/Builds/containers/gitlab-ci/get_component.sh deleted file mode 100644 index 99963f408..000000000 --- a/Builds/containers/gitlab-ci/get_component.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env sh -case ${CI_COMMIT_REF_NAME} in - develop) - export COMPONENT="nightly" - ;; - release) - export COMPONENT="unstable" - ;; - master) - export COMPONENT="stable" - ;; - *) - export COMPONENT="_unknown_" - ;; -esac - diff --git a/Builds/containers/gitlab-ci/pkgbuild.yml b/Builds/containers/gitlab-ci/pkgbuild.yml deleted file mode 100644 index f35186acb..000000000 --- a/Builds/containers/gitlab-ci/pkgbuild.yml +++ /dev/null @@ -1,646 +0,0 @@ -######################################################################### -## ## -## gitlab CI defintition for rippled build containers and distro ## -## packages (rpm and dpkg). ## -## ## -######################################################################### - -# NOTE: these are sensible defaults for Ripple pipelines. These -# can be overridden by project or group variables as needed. -variables: - # these containers are built manually using the rippled - # cmake build (container targets) and tagged/pushed so they - # can be used here - RPM_CONTAINER_TAG: "2023-02-13" - RPM_CONTAINER_NAME: "rippled-rpm-builder" - RPM_CONTAINER_FULLNAME: "${RPM_CONTAINER_NAME}:${RPM_CONTAINER_TAG}" - DPKG_CONTAINER_TAG: "2023-03-20" - DPKG_CONTAINER_NAME: "rippled-dpkg-builder" - DPKG_CONTAINER_FULLNAME: "${DPKG_CONTAINER_NAME}:${DPKG_CONTAINER_TAG}" - ARTIFACTORY_HOST: "artifactory.ops.ripple.com" - ARTIFACTORY_HUB: "${ARTIFACTORY_HOST}:6555" - GIT_SIGN_PUBKEYS_URL: "https://gitlab.ops.ripple.com/xrpledger/rippled-packages/snippets/49/raw" - PUBLIC_REPO_ROOT: "https://repos.ripple.com/repos" - # also need to define this variable ONLY for the primary - # build/publish pipeline on the mainline repo: - # IS_PRIMARY_REPO = "true" - -stages: - - build_packages - - sign_packages - - smoketest - - verify_sig - - tag_images - - push_to_test - - verify_from_test - - wait_approval_prod - - push_to_prod - - verify_from_prod - - get_final_hashes - - build_containers - -.dind_template: &dind_param - before_script: - - . ./Builds/containers/gitlab-ci/docker_alpine_setup.sh - variables: - docker_driver: overlay2 - DOCKER_TLS_CERTDIR: "" - image: - name: artifactory.ops.ripple.com/docker:latest - services: - # workaround for TLS issues - consider going back - # back to unversioned `dind` when issues are resolved - - name: artifactory.ops.ripple.com/docker:stable-dind - alias: docker - tags: - - 4xlarge - -.only_primary_template: &only_primary - only: - refs: - - /^(master|release|develop)$/ - variables: - - $IS_PRIMARY_REPO == "true" - -.smoketest_local_template: &run_local_smoketest - tags: - - xlarge - script: - - . ./Builds/containers/gitlab-ci/smoketest.sh local - -.smoketest_repo_template: &run_repo_smoketest - tags: - - xlarge - script: - - . ./Builds/containers/gitlab-ci/smoketest.sh repo - -######################################################################### -## ## -## stage: build_packages ## -## ## -## build packages using containers from previous stage. ## -## ## -######################################################################### - -rpm_build: - timeout: "1h 30m" - stage: build_packages - <<: *dind_param - artifacts: - paths: - - build/rpm/packages/ - script: - - . ./Builds/containers/gitlab-ci/build_package.sh rpm - -dpkg_build: - timeout: "1h 30m" - stage: build_packages - <<: *dind_param - artifacts: - paths: - - build/dpkg/packages/ - script: - - . ./Builds/containers/gitlab-ci/build_package.sh dpkg - -######################################################################### -## ## -## stage: sign_packages ## -## ## -## build packages using containers from previous stage. ## -## ## -######################################################################### - -rpm_sign: - stage: sign_packages - dependencies: - - rpm_build - image: - name: artifactory.ops.ripple.com/centos:7 - <<: *only_primary - before_script: - - | - # Make sure GnuPG is installed - yum -y install gnupg rpm-sign - # checking GPG signing support - if [ -n "$GPG_KEY_B64" ]; then - echo "$GPG_KEY_B64"| base64 -d | gpg --batch --no-tty --allow-secret-key-import --import - - unset GPG_KEY_B64 - export GPG_PASSPHRASE=$(echo $GPG_KEY_PASS_B64 | base64 -di) - unset GPG_KEY_PASS_B64 - export GPG_KEYID=$(gpg --with-colon --list-secret-keys | head -n1 | cut -d : -f 5) - else - echo -e "\033[0;31m****** GPG signing disabled ******\033[0m" - exit 1 - fi - artifacts: - paths: - - build/rpm/packages/ - script: - - ls -alh build/rpm/packages - - . ./Builds/containers/gitlab-ci/sign_package.sh rpm - -dpkg_sign: - stage: sign_packages - dependencies: - - dpkg_build - image: - name: artifactory.ops.ripple.com/ubuntu:18.04 - <<: *only_primary - before_script: - - | - # make sure we have GnuPG - apt update - apt install -y gpg dpkg-sig - # checking GPG signing support - if [ -n "$GPG_KEY_B64" ]; then - echo "$GPG_KEY_B64"| base64 -d | gpg --batch --no-tty --allow-secret-key-import --import - - unset GPG_KEY_B64 - export GPG_PASSPHRASE=$(echo $GPG_KEY_PASS_B64 | base64 -di) - unset GPG_KEY_PASS_B64 - export GPG_KEYID=$(gpg --with-colon --list-secret-keys | head -n1 | cut -d : -f 5) - else - echo -e "\033[0;31m****** GPG signing disabled ******\033[0m" - exit 1 - fi - artifacts: - paths: - - build/dpkg/packages/ - script: - - ls -alh build/dpkg/packages - - . ./Builds/containers/gitlab-ci/sign_package.sh dpkg - -######################################################################### -## ## -## stage: smoketest ## -## ## -## install unsigned packages from previous step and run unit tests. ## -## ## -######################################################################### - -centos_7_smoketest: - stage: smoketest - dependencies: - - rpm_build - image: - name: artifactory.ops.ripple.com/centos:7 - <<: *run_local_smoketest - -rocky_8_smoketest: - stage: smoketest - dependencies: - - rpm_build - image: - name: artifactory.ops.ripple.com/rockylinux/rockylinux:8 - <<: *run_local_smoketest - -fedora_37_smoketest: - stage: smoketest - dependencies: - - rpm_build - image: - name: artifactory.ops.ripple.com/fedora:37 - <<: *run_local_smoketest - -fedora_38_smoketest: - stage: smoketest - dependencies: - - rpm_build - image: - name: artifactory.ops.ripple.com/fedora:38 - <<: *run_local_smoketest - -ubuntu_18_smoketest: - stage: smoketest - dependencies: - - dpkg_build - image: - name: artifactory.ops.ripple.com/ubuntu:18.04 - <<: *run_local_smoketest - -ubuntu_20_smoketest: - stage: smoketest - dependencies: - - dpkg_build - image: - name: artifactory.ops.ripple.com/ubuntu:20.04 - <<: *run_local_smoketest - -ubuntu_22_smoketest: - stage: smoketest - dependencies: - - dpkg_build - image: - name: artifactory.ops.ripple.com/ubuntu:22.04 - <<: *run_local_smoketest - -debian_10_smoketest: - stage: smoketest - dependencies: - - dpkg_build - image: - name: artifactory.ops.ripple.com/debian:10 - <<: *run_local_smoketest - -debian_11_smoketest: - stage: smoketest - dependencies: - - dpkg_build - image: - name: artifactory.ops.ripple.com/debian:11 - <<: *run_local_smoketest - -######################################################################### -## ## -## stage: verify_sig ## -## ## -## use git/gpg to verify that HEAD is signed by an approved ## -## committer. The whitelist of pubkeys is manually mantained ## -## and fetched from GIT_SIGN_PUBKEYS_URL (currently a snippet ## -## link). ## -## ONLY RUNS FOR PRIMARY BRANCHES/REPO ## -## ## -######################################################################### - -verify_head_signed: - stage: verify_sig - image: - name: artifactory.ops.ripple.com/ubuntu:latest - <<: *only_primary - script: - - . ./Builds/containers/gitlab-ci/verify_head_commit.sh - -######################################################################### -## ## -## stage: tag_images ## -## ## -## apply rippled version tag to containers from previous stage. ## -## ONLY RUNS FOR PRIMARY BRANCHES/REPO ## -## ## -######################################################################### - -tag_bld_images: - stage: tag_images - variables: - docker_driver: overlay2 - DOCKER_TLS_CERTDIR: "" - image: - name: artifactory.ops.ripple.com/docker:latest - services: - # workaround for TLS issues - consider going back - # back to unversioned `dind` when issues are resolved - - name: artifactory.ops.ripple.com/docker:stable-dind - alias: docker - tags: - - large - dependencies: - - rpm_sign - - dpkg_sign - <<: *only_primary - script: - - . ./Builds/containers/gitlab-ci/tag_docker_image.sh - -######################################################################### -## ## -## stage: push_to_test ## -## ## -## push packages to artifactory repositories (test) ## -## ONLY RUNS FOR PRIMARY BRANCHES/REPO ## -## ## -######################################################################### - -push_test: - stage: push_to_test - variables: - DEB_REPO: "rippled-deb-test-mirror" - RPM_REPO: "rippled-rpm-test-mirror" - image: - name: artifactory.ops.ripple.com/alpine:latest - artifacts: - paths: - - files.info - dependencies: - - rpm_sign - - dpkg_sign - <<: *only_primary - script: - - . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "PUT" "." - -######################################################################### -## ## -## stage: verify_from_test ## -## ## -## install/test packages from test repos. ## -## ONLY RUNS FOR PRIMARY BRANCHES/REPO ## -## ## -######################################################################### - -centos_7_verify_repo_test: - stage: verify_from_test - variables: - RPM_REPO: "rippled-rpm-test-mirror" - image: - name: artifactory.ops.ripple.com/centos:7 - dependencies: - - rpm_sign - <<: *only_primary - <<: *run_repo_smoketest - - -rocky_8_verify_repo_test: - stage: verify_from_test - variables: - RPM_REPO: "rippled-rpm-test-mirror" - image: - name: artifactory.ops.ripple.com/rockylinux/rockylinux:8 - dependencies: - - rpm_sign - <<: *only_primary - <<: *run_repo_smoketest - -fedora_37_verify_repo_test: - stage: verify_from_test - variables: - RPM_REPO: "rippled-rpm-test-mirror" - image: - name: artifactory.ops.ripple.com/fedora:37 - dependencies: - - rpm_sign - <<: *only_primary - <<: *run_repo_smoketest - -fedora_38_verify_repo_test: - stage: verify_from_test - variables: - RPM_REPO: "rippled-rpm-test-mirror" - image: - name: artifactory.ops.ripple.com/fedora:38 - dependencies: - - rpm_sign - <<: *only_primary - <<: *run_repo_smoketest - -ubuntu_18_verify_repo_test: - stage: verify_from_test - variables: - DISTRO: "bionic" - DEB_REPO: "rippled-deb-test-mirror" - image: - name: artifactory.ops.ripple.com/ubuntu:18.04 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -ubuntu_20_verify_repo_test: - stage: verify_from_test - variables: - DISTRO: "focal" - DEB_REPO: "rippled-deb-test-mirror" - image: - name: artifactory.ops.ripple.com/ubuntu:20.04 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -ubuntu_22_verify_repo_test: - stage: verify_from_test - variables: - DISTRO: "jammy" - DEB_REPO: "rippled-deb-test-mirror" - image: - name: artifactory.ops.ripple.com/ubuntu:22.04 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -debian_10_verify_repo_test: - stage: verify_from_test - variables: - DISTRO: "buster" - DEB_REPO: "rippled-deb-test-mirror" - image: - name: artifactory.ops.ripple.com/debian:10 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -debian_11_verify_repo_test: - stage: verify_from_test - variables: - DISTRO: "bullseye" - DEB_REPO: "rippled-deb-test-mirror" - image: - name: artifactory.ops.ripple.com/debian:11 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -######################################################################### -## ## -## stage: wait_approval_prod ## -## ## -## wait for manual approval before proceeding to next stage ## -## which pushes to prod repo. ## -## ONLY RUNS FOR PRIMARY BRANCHES/REPO ## -## ## -######################################################################### -wait_before_push_prod: - stage: wait_approval_prod - image: - name: artifactory.ops.ripple.com/alpine:latest - <<: *only_primary - script: - - echo "proceeding to next stage" - when: manual - allow_failure: false - -######################################################################### -## ## -## stage: push_to_prod ## -## ## -## push packages to artifactory repositories (prod) ## -## ONLY RUNS FOR PRIMARY BRANCHES/REPO ## -## ## -######################################################################### - -push_prod: - variables: - DEB_REPO: "rippled-deb" - RPM_REPO: "rippled-rpm" - image: - name: artifactory.ops.ripple.com/alpine:latest - stage: push_to_prod - artifacts: - paths: - - files.info - dependencies: - - rpm_sign - - dpkg_sign - <<: *only_primary - script: - - . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "PUT" "." - -######################################################################### -## ## -## stage: verify_from_prod ## -## ## -## install/test packages from prod repos. ## -## ONLY RUNS FOR PRIMARY BRANCHES/REPO ## -## ## -######################################################################### - -centos_7_verify_repo_prod: - stage: verify_from_prod - variables: - RPM_REPO: "rippled-rpm" - image: - name: artifactory.ops.ripple.com/centos:7 - dependencies: - - rpm_sign - <<: *only_primary - <<: *run_repo_smoketest - -rocky_8_verify_repo_prod: - stage: verify_from_prod - variables: - RPM_REPO: "rippled-rpm" - image: - name: artifactory.ops.ripple.com/rockylinux/rockylinux:8 - dependencies: - - rpm_sign - <<: *only_primary - <<: *run_repo_smoketest - -fedora_37_verify_repo_prod: - stage: verify_from_prod - variables: - RPM_REPO: "rippled-rpm" - image: - name: artifactory.ops.ripple.com/fedora:37 - dependencies: - - rpm_sign - <<: *only_primary - <<: *run_repo_smoketest - -fedora_38_verify_repo_prod: - stage: verify_from_prod - variables: - RPM_REPO: "rippled-rpm" - image: - name: artifactory.ops.ripple.com/fedora:38 - dependencies: - - rpm_sign - <<: *only_primary - <<: *run_repo_smoketest - -ubuntu_18_verify_repo_prod: - stage: verify_from_prod - variables: - DISTRO: "bionic" - DEB_REPO: "rippled-deb" - image: - name: artifactory.ops.ripple.com/ubuntu:18.04 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -ubuntu_20_verify_repo_prod: - stage: verify_from_prod - variables: - DISTRO: "focal" - DEB_REPO: "rippled-deb" - image: - name: artifactory.ops.ripple.com/ubuntu:20.04 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -ubuntu_22_verify_repo_prod: - stage: verify_from_prod - variables: - DISTRO: "jammy" - DEB_REPO: "rippled-deb" - image: - name: artifactory.ops.ripple.com/ubuntu:22.04 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -debian_10_verify_repo_prod: - stage: verify_from_prod - variables: - DISTRO: "buster" - DEB_REPO: "rippled-deb" - image: - name: artifactory.ops.ripple.com/debian:10 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -debian_11_verify_repo_prod: - stage: verify_from_prod - variables: - DISTRO: "bullseye" - DEB_REPO: "rippled-deb" - image: - name: artifactory.ops.ripple.com/debian:11 - dependencies: - - dpkg_sign - <<: *only_primary - <<: *run_repo_smoketest - -######################################################################### -## ## -## stage: get_final_hashes ## -## ## -## fetch final hashes from artifactory. ## -## ONLY RUNS FOR PRIMARY BRANCHES/REPO ## -## ## -######################################################################### - -get_prod_hashes: - variables: - DEB_REPO: "rippled-deb" - RPM_REPO: "rippled-rpm" - image: - name: artifactory.ops.ripple.com/alpine:latest - stage: get_final_hashes - artifacts: - paths: - - files.info - dependencies: - - rpm_sign - - dpkg_sign - <<: *only_primary - script: - - . ./Builds/containers/gitlab-ci/push_to_artifactory.sh "GET" ".checksums" - -######################################################################### -## ## -## stage: build_containers ## -## ## -## build containers from docker definitions. These containers are NOT ## -## used for the package build. This step is only used to ensure that ## -## the package build targets and files are still working properly. ## -## ## -######################################################################### - -build_centos_container: - stage: build_containers - <<: *dind_param - script: - - . ./Builds/containers/gitlab-ci/build_container.sh rpm - -build_ubuntu_container: - stage: build_containers - <<: *dind_param - script: - - . ./Builds/containers/gitlab-ci/build_container.sh dpkg diff --git a/Builds/containers/gitlab-ci/push_to_artifactory.sh b/Builds/containers/gitlab-ci/push_to_artifactory.sh deleted file mode 100644 index 97a9e906a..000000000 --- a/Builds/containers/gitlab-ci/push_to_artifactory.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env sh -set -e -action=$1 -filter=$2 - -. ./Builds/containers/gitlab-ci/get_component.sh - -apk add curl jq coreutils util-linux -TOPDIR=$(pwd) - -# DPKG - -cd $TOPDIR -cd build/dpkg/packages -CURLARGS="-sk -X${action} -urippled:${ARTIFACTORY_DEPLOY_KEY_RIPPLED}" -RIPPLED_PKG=$(ls rippled_*.deb) -RIPPLED_REPORTING_PKG=$(ls rippled-reporting_*.deb) -RIPPLED_DBG_PKG=$(ls rippled-dbgsym_*.*deb) -RIPPLED_REPORTING_DBG_PKG=$(ls rippled-reporting-dbgsym_*.*deb) -# TODO - where to upload src tgz? -RIPPLED_SRC=$(ls rippled_*.orig.tar.gz) -DEB_MATRIX=";deb.component=${COMPONENT};deb.architecture=amd64" -for dist in buster bullseye bionic focal jammy; do - DEB_MATRIX="${DEB_MATRIX};deb.distribution=${dist}" -done -echo "{ \"debs\": {" > "${TOPDIR}/files.info" -for deb in ${RIPPLED_PKG} ${RIPPLED_DBG_PKG} ${RIPPLED_REPORTING_PKG} ${RIPPLED_REPORTING_DBG_PKG}; do - # first item doesn't get a comma separator - if [ $deb != $RIPPLED_PKG ] ; then - echo "," >> "${TOPDIR}/files.info" - fi - echo "\"${deb}\"": | tee -a "${TOPDIR}/files.info" - ca="${CURLARGS}" - if [ "${action}" = "PUT" ] ; then - url="https://${ARTIFACTORY_HOST}/artifactory/${DEB_REPO}/pool/${COMPONENT}/${deb}${DEB_MATRIX}" - ca="${ca} -T${deb}" - elif [ "${action}" = "GET" ] ; then - url="https://${ARTIFACTORY_HOST}/artifactory/api/storage/${DEB_REPO}/pool/${COMPONENT}/${deb}" - fi - echo "file info request url --> ${url}" - eval "curl ${ca} \"${url}\"" | jq -M "${filter}" | tee -a "${TOPDIR}/files.info" -done -echo "}," >> "${TOPDIR}/files.info" - -# RPM - -cd $TOPDIR -cd build/rpm/packages -RIPPLED_PKG=$(ls rippled-[0-9]*.x86_64.rpm) -RIPPLED_DEV_PKG=$(ls rippled-devel*.rpm) -RIPPLED_DBG_PKG=$(ls rippled-debuginfo*.rpm) -RIPPLED_REPORTING_PKG=$(ls rippled-reporting*.rpm) -# TODO - where to upload src rpm ? -RIPPLED_SRC=$(ls rippled-[0-9]*.src.rpm) -echo "\"rpms\": {" >> "${TOPDIR}/files.info" -for rpm in ${RIPPLED_PKG} ${RIPPLED_DEV_PKG} ${RIPPLED_DBG_PKG} ${RIPPLED_REPORTING_PKG}; do - # first item doesn't get a comma separator - if [ $rpm != $RIPPLED_PKG ] ; then - echo "," >> "${TOPDIR}/files.info" - fi - echo "\"${rpm}\"": | tee -a "${TOPDIR}/files.info" - ca="${CURLARGS}" - if [ "${action}" = "PUT" ] ; then - url="https://${ARTIFACTORY_HOST}/artifactory/${RPM_REPO}/${COMPONENT}/" - ca="${ca} -T${rpm}" - elif [ "${action}" = "GET" ] ; then - url="https://${ARTIFACTORY_HOST}/artifactory/api/storage/${RPM_REPO}/${COMPONENT}/${rpm}" - fi - echo "file info request url --> ${url}" - eval "curl ${ca} \"${url}\"" | jq -M "${filter}" | tee -a "${TOPDIR}/files.info" -done -echo "}}" >> "${TOPDIR}/files.info" -jq '.' "${TOPDIR}/files.info" > "${TOPDIR}/files.info.tmp" -mv "${TOPDIR}/files.info.tmp" "${TOPDIR}/files.info" - -if [ ! -z "${SLACK_NOTIFY_URL}" ] && [ "${action}" = "GET" ] ; then - # extract files.info content to variable and sanitize so it can - # be interpolated into a slack text field below - finfo=$(cat ${TOPDIR}/files.info | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g' | sed -E 's/"/\\"/g') - # try posting file info to slack. - # can add channel field to payload if the - # default channel is incorrect. Get rid of - # newlines in payload json since slack doesn't accept them - CONTENT=$(tr -d '[\n]' <> /etc/apt/sources.list - updateWithRetry - # uncomment this next line if you want to see the available package versions - # apt-cache policy rippled - apt-get -y install rippled=${dpkg_full_version} - elif [ "${install_from}" = "local" ] ; then - # cached pkg install - updateWithRetry - apt-get -y install libprotobuf-dev libprotoc-dev protobuf-compiler libssl-dev - rm -f build/dpkg/packages/rippled-dbgsym*.* - dpkg --no-debsig -i build/dpkg/packages/*.deb - else - echo "unrecognized pkg source!" - exit 1 - fi -else - yum -y update - if [ "${install_from}" = "repo" ] ; then - pkgs=("yum-utils coreutils util-linux") - if [ "$ID" = "rocky" ]; then - pkgs="${pkgs[@]/coreutils}" - fi - yum install -y $pkgs - REPOFILE="/etc/yum.repos.d/artifactory.repo" - echo "[Artifactory]" > ${REPOFILE} - echo "name=Artifactory" >> ${REPOFILE} - echo "baseurl=${REPO_ROOT}/${RPM_REPO}/${COMPONENT}/" >> ${REPOFILE} - echo "enabled=1" >> ${REPOFILE} - echo "gpgcheck=0" >> ${REPOFILE} - echo "gpgkey=${REPO_ROOT}/${RPM_REPO}/${COMPONENT}/repodata/repomd.xml.key" >> ${REPOFILE} - echo "repo_gpgcheck=1" >> ${REPOFILE} - yum -y update - # uncomment this next line if you want to see the available package versions - # yum --showduplicates list rippled - yum -y install ${rpm_version_release} - elif [ "${install_from}" = "local" ] ; then - # cached pkg install - pkgs=("yum-utils openssl-static zlib-static") - if [[ "$ID" =~ rocky|fedora ]]; then - if [[ "$ID" =~ "rocky" ]]; then - sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/Rocky-PowerTools.repo - fi - pkgs="${pkgs[@]/openssl-static}" - fi - yum install -y $pkgs - rm -f build/rpm/packages/rippled-debug*.rpm - rm -f build/rpm/packages/*.src.rpm - rpm -i build/rpm/packages/*.rpm - else - echo "unrecognized pkg source!" - exit 1 - fi -fi - -# verify installed version -INSTALLED=$(/opt/ripple/bin/rippled --version | awk '{print $NF}') -if [ "${rippled_version}" != "${INSTALLED}" ] ; then - echo "INSTALLED version ${INSTALLED} does not match ${rippled_version}" - exit 1 -fi -# run unit tests -/opt/ripple/bin/rippled --unittest --unittest-jobs $(nproc) -/opt/ripple/bin/validator-keys --unittest diff --git a/Builds/containers/gitlab-ci/tag_docker_image.sh b/Builds/containers/gitlab-ci/tag_docker_image.sh deleted file mode 100644 index 662590595..000000000 --- a/Builds/containers/gitlab-ci/tag_docker_image.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env sh -set -e -docker login -u rippled \ - -p ${ARTIFACTORY_DEPLOY_KEY_RIPPLED} "${ARTIFACTORY_HUB}" -# this gives us rippled_version : -source build/rpm/packages/build_vars -docker pull "${ARTIFACTORY_HUB}/${RPM_CONTAINER_FULLNAME}" -docker pull "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_FULLNAME}" -# tag/push two labels...one using the current rippled version and one just using "latest" -for label in ${rippled_version} latest ; do - docker tag \ - "${ARTIFACTORY_HUB}/${RPM_CONTAINER_FULLNAME}" \ - "${ARTIFACTORY_HUB}/${RPM_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}" - docker push \ - "${ARTIFACTORY_HUB}/${RPM_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}" - docker tag \ - "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_FULLNAME}" \ - "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}" - docker push \ - "${ARTIFACTORY_HUB}/${DPKG_CONTAINER_NAME}:${label}_${CI_COMMIT_REF_SLUG}" -done diff --git a/Builds/containers/gitlab-ci/verify_head_commit.sh b/Builds/containers/gitlab-ci/verify_head_commit.sh deleted file mode 100644 index f724b7e96..000000000 --- a/Builds/containers/gitlab-ci/verify_head_commit.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env sh -set -ex -apt -y update -DEBIAN_FRONTEND="noninteractive" apt-get -y install tzdata -apt -y install software-properties-common curl git gnupg -curl -sk -o rippled-pubkeys.txt "${GIT_SIGN_PUBKEYS_URL}" -gpg --import rippled-pubkeys.txt -if git verify-commit HEAD; then - echo "git commit signature check passed" -else - echo "git commit signature check failed" - git log -n 5 --color \ - --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an> [%G?]%Creset' \ - --abbrev-commit - exit 1 -fi - diff --git a/Builds/containers/packaging/dpkg/build_dpkg.sh b/Builds/containers/packaging/dpkg/build_dpkg.sh deleted file mode 100755 index 3cfafe9e3..000000000 --- a/Builds/containers/packaging/dpkg/build_dpkg.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/usr/bin/env bash -set -ex - -# make sure pkg source files are up to date with repo -cd /opt/rippled_bld/pkg -cp -fpru rippled/Builds/containers/packaging/dpkg/debian/. debian/ -cp -fpu rippled/Builds/containers/shared/rippled*.service debian/ -cp -fpu rippled/Builds/containers/shared/update_sources.sh . -source update_sources.sh - -# Build the dpkg - -#dpkg uses - as separator, so we need to change our -bN versions to tilde -RIPPLED_DPKG_VERSION=$(echo "${RIPPLED_VERSION}" | sed 's!-!~!g') -# TODO - decide how to handle the trailing/release -# version here (hardcoded to 1). Does it ever need to change? -RIPPLED_DPKG_FULL_VERSION="${RIPPLED_DPKG_VERSION}-1" -git config --global --add safe.directory /opt/rippled_bld/pkg/rippled -cd /opt/rippled_bld/pkg/rippled -if [[ -n $(git status --porcelain) ]]; then - git status - error "Unstaged changes in this repo - please commit first" -fi -git archive --format tar.gz --prefix rippled-${RIPPLED_DPKG_VERSION}/ -o ../rippled-${RIPPLED_DPKG_VERSION}.tar.gz HEAD -cd .. -# dpkg debmake would normally create this link, but we do it manually -ln -s ./rippled-${RIPPLED_DPKG_VERSION}.tar.gz rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz -tar xvf rippled-${RIPPLED_DPKG_VERSION}.tar.gz -cd rippled-${RIPPLED_DPKG_VERSION} -cp -pr ../debian . - -# dpkg requires a changelog. We don't currently maintain -# a useable one, so let's just fake it with our current version -# TODO : not sure if the "unstable" will need to change for -# release packages (?) -NOWSTR=$(TZ=UTC date -R) -cat << CHANGELOG > ./debian/changelog -rippled (${RIPPLED_DPKG_FULL_VERSION}) unstable; urgency=low - - * see RELEASENOTES - - -- Ripple Labs Inc. ${NOWSTR} -CHANGELOG - -# PATH must be preserved for our more modern cmake in /opt/local -# TODO : consider allowing lintian to run in future ? -export DH_BUILD_DDEBS=1 -debuild --no-lintian --preserve-envvar PATH --preserve-env -us -uc -rc=$?; if [[ $rc != 0 ]]; then - error "error building dpkg" -fi -cd .. - -# copy artifacts -cp rippled-reporting_${RIPPLED_DPKG_FULL_VERSION}_amd64.deb ${PKG_OUTDIR} -cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.deb ${PKG_OUTDIR} -cp rippled_${RIPPLED_DPKG_FULL_VERSION}.dsc ${PKG_OUTDIR} -# dbgsym suffix is ddeb under newer debuild, but just deb under earlier -cp rippled-dbgsym_${RIPPLED_DPKG_FULL_VERSION}_amd64.* ${PKG_OUTDIR} -cp rippled-reporting-dbgsym_${RIPPLED_DPKG_FULL_VERSION}_amd64.* ${PKG_OUTDIR} -cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.changes ${PKG_OUTDIR} -cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.build ${PKG_OUTDIR} -cp rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz ${PKG_OUTDIR} -cp rippled_${RIPPLED_DPKG_FULL_VERSION}.debian.tar.xz ${PKG_OUTDIR} -# buildinfo is only generated by later version of debuild -if [ -e rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.buildinfo ] ; then - cp rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.buildinfo ${PKG_OUTDIR} -fi - -cat rippled_${RIPPLED_DPKG_FULL_VERSION}_amd64.changes -# extract the text in the .changes file that appears between -# Checksums-Sha256: ... -# and -# Files: ... -awk '/Checksums-Sha256:/{hit=1;next}/Files:/{hit=0}hit' \ - rippled_${RIPPLED_DPKG_VERSION}-1_amd64.changes | \ - sed -E 's!^[[:space:]]+!!' > shasums -DEB_SHA256=$(cat shasums | \ - grep "rippled_${RIPPLED_DPKG_VERSION}-1_amd64.deb" | cut -d " " -f 1) -DBG_SHA256=$(cat shasums | \ - grep "rippled-dbgsym_${RIPPLED_DPKG_VERSION}-1_amd64.*" | cut -d " " -f 1) -REPORTING_DBG_SHA256=$(cat shasums | \ - grep "rippled-reporting-dbgsym_${RIPPLED_DPKG_VERSION}-1_amd64.*" | cut -d " " -f 1) -REPORTING_SHA256=$(cat shasums | \ - grep "rippled-reporting_${RIPPLED_DPKG_VERSION}-1_amd64.deb" | cut -d " " -f 1) -SRC_SHA256=$(cat shasums | \ - grep "rippled_${RIPPLED_DPKG_VERSION}.orig.tar.gz" | cut -d " " -f 1) -echo "deb_sha256=${DEB_SHA256}" >> ${PKG_OUTDIR}/build_vars -echo "dbg_sha256=${DBG_SHA256}" >> ${PKG_OUTDIR}/build_vars -echo "reporting_sha256=${REPORTING_SHA256}" >> ${PKG_OUTDIR}/build_vars -echo "reporting_dbg_sha256=${REPORTING_DBG_SHA256}" >> ${PKG_OUTDIR}/build_vars -echo "src_sha256=${SRC_SHA256}" >> ${PKG_OUTDIR}/build_vars -echo "rippled_version=${RIPPLED_VERSION}" >> ${PKG_OUTDIR}/build_vars -echo "dpkg_version=${RIPPLED_DPKG_VERSION}" >> ${PKG_OUTDIR}/build_vars -echo "dpkg_full_version=${RIPPLED_DPKG_FULL_VERSION}" >> ${PKG_OUTDIR}/build_vars diff --git a/Builds/containers/packaging/dpkg/debian/README.Debian b/Builds/containers/packaging/dpkg/debian/README.Debian deleted file mode 100644 index 25ba6b55f..000000000 --- a/Builds/containers/packaging/dpkg/debian/README.Debian +++ /dev/null @@ -1,3 +0,0 @@ -rippled daemon - - -- Mike Ellery Tue, 04 Dec 2018 18:19:03 +0000 diff --git a/Builds/containers/packaging/dpkg/debian/compat b/Builds/containers/packaging/dpkg/debian/compat deleted file mode 100644 index f599e28b8..000000000 --- a/Builds/containers/packaging/dpkg/debian/compat +++ /dev/null @@ -1 +0,0 @@ -10 diff --git a/Builds/containers/packaging/dpkg/debian/control b/Builds/containers/packaging/dpkg/debian/control deleted file mode 100644 index b840eb228..000000000 --- a/Builds/containers/packaging/dpkg/debian/control +++ /dev/null @@ -1,19 +0,0 @@ -Source: rippled -Section: misc -Priority: extra -Maintainer: Ripple Labs Inc. -Build-Depends: cmake, debhelper (>=9), zlib1g-dev, dh-systemd, ninja-build -Standards-Version: 3.9.7 -Homepage: http://ripple.com/ - -Package: rippled -Architecture: any -Multi-Arch: foreign -Depends: ${misc:Depends}, ${shlibs:Depends} -Description: rippled daemon - -Package: rippled-reporting -Architecture: any -Multi-Arch: foreign -Depends: ${misc:Depends}, ${shlibs:Depends} -Description: rippled reporting daemon diff --git a/Builds/containers/packaging/dpkg/debian/copyright b/Builds/containers/packaging/dpkg/debian/copyright deleted file mode 100644 index dce318fd7..000000000 --- a/Builds/containers/packaging/dpkg/debian/copyright +++ /dev/null @@ -1,86 +0,0 @@ -Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ -Upstream-Name: rippled -Source: https://github.com/ripple/rippled - -Files: * -Copyright: 2012-2019 Ripple Labs Inc. - -License: __UNKNOWN__ - -The accompanying files under various copyrights. - -Copyright (c) 2012, 2013, 2014 Ripple Labs Inc. - -Permission to use, copy, modify, and 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. - -The accompanying files incorporate work covered by the following copyright -and previous license notice: - -Copyright (c) 2011 Arthur Britto, David Schwartz, Jed McCaleb, -Vinnie Falco, Bob Way, Eric Lombrozo, Nikolaos D. Bougalis, Howard Hinnant - -Some code from Raw Material Software, Ltd., provided under the terms of the - ISC License. See the corresponding source files for more details. - Copyright (c) 2013 - Raw Material Software Ltd. - Please visit http://www.juce.com - -Some code from ASIO examples: -// Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -Some code from Bitcoin: -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2011 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file license.txt or http://www.opensource.org/licenses/mit-license.php. - -Some code from Tom Wu: -This software is covered under the following copyright: - -/* - * Copyright (c) 2003-2005 Tom Wu - * All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * "Software"), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, - * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER - * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF - * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * In addition, the following condition applies: - * - * All redistributions must retain an intact copy of this copyright notice - * and disclaimer. - */ - -Address all questions regarding this license to: - - Tom Wu - tjw@cs.Stanford.EDU diff --git a/Builds/containers/packaging/dpkg/debian/dirs b/Builds/containers/packaging/dpkg/debian/dirs deleted file mode 100644 index aed307ee1..000000000 --- a/Builds/containers/packaging/dpkg/debian/dirs +++ /dev/null @@ -1,3 +0,0 @@ -/var/log/rippled/ -/var/lib/rippled/ -/etc/systemd/system/rippled.service.d/ diff --git a/Builds/containers/packaging/dpkg/debian/docs b/Builds/containers/packaging/dpkg/debian/docs deleted file mode 100644 index 17aa96662..000000000 --- a/Builds/containers/packaging/dpkg/debian/docs +++ /dev/null @@ -1,3 +0,0 @@ -README.md -LICENSE.md -RELEASENOTES.md diff --git a/Builds/containers/packaging/dpkg/debian/rippled-dev.install b/Builds/containers/packaging/dpkg/debian/rippled-dev.install deleted file mode 100644 index a222857c0..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled-dev.install +++ /dev/null @@ -1,3 +0,0 @@ -opt/ripple/include -opt/ripple/lib/*.a -opt/ripple/lib/cmake/ripple diff --git a/Builds/containers/packaging/dpkg/debian/rippled-reporting.dirs b/Builds/containers/packaging/dpkg/debian/rippled-reporting.dirs deleted file mode 100644 index 0f5cdbd40..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled-reporting.dirs +++ /dev/null @@ -1,3 +0,0 @@ -/var/log/rippled-reporting/ -/var/lib/rippled-reporting/ -/etc/systemd/system/rippled-reporting.service.d/ \ No newline at end of file diff --git a/Builds/containers/packaging/dpkg/debian/rippled-reporting.install b/Builds/containers/packaging/dpkg/debian/rippled-reporting.install deleted file mode 100644 index 255c7b0b5..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled-reporting.install +++ /dev/null @@ -1,8 +0,0 @@ -bld/rippled-reporting/rippled-reporting opt/rippled-reporting/bin -cfg/rippled-reporting.cfg opt/rippled-reporting/etc -debian/tmp/opt/rippled-reporting/etc/validators.txt opt/rippled-reporting/etc - -opt/rippled-reporting/bin/update-rippled-reporting.sh -opt/rippled-reporting/bin/getRippledReportingInfo -opt/rippled-reporting/etc/update-rippled-reporting-cron -etc/logrotate.d/rippled-reporting \ No newline at end of file diff --git a/Builds/containers/packaging/dpkg/debian/rippled-reporting.links b/Builds/containers/packaging/dpkg/debian/rippled-reporting.links deleted file mode 100644 index ab83b0c81..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled-reporting.links +++ /dev/null @@ -1,3 +0,0 @@ -opt/rippled-reporting/etc/rippled-reporting.cfg etc/opt/rippled-reporting/rippled-reporting.cfg -opt/rippled-reporting/etc/validators.txt etc/opt/rippled-reporting/validators.txt -opt/rippled-reporting/bin/rippled-reporting usr/local/bin/rippled-reporting diff --git a/Builds/containers/packaging/dpkg/debian/rippled-reporting.postinst b/Builds/containers/packaging/dpkg/debian/rippled-reporting.postinst deleted file mode 100644 index 640441973..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled-reporting.postinst +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/sh -set -e - -USER_NAME=rippled-reporting -GROUP_NAME=rippled-reporting -case "$1" in - configure) - id -u $USER_NAME >/dev/null 2>&1 || \ - adduser --system --quiet \ - --home /nonexistent --no-create-home \ - --disabled-password \ - --group "$GROUP_NAME" - chown -R $USER_NAME:$GROUP_NAME /var/log/rippled-reporting/ - chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled-reporting/ - chmod 755 /var/log/rippled-reporting/ - chmod 755 /var/lib/rippled-reporting/ - chown -R $USER_NAME:$GROUP_NAME /opt/rippled-reporting - - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - - -#DEBHELPER# - -exit 0 diff --git a/Builds/containers/packaging/dpkg/debian/rippled.conffiles b/Builds/containers/packaging/dpkg/debian/rippled.conffiles deleted file mode 100644 index 0c6d1c36d..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled.conffiles +++ /dev/null @@ -1,2 +0,0 @@ -/opt/ripple/etc/rippled.cfg -/opt/ripple/etc/validators.txt diff --git a/Builds/containers/packaging/dpkg/debian/rippled.install b/Builds/containers/packaging/dpkg/debian/rippled.install deleted file mode 100644 index 3ce9f60fb..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled.install +++ /dev/null @@ -1,8 +0,0 @@ -opt/ripple/bin/rippled -opt/ripple/bin/validator-keys -opt/ripple/bin/update-rippled.sh -opt/ripple/bin/getRippledInfo -opt/ripple/etc/rippled.cfg -opt/ripple/etc/validators.txt -opt/ripple/etc/update-rippled-cron -etc/logrotate.d/rippled diff --git a/Builds/containers/packaging/dpkg/debian/rippled.links b/Builds/containers/packaging/dpkg/debian/rippled.links deleted file mode 100644 index ff2abd82b..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled.links +++ /dev/null @@ -1,3 +0,0 @@ -opt/ripple/etc/rippled.cfg etc/opt/ripple/rippled.cfg -opt/ripple/etc/validators.txt etc/opt/ripple/validators.txt -opt/ripple/bin/rippled usr/local/bin/rippled diff --git a/Builds/containers/packaging/dpkg/debian/rippled.postinst b/Builds/containers/packaging/dpkg/debian/rippled.postinst deleted file mode 100644 index 9838fa593..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled.postinst +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh -set -e - -USER_NAME=rippled -GROUP_NAME=rippled -case "$1" in - configure) - id -u $USER_NAME >/dev/null 2>&1 || \ - adduser --system --quiet \ - --home /nonexistent --no-create-home \ - --disabled-password \ - --group "$GROUP_NAME" - chown -R $USER_NAME:$GROUP_NAME /var/log/rippled/ - chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled/ - chown -R $USER_NAME:$GROUP_NAME /opt/ripple - chmod 755 /var/log/rippled/ - chmod 755 /var/lib/rippled/ - chmod 644 /opt/ripple/etc/update-rippled-cron - chmod 644 /etc/logrotate.d/rippled - chown -R root:$GROUP_NAME /opt/ripple/etc/update-rippled-cron - ;; - - abort-upgrade|abort-remove|abort-deconfigure) - ;; - - *) - echo "postinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - - -#DEBHELPER# - -exit 0 diff --git a/Builds/containers/packaging/dpkg/debian/rippled.postrm b/Builds/containers/packaging/dpkg/debian/rippled.postrm deleted file mode 100644 index 9086993a1..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled.postrm +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -set -e - -case "$1" in - purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) - ;; - - *) - echo "postrm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - - -#DEBHELPER# - -exit 0 diff --git a/Builds/containers/packaging/dpkg/debian/rippled.preinst b/Builds/containers/packaging/dpkg/debian/rippled.preinst deleted file mode 100644 index 10575345a..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled.preinst +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -set -e - -case "$1" in - install|upgrade) - ;; - - abort-upgrade) - ;; - - *) - echo "preinst called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - - -#DEBHELPER# - -exit 0 diff --git a/Builds/containers/packaging/dpkg/debian/rippled.prerm b/Builds/containers/packaging/dpkg/debian/rippled.prerm deleted file mode 100644 index adabdbfb7..000000000 --- a/Builds/containers/packaging/dpkg/debian/rippled.prerm +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -set -e - -case "$1" in - remove|upgrade|deconfigure) - ;; - - failed-upgrade) - ;; - - *) - echo "prerm called with unknown argument \`$1'" >&2 - exit 1 - ;; -esac - - -#DEBHELPER# - -exit 0 diff --git a/Builds/containers/packaging/dpkg/debian/rules b/Builds/containers/packaging/dpkg/debian/rules deleted file mode 100755 index d62517d34..000000000 --- a/Builds/containers/packaging/dpkg/debian/rules +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/make -f -export DH_VERBOSE = 1 -export DH_OPTIONS = -v -# debuild sets some warnings that don't work well -# for our curent build..so try to remove those flags here: -export CFLAGS:=$(subst -Wformat,,$(CFLAGS)) -export CFLAGS:=$(subst -Werror=format-security,,$(CFLAGS)) -export CXXFLAGS:=$(subst -Wformat,,$(CXXFLAGS)) -export CXXFLAGS:=$(subst -Werror=format-security,,$(CXXFLAGS)) - -%: - dh $@ --with systemd - -override_dh_systemd_start: - dh_systemd_start --no-restart-on-upgrade - -override_dh_auto_configure: - env - rm -rf bld - - conan export external/snappy snappy/1.1.9@ - - conan install . \ - --install-folder bld/rippled \ - --build missing \ - --build boost \ - --build sqlite3 \ - --settings build_type=Release - - cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/opt/ripple \ - -Dstatic=ON \ - -Dunity=OFF \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - -Dvalidator_keys=ON \ - -B bld/rippled - - conan install . \ - --install-folder bld/rippled-reporting \ - --build missing \ - --build boost \ - --build sqlite3 \ - --build libuv \ - --settings build_type=Release \ - --options reporting=True - - cmake -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \ - -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=/opt/rippled-reporting \ - -Dstatic=ON \ - -Dunity=OFF \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - -Dreporting=ON \ - -B bld/rippled-reporting - -override_dh_auto_build: - cmake --build bld/rippled --target rippled --target validator-keys -j${nproc} - - cmake --build bld/rippled-reporting --target rippled -j${nproc} - -override_dh_auto_install: - cmake --install bld/rippled --prefix debian/tmp/opt/ripple - install -D bld/rippled/validator-keys/validator-keys debian/tmp/opt/ripple/bin/validator-keys - install -D Builds/containers/shared/update-rippled.sh debian/tmp/opt/ripple/bin/update-rippled.sh - install -D bin/getRippledInfo debian/tmp/opt/ripple/bin/getRippledInfo - install -D Builds/containers/shared/update-rippled-cron debian/tmp/opt/ripple/etc/update-rippled-cron - install -D Builds/containers/shared/rippled-logrotate debian/tmp/etc/logrotate.d/rippled - rm -rf debian/tmp/opt/ripple/lib64/cmake/date - - mkdir -p debian/tmp/opt/rippled-reporting/etc - mkdir -p debian/tmp/opt/rippled-reporting/bin - cp cfg/validators-example.txt debian/tmp/opt/rippled-reporting/etc/validators.txt - - sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/update-rippled.sh > debian/tmp/opt/rippled-reporting/bin/update-rippled-reporting.sh - sed -E 's/rippled?/rippled-reporting/g' bin/getRippledInfo > debian/tmp/opt/rippled-reporting/bin/getRippledReportingInfo - sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/update-rippled-cron > debian/tmp/opt/rippled-reporting/etc/update-rippled-reporting-cron - sed -E 's/rippled?/rippled-reporting/g' Builds/containers/shared/rippled-logrotate > debian/tmp/etc/logrotate.d/rippled-reporting diff --git a/Builds/containers/packaging/dpkg/debian/source/format b/Builds/containers/packaging/dpkg/debian/source/format deleted file mode 100644 index 163aaf8d8..000000000 --- a/Builds/containers/packaging/dpkg/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -3.0 (quilt) diff --git a/Builds/containers/packaging/dpkg/debian/source/local-options b/Builds/containers/packaging/dpkg/debian/source/local-options deleted file mode 100644 index 00131ee8c..000000000 --- a/Builds/containers/packaging/dpkg/debian/source/local-options +++ /dev/null @@ -1,2 +0,0 @@ -#abort-on-upstream-changes -#unapply-patches diff --git a/Builds/containers/packaging/rpm/50-rippled-reporting.preset b/Builds/containers/packaging/rpm/50-rippled-reporting.preset deleted file mode 100644 index 50d16dd7a..000000000 --- a/Builds/containers/packaging/rpm/50-rippled-reporting.preset +++ /dev/null @@ -1 +0,0 @@ -enable rippled-reporting.service \ No newline at end of file diff --git a/Builds/containers/packaging/rpm/50-rippled.preset b/Builds/containers/packaging/rpm/50-rippled.preset deleted file mode 100644 index 854e20a08..000000000 --- a/Builds/containers/packaging/rpm/50-rippled.preset +++ /dev/null @@ -1 +0,0 @@ -enable rippled.service \ No newline at end of file diff --git a/Builds/containers/packaging/rpm/build_rpm.sh b/Builds/containers/packaging/rpm/build_rpm.sh deleted file mode 100755 index 57e576b51..000000000 --- a/Builds/containers/packaging/rpm/build_rpm.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env bash -set -ex - -cd /opt/rippled_bld/pkg -cp -fpu rippled/Builds/containers/packaging/rpm/rippled.spec . -cp -fpu rippled/Builds/containers/shared/update_sources.sh . -source update_sources.sh - -# Build the rpm - -IFS='-' read -r RIPPLED_RPM_VERSION RELEASE <<< "$RIPPLED_VERSION" -export RIPPLED_RPM_VERSION - -RPM_RELEASE=${RPM_RELEASE-1} - -# post-release version -if [ "hf" = "$(echo "$RELEASE" | cut -c -2)" ]; then - RPM_RELEASE="${RPM_RELEASE}.${RELEASE}" -# pre-release version (-b or -rc) -elif [[ $RELEASE ]]; then - RPM_RELEASE="0.${RPM_RELEASE}.${RELEASE}" -fi - -export RPM_RELEASE - -if [[ $RPM_PATCH ]]; then - RPM_PATCH=".${RPM_PATCH}" - export RPM_PATCH -fi - -cd /opt/rippled_bld/pkg/rippled - -if [[ -n $(git status --porcelain) ]]; then - git status - error "Unstaged changes in this repo - please commit first" -fi - -git archive --format tar.gz --prefix rippled/ -o ../rpmbuild/SOURCES/rippled.tar.gz HEAD - -cd .. - -source /opt/rh/devtoolset-11/enable - -rpmbuild --define "_topdir ${PWD}/rpmbuild" -ba rippled.spec - -rc=$?; if [[ $rc != 0 ]]; then - error "error building rpm" -fi - -# Make a tar of the rpm and source rpm -RPM_VERSION_RELEASE=$(rpm -qp --qf='%{NAME}-%{VERSION}-%{RELEASE}' ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm) -tar_file=$RPM_VERSION_RELEASE.tar.gz - -cp ./rpmbuild/RPMS/x86_64/* ${PKG_OUTDIR} -cp ./rpmbuild/SRPMS/* ${PKG_OUTDIR} - -RPM_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm 2>/dev/null) -DBG_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-debuginfo*.rpm 2>/dev/null) -DEV_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-devel*.rpm 2>/dev/null) -REP_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/RPMS/x86_64/rippled-reporting*.rpm 2>/dev/null) -SRC_MD5SUM=$(rpm -q --queryformat '%{SIGMD5}\n' -p ./rpmbuild/SRPMS/*.rpm 2>/dev/null) - -RPM_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-[0-9]*.rpm | awk '{ print $1}')" -DBG_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-debuginfo*.rpm | awk '{ print $1}')" -REP_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-reporting*.rpm | awk '{ print $1}')" -DEV_SHA256="$(sha256sum ./rpmbuild/RPMS/x86_64/rippled-devel*.rpm | awk '{ print $1}')" -SRC_SHA256="$(sha256sum ./rpmbuild/SRPMS/*.rpm | awk '{ print $1}')" - -echo "rpm_md5sum=$RPM_MD5SUM" > ${PKG_OUTDIR}/build_vars -echo "rep_md5sum=$REP_MD5SUM" >> ${PKG_OUTDIR}/build_vars -echo "dbg_md5sum=$DBG_MD5SUM" >> ${PKG_OUTDIR}/build_vars -echo "dev_md5sum=$DEV_MD5SUM" >> ${PKG_OUTDIR}/build_vars -echo "src_md5sum=$SRC_MD5SUM" >> ${PKG_OUTDIR}/build_vars -echo "rpm_sha256=$RPM_SHA256" >> ${PKG_OUTDIR}/build_vars -echo "rep_sha256=$REP_SHA256" >> ${PKG_OUTDIR}/build_vars -echo "dbg_sha256=$DBG_SHA256" >> ${PKG_OUTDIR}/build_vars -echo "dev_sha256=$DEV_SHA256" >> ${PKG_OUTDIR}/build_vars -echo "src_sha256=$SRC_SHA256" >> ${PKG_OUTDIR}/build_vars -echo "rippled_version=$RIPPLED_VERSION" >> ${PKG_OUTDIR}/build_vars -echo "rpm_version=$RIPPLED_RPM_VERSION" >> ${PKG_OUTDIR}/build_vars -echo "rpm_file_name=$tar_file" >> ${PKG_OUTDIR}/build_vars -echo "rpm_version_release=$RPM_VERSION_RELEASE" >> ${PKG_OUTDIR}/build_vars diff --git a/Builds/containers/packaging/rpm/rippled.spec b/Builds/containers/packaging/rpm/rippled.spec deleted file mode 100644 index fe451d645..000000000 --- a/Builds/containers/packaging/rpm/rippled.spec +++ /dev/null @@ -1,236 +0,0 @@ -%define rippled_version %(echo $RIPPLED_RPM_VERSION) -%define rpm_release %(echo $RPM_RELEASE) -%define rpm_patch %(echo $RPM_PATCH) -%define _prefix /opt/ripple - -Name: rippled -# Dashes in Version extensions must be converted to underscores -Version: %{rippled_version} -Release: %{rpm_release}%{?dist}%{rpm_patch} -Summary: rippled daemon - -License: MIT -URL: http://ripple.com/ -Source0: rippled.tar.gz - -BuildRequires: cmake zlib-static ninja-build - -%description -rippled - -%package devel -Summary: Files for development of applications using xrpl core library -Group: Development/Libraries -Requires: zlib-static - -%description devel -core library for development of standalone applications that sign transactions. - -%package reporting -Summary: Reporting Server for rippled - -%description reporting -History server for XRP Ledger - -%prep -%setup -c -n rippled - -%build -rm -rf ~/.conan/profiles/default - -cp /opt/libcstd/libstdc++.so.6.0.22 /usr/lib64 -cp /opt/libcstd/libstdc++.so.6.0.22 /lib64 -ln -sf /usr/lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6 -ln -sf /lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6 - -source /opt/rh/rh-python38/enable -pip install "conan<2" -conan profile new default --detect -conan profile update settings.compiler.libcxx=libstdc++11 default -conan profile update settings.compiler.cppstd=20 default - -cd rippled - -mkdir -p bld.rippled -conan export external/snappy snappy/1.1.9@ - -pushd bld.rippled -conan install .. \ - --settings build_type=Release \ - --output-folder . \ - --build missing - -cmake -G Ninja \ - -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \ - -DCMAKE_INSTALL_PREFIX=%{_prefix} \ - -DCMAKE_BUILD_TYPE=Release \ - -Dunity=OFF \ - -Dstatic=ON \ - -Dvalidator_keys=ON \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - .. - -cmake --build . --parallel $(nproc) --target rippled --target validator-keys -popd - -mkdir -p bld.rippled-reporting -pushd bld.rippled-reporting - -conan install .. \ - --settings build_type=Release \ - --output-folder . \ - --build missing \ - --settings compiler.cppstd=17 \ - --options reporting=True - -cmake -G Ninja \ - -DCMAKE_TOOLCHAIN_FILE:FILEPATH=build/generators/conan_toolchain.cmake \ - -DCMAKE_INSTALL_PREFIX=%{_prefix} \ - -DCMAKE_BUILD_TYPE=Release \ - -Dunity=OFF \ - -Dstatic=ON \ - -Dvalidator_keys=ON \ - -Dreporting=ON \ - -DCMAKE_VERBOSE_MAKEFILE=ON \ - .. - -cmake --build . --parallel $(nproc) --target rippled - -%pre -test -e /etc/pki/tls || { mkdir -p /etc/pki; ln -s /usr/lib/ssl /etc/pki/tls; } - -%install -rm -rf $RPM_BUILD_ROOT -DESTDIR=$RPM_BUILD_ROOT cmake --build rippled/bld.rippled --target install #-- -v -mkdir -p $RPM_BUILD_ROOT -rm -rf ${RPM_BUILD_ROOT}/%{_prefix}/lib64/ -install -d ${RPM_BUILD_ROOT}/etc/opt/ripple -install -d ${RPM_BUILD_ROOT}/usr/local/bin - -install -D ./rippled/cfg/rippled-example.cfg ${RPM_BUILD_ROOT}/%{_prefix}/etc/rippled.cfg -install -D ./rippled/cfg/validators-example.txt ${RPM_BUILD_ROOT}/%{_prefix}/etc/validators.txt - -ln -sf %{_prefix}/etc/rippled.cfg ${RPM_BUILD_ROOT}/etc/opt/ripple/rippled.cfg -ln -sf %{_prefix}/etc/validators.txt ${RPM_BUILD_ROOT}/etc/opt/ripple/validators.txt -ln -sf %{_prefix}/bin/rippled ${RPM_BUILD_ROOT}/usr/local/bin/rippled -install -D rippled/bld.rippled/validator-keys/validator-keys ${RPM_BUILD_ROOT}%{_bindir}/validator-keys -install -D ./rippled/Builds/containers/shared/rippled.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/rippled.service -install -D ./rippled/Builds/containers/packaging/rpm/50-rippled.preset ${RPM_BUILD_ROOT}/usr/lib/systemd/system-preset/50-rippled.preset -install -D ./rippled/Builds/containers/shared/update-rippled.sh ${RPM_BUILD_ROOT}%{_bindir}/update-rippled.sh -install -D ./rippled/bin/getRippledInfo ${RPM_BUILD_ROOT}%{_bindir}/getRippledInfo -install -D ./rippled/Builds/containers/shared/update-rippled-cron ${RPM_BUILD_ROOT}%{_prefix}/etc/update-rippled-cron -install -D ./rippled/Builds/containers/shared/rippled-logrotate ${RPM_BUILD_ROOT}/etc/logrotate.d/rippled -install -d $RPM_BUILD_ROOT/var/log/rippled -install -d $RPM_BUILD_ROOT/var/lib/rippled - -# reporting mode -%define _prefix /opt/rippled-reporting -mkdir -p ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/ -install -D rippled/bld.rippled-reporting/rippled-reporting ${RPM_BUILD_ROOT}%{_bindir}/rippled-reporting -install -D ./rippled/cfg/rippled-reporting.cfg ${RPM_BUILD_ROOT}%{_prefix}/etc/rippled-reporting.cfg -install -D ./rippled/cfg/validators-example.txt ${RPM_BUILD_ROOT}%{_prefix}/etc/validators.txt -install -D ./rippled/Builds/containers/packaging/rpm/50-rippled-reporting.preset ${RPM_BUILD_ROOT}/usr/lib/systemd/system-preset/50-rippled-reporting.preset -ln -s %{_prefix}/bin/rippled-reporting ${RPM_BUILD_ROOT}/usr/local/bin/rippled-reporting -ln -s %{_prefix}/etc/rippled-reporting.cfg ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/rippled-reporting.cfg -ln -s %{_prefix}/etc/validators.txt ${RPM_BUILD_ROOT}/etc/opt/rippled-reporting/validators.txt -install -d $RPM_BUILD_ROOT/var/log/rippled-reporting -install -d $RPM_BUILD_ROOT/var/lib/rippled-reporting -install -D ./rippled/Builds/containers/shared/rippled-reporting.service ${RPM_BUILD_ROOT}/usr/lib/systemd/system/rippled-reporting.service -sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/update-rippled.sh > ${RPM_BUILD_ROOT}%{_bindir}/update-rippled-reporting.sh -sed -E 's/rippled?/rippled-reporting/g' ./rippled/bin/getRippledInfo > ${RPM_BUILD_ROOT}%{_bindir}/getRippledReportingInfo -sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/update-rippled-cron > ${RPM_BUILD_ROOT}%{_prefix}/etc/update-rippled-reporting-cron -sed -E 's/rippled?/rippled-reporting/g' ./rippled/Builds/containers/shared/rippled-logrotate > ${RPM_BUILD_ROOT}/etc/logrotate.d/rippled-reporting - - -%post -%define _prefix /opt/ripple -USER_NAME=rippled -GROUP_NAME=rippled - -getent passwd $USER_NAME &>/dev/null || useradd $USER_NAME -getent group $GROUP_NAME &>/dev/null || groupadd $GROUP_NAME - -chown -R $USER_NAME:$GROUP_NAME /var/log/rippled/ -chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled/ -chown -R $USER_NAME:$GROUP_NAME %{_prefix}/ - -chmod 755 /var/log/rippled/ -chmod 755 /var/lib/rippled/ - -chmod 644 %{_prefix}/etc/update-rippled-cron -chmod 644 /etc/logrotate.d/rippled -chown -R root:$GROUP_NAME %{_prefix}/etc/update-rippled-cron - -%post reporting -%define _prefix /opt/rippled-reporting -USER_NAME=rippled-reporting -GROUP_NAME=rippled-reporting - -getent passwd $USER_NAME &>/dev/null || useradd -r $USER_NAME -getent group $GROUP_NAME &>/dev/null || groupadd $GROUP_NAME - -chown -R $USER_NAME:$GROUP_NAME /var/log/rippled-reporting/ -chown -R $USER_NAME:$GROUP_NAME /var/lib/rippled-reporting/ -chown -R $USER_NAME:$GROUP_NAME %{_prefix}/ - -chmod 755 /var/log/rippled-reporting/ -chmod 755 /var/lib/rippled-reporting/ -chmod -x /usr/lib/systemd/system/rippled-reporting.service - - -%files -%define _prefix /opt/ripple -%doc rippled/README.md rippled/LICENSE.md -%{_bindir}/rippled -/usr/local/bin/rippled -%{_bindir}/update-rippled.sh -%{_bindir}/getRippledInfo -%{_prefix}/etc/update-rippled-cron -%{_bindir}/validator-keys -%config(noreplace) %{_prefix}/etc/rippled.cfg -%config(noreplace) /etc/opt/ripple/rippled.cfg -%config(noreplace) %{_prefix}/etc/validators.txt -%config(noreplace) /etc/opt/ripple/validators.txt -%config(noreplace) /etc/logrotate.d/rippled -%config(noreplace) /usr/lib/systemd/system/rippled.service -%config(noreplace) /usr/lib/systemd/system-preset/50-rippled.preset - -%dir /var/log/rippled/ -%dir /var/lib/rippled/ - -%files devel -%{_prefix}/include -%{_prefix}/lib/*.a -%{_prefix}/lib/cmake/ripple - -%files reporting -%define _prefix /opt/rippled-reporting -%doc rippled/README.md rippled/LICENSE.md - -%{_bindir}/rippled-reporting -/usr/local/bin/rippled-reporting -%config(noreplace) /etc/opt/rippled-reporting/rippled-reporting.cfg -%config(noreplace) %{_prefix}/etc/rippled-reporting.cfg -%config(noreplace) %{_prefix}/etc/validators.txt -%config(noreplace) /etc/opt/rippled-reporting/validators.txt -%config(noreplace) /usr/lib/systemd/system/rippled-reporting.service -%config(noreplace) /usr/lib/systemd/system-preset/50-rippled-reporting.preset -%dir /var/log/rippled-reporting/ -%dir /var/lib/rippled-reporting/ -%{_bindir}/update-rippled-reporting.sh -%{_bindir}/getRippledReportingInfo -%{_prefix}/etc/update-rippled-reporting-cron -%config(noreplace) /etc/logrotate.d/rippled-reporting - -%changelog -* Wed Aug 28 2019 Mike Ellery -- Switch to subproject build for validator-keys - -* Wed May 15 2019 Mike Ellery -- Make validator-keys use local rippled build for core lib - -* Wed Aug 01 2018 Mike Ellery -- add devel package for signing library - -* Thu Jun 02 2016 Brandon Wilson -- Install validators.txt diff --git a/Builds/containers/shared/install_cmake.sh b/Builds/containers/shared/install_cmake.sh deleted file mode 100755 index e6f84dd6c..000000000 --- a/Builds/containers/shared/install_cmake.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env bash -set -e - -IFS=. read cm_maj cm_min cm_rel <<<"$1" -: ${cm_rel:-0} -CMAKE_ROOT=${2:-"${HOME}/cmake"} - -function cmake_version () -{ - if [[ -d ${CMAKE_ROOT} ]] ; then - local perms=$(test $(uname) = "Linux" && echo "/111" || echo "+111") - local installed=$(find ${CMAKE_ROOT} -perm ${perms} -type f -name cmake) - if [[ "${installed}" != "" ]] ; then - echo "$(${installed} --version | head -1)" - fi - fi -} - -installed=$(cmake_version) -if [[ "${installed}" != "" && ${installed} =~ ${cm_maj}.${cm_min}.${cm_rel} ]] ; then - echo "cmake already installed: ${installed}" - exit -fi -# From CMake 20+ "Linux" is lowercase so using `uname` won't create be the correct path -if [ ${cm_min} -gt 19 ]; then - linux="linux" -else - linux=$(uname) -fi -pkgname="cmake-${cm_maj}.${cm_min}.${cm_rel}-${linux}-x86_64.tar.gz" -tmppkg="/tmp/cmake.tar.gz" -wget --quiet https://cmake.org/files/v${cm_maj}.${cm_min}/${pkgname} -O ${tmppkg} -mkdir -p ${CMAKE_ROOT} -cd ${CMAKE_ROOT} -tar --strip-components 1 -xf ${tmppkg} -rm -f ${tmppkg} -echo "installed: $(cmake_version)" diff --git a/Builds/containers/shared/rippled-logrotate b/Builds/containers/shared/rippled-logrotate deleted file mode 100644 index 120aa91d3..000000000 --- a/Builds/containers/shared/rippled-logrotate +++ /dev/null @@ -1,15 +0,0 @@ -/var/log/rippled/*.log { - daily - minsize 200M - rotate 7 - nocreate - missingok - notifempty - compress - compresscmd /usr/bin/nice - compressoptions -n19 ionice -c3 gzip - compressext .gz - postrotate - /opt/ripple/bin/rippled --conf /opt/ripple/etc/rippled.cfg logrotate - endscript -} diff --git a/Builds/containers/shared/rippled-reporting.service b/Builds/containers/shared/rippled-reporting.service deleted file mode 100644 index 69edf4794..000000000 --- a/Builds/containers/shared/rippled-reporting.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description=Ripple Daemon -After=network-online.target -Wants=network-online.target - -[Service] -Type=simple -ExecStart=/opt/rippled-reporting/bin/rippled-reporting --silent --conf /etc/opt/rippled-reporting/rippled-reporting.cfg -Restart=on-failure -User=rippled-reporting -Group=rippled-reporting -LimitNOFILE=65536 - -[Install] -WantedBy=multi-user.target diff --git a/Builds/containers/shared/rippled.service b/Builds/containers/shared/rippled.service deleted file mode 100644 index 24d9dd975..000000000 --- a/Builds/containers/shared/rippled.service +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description=Ripple Daemon -After=network-online.target -Wants=network-online.target - -[Service] -Type=simple -ExecStart=/opt/ripple/bin/rippled --net --silent --conf /etc/opt/ripple/rippled.cfg -Restart=on-failure -User=rippled -Group=rippled -LimitNOFILE=65536 - -[Install] -WantedBy=multi-user.target diff --git a/Builds/containers/shared/update-rippled-cron b/Builds/containers/shared/update-rippled-cron deleted file mode 100644 index c7744219f..000000000 --- a/Builds/containers/shared/update-rippled-cron +++ /dev/null @@ -1,10 +0,0 @@ -# For automatic updates, symlink this file to /etc/cron.d/ -# Do not remove the newline at the end of this cron script - -# bash required for use of RANDOM below. -SHELL=/bin/bash -PATH=/sbin;/bin;/usr/sbin;/usr/bin - -# invoke check/update script with random delay up to 59 mins -0 * * * * root sleep $((RANDOM*3540/32768)) && /opt/ripple/bin/update-rippled.sh - diff --git a/Builds/containers/shared/update-rippled.sh b/Builds/containers/shared/update-rippled.sh deleted file mode 100755 index 19409ece0..000000000 --- a/Builds/containers/shared/update-rippled.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash - -# auto-update script for rippled daemon - -# Check for sudo/root permissions -if [[ $(id -u) -ne 0 ]] ; then - echo "This update script must be run as root or sudo" - exit 1 -fi - -LOCKDIR=/tmp/rippleupdate.lock -UPDATELOG=/var/log/rippled/update.log - -function cleanup { - # If this directory isn't removed, future updates will fail. - rmdir $LOCKDIR -} - -# Use mkdir to check if process is already running. mkdir is atomic, as against file create. -if ! mkdir $LOCKDIR 2>/dev/null; then - echo $(date -u) "lockdir exists - won't proceed." >> $UPDATELOG - exit 1 -fi -trap cleanup EXIT - -source /etc/os-release -can_update=false - -if [[ "$ID" == "ubuntu" || "$ID" == "debian" ]] ; then - # Silent update - apt-get update -qq - - # The next line is an "awk"ward way to check if the package needs to be updated. - RIPPLE=$(apt-get install -s --only-upgrade rippled | awk '/^Inst/ { print $2 }') - test "$RIPPLE" == "rippled" && can_update=true - - function apply_update { - apt-get install rippled -qq - } -elif [[ "$ID" == "fedora" || "$ID" == "centos" || "$ID" == "rhel" || "$ID" == "scientific" ]] ; then - RIPPLE_REPO=${RIPPLE_REPO-stable} - yum --disablerepo=* --enablerepo=ripple-$RIPPLE_REPO clean expire-cache - - yum check-update -q --enablerepo=ripple-$RIPPLE_REPO rippled || can_update=true - - function apply_update { - yum update -y --enablerepo=ripple-$RIPPLE_REPO rippled - } -else - echo "unrecognized distro!" - exit 1 -fi - -# Do the actual update and restart the service after reloading systemctl daemon. -if [ "$can_update" = true ] ; then - exec 3>&1 1>>${UPDATELOG} 2>&1 - set -e - apply_update - systemctl daemon-reload - systemctl restart rippled.service - echo $(date -u) "rippled daemon updated." -else - echo $(date -u) "no updates available" >> $UPDATELOG -fi - diff --git a/Builds/containers/shared/update_sources.sh b/Builds/containers/shared/update_sources.sh deleted file mode 100755 index 56ca958b2..000000000 --- a/Builds/containers/shared/update_sources.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash - -function error { - echo $1 - exit 1 -} - -cd /opt/rippled_bld/pkg/rippled -export RIPPLED_VERSION=$(egrep -i -o "\b(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-[0-9a-z\-]+(\.[0-9a-z\-]+)*)?(\+[0-9a-z\-]+(\.[0-9a-z\-]+)*)?\b" src/ripple/protocol/impl/BuildInfo.cpp) - -: ${PKG_OUTDIR:=/opt/rippled_bld/pkg/out} -export PKG_OUTDIR -if [ ! -d ${PKG_OUTDIR} ]; then - error "${PKG_OUTDIR} is not mounted" -fi - -if [ -x ${OPENSSL_ROOT}/bin/openssl ]; then - LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${OPENSSL_ROOT}/lib ${OPENSSL_ROOT}/bin/openssl version -a -fi - diff --git a/Builds/containers/ubuntu-builder/Dockerfile b/Builds/containers/ubuntu-builder/Dockerfile deleted file mode 100644 index 23723967f..000000000 --- a/Builds/containers/ubuntu-builder/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -ARG DIST_TAG=18.04 -FROM ubuntu:$DIST_TAG -ARG GIT_COMMIT=unknown -ARG CI_USE=false -LABEL git-commit=$GIT_COMMIT - -WORKDIR /root -COPY ubuntu-builder/ubuntu_setup.sh . -RUN ./ubuntu_setup.sh && rm ubuntu_setup.sh - -RUN mkdir -m 777 -p /opt/rippled_bld/pkg/ -WORKDIR /opt/rippled_bld/pkg - -COPY packaging/dpkg/build_dpkg.sh ./ -CMD ./build_dpkg.sh diff --git a/Builds/containers/ubuntu-builder/ubuntu_setup.sh b/Builds/containers/ubuntu-builder/ubuntu_setup.sh deleted file mode 100755 index cd8db7515..000000000 --- a/Builds/containers/ubuntu-builder/ubuntu_setup.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env bash - -set -o errexit -set -o nounset -set -o xtrace - -# Parameters - -gcc_version=${GCC_VERSION:-10} -cmake_version=${CMAKE_VERSION:-3.25.1} -conan_version=${CONAN_VERSION:-1.59} - -apt update -# Iteratively build the list of packages to install so that we can interleave -# the lines with comments explaining their inclusion. -dependencies='' -# - to identify the Ubuntu version -dependencies+=' lsb-release' -# - for add-apt-repository -dependencies+=' software-properties-common' -# - to download CMake -dependencies+=' curl' -# - to build CMake -dependencies+=' libssl-dev' -# - Python headers for Boost.Python -dependencies+=' python3-dev' -# - to install Conan -dependencies+=' python3-pip' -# - to download rippled -dependencies+=' git' -# - CMake generators (but not CMake itself) -dependencies+=' make ninja-build' -apt install --yes ${dependencies} - -add-apt-repository --yes ppa:ubuntu-toolchain-r/test -apt install --yes gcc-${gcc_version} g++-${gcc_version} \ - debhelper debmake debsums gnupg dh-buildinfo dh-make dh-systemd cmake \ - ninja-build zlib1g-dev make cmake ninja-build autoconf automake \ - pkg-config apt-transport-https - -# Give us nice unversioned aliases for gcc and company. -update-alternatives --install \ - /usr/bin/gcc gcc /usr/bin/gcc-${gcc_version} 100 \ - --slave /usr/bin/g++ g++ /usr/bin/g++-${gcc_version} \ - --slave /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-${gcc_version} \ - --slave /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-${gcc_version} \ - --slave /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-${gcc_version} \ - --slave /usr/bin/gcov gcov /usr/bin/gcov-${gcc_version} \ - --slave /usr/bin/gcov-tool gcov-tool /usr/bin/gcov-dump-${gcc_version} \ - --slave /usr/bin/gcov-dump gcov-dump /usr/bin/gcov-tool-${gcc_version} -update-alternatives --auto gcc - -# Download and unpack CMake. -cmake_slug="cmake-${cmake_version}" -curl --location --remote-name \ - "https://github.com/Kitware/CMake/releases/download/v${cmake_version}/${cmake_slug}.tar.gz" -tar xzf ${cmake_slug}.tar.gz -rm ${cmake_slug}.tar.gz - -# Build and install CMake. -cd ${cmake_slug} -./bootstrap --parallel=$(nproc) -make --jobs $(nproc) -make install -cd .. -rm --recursive --force ${cmake_slug} - -# Install Conan. -pip3 install conan==${conan_version} - -conan profile new --detect gcc -conan profile update settings.compiler=gcc gcc -conan profile update settings.compiler.version=${gcc_version} gcc -conan profile update settings.compiler.libcxx=libstdc++11 gcc -conan profile update env.CC=/usr/bin/gcc gcc -conan profile update env.CXX=/usr/bin/g++ gcc diff --git a/Builds/linux/README.md b/Builds/linux/README.md deleted file mode 100644 index fce8e824a..000000000 --- a/Builds/linux/README.md +++ /dev/null @@ -1 +0,0 @@ -[Build instructions are currently located in `BUILD.md`](../../BUILD.md) diff --git a/Builds/macos/README.md b/Builds/macos/README.md deleted file mode 100644 index fce8e824a..000000000 --- a/Builds/macos/README.md +++ /dev/null @@ -1 +0,0 @@ -[Build instructions are currently located in `BUILD.md`](../../BUILD.md) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 06b9d622c..1d916dcc6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,67 +1,186 @@ -# Contributing -The XRP Ledger has many and diverse stakeholders, and everyone deserves a chance to contribute meaningful changes to the code that runs the XRPL. -To contribute, please: -1. Fork the repository under your own user. -2. Create a new branch on which to write your changes. Please note that changes which alter transaction processing must be composed via and guarded using [Amendments](https://xrpl.org/amendments.html). Changes which are _read only_ i.e. RPC, or changes which are only refactors and maintain the existing behaviour do not need to be made through an Amendment. -3. Write and test your code. -4. Ensure that your code compiles with the provided build engine and update the provided build engine as part of your PR where needed and where appropriate. -5. Write test cases for your code and include those in `src/test` such that they are runnable from the command line using `./rippled -u`. (Some changes will not be able to be tested this way.) -6. Ensure your code passes automated checks (e.g. clang-format and levelization.) -7. Squash your commits (i.e. rebase) into as few commits as is reasonable to describe your changes at a high level (typically a single commit for a small change.) -8. Open a PR to the main repository onto the _develop_ branch, and follow the provided template. +The XRP Ledger has many and diverse stakeholders, and everyone deserves +a chance to contribute meaningful changes to the code that runs the +XRPL. + +# Contributing + +We assume you are familiar with the general practice of [making +contributions on GitHub][1]. This file includes only special +instructions specific to this project. + + +## Before you start + +In general, contributions should be developed in your personal +[fork](https://github.com/XRPLF/rippled/fork). + +The following branches exist in the main project repository: + +- `dev`: The latest set of unreleased features, and the most common + starting point for contributions. +- `candidate`: The latest beta release or release candidate. +- `release`: The latest stable release. + +The tip of each branch must be signed. In order for GitHub to sign a +squashed commit that it builds from your pull request, GitHub must know +your verifying key. Please set up [signature verification][signing]. + +[rippled]: https://github.com/XRPLF/rippled +[signing]: + https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification + + +## Major contributions + +If your contribution is a major feature or breaking change, then you +must first write an XRP Ledger Standard (XLS) describing it. Go to +[XRPL-Standards](https://github.com/XRPLF/XRPL-Standards/discussions), +choose the next available standard number, and open a discussion with an +appropriate title to propose your draft standard. + +When you submit a pull request, please link the corresponding XLS in the +description. An XLS still in draft status is considered a +work-in-progress and open for discussion. Please allow time for +questions, suggestions, and changes to the XLS draft. It is the +responsibility of the XLS author to update the draft to match the final +implementation when its corresponding pull request is merged, unless the +author delegates that responsibility to others. + + +## Before making a pull request + +Changes that alter transaction processing must be guarded by an +[Amendment](https://xrpl.org/amendments.html). +All other changes that maintain the existing behavior do not need an +Amendment. + +Ensure that your code compiles according to the build instructions in +[`BUILD.md`](./BUILD.md). +If you create new source files, they must go under `src/ripple`. +You will need to add them to one of the +[source lists](./Builds/CMake/RippledCore.cmake) in CMake. + +Please write tests for your code. +If you create new test source files, they must go under `src/test`. +You will need to add them to one of the +[source lists](./Builds/CMake/RippledCore.cmake) in CMake. +If your test can be run offline, in under 60 seconds, then it can be an +automatic test run by `rippled --unittest`. +Otherwise, it must be a manual test. + +The source must be formatted according to the style guide below. + +Header includes must be [levelized](./Builds/levelization). + + +## Pull requests + +In general, pull requests use `develop` as the base branch. + +(Hotfixes are an exception.) + +Changes to pull requests must be added as new commits. +Once code reviewers have started looking at your code, please avoid +force-pushing a branch in a pull request. +This preserves the ability for reviewers to filter changes since their last +review. + +A pull request must obtain **approvals from at least two reviewers** before it +can be considered for merge by a Maintainer. +Maintainers retain discretion to require more approvals if they feel the +credibility of the existing approvals is insufficient. + +Pull requests must be merged by [squash-and-merge][2] +to preserve a linear history for the `develop` branch. -# Major Changes -If your code change is a major feature, a breaking change or in some other way makes a significant alteration to the way the XRPL will operate, then you must first write an XLS document (XRP Ledger Standard) describing your change. -To do this: -1. Go to [XLS Standards](https://github.com/XRPLF/XRPL-Standards/discussions). -2. Choose the next available standard number. -3. Open a discussion with the appropriate title to propose your draft standard. -4. Link your XLS in your PR. # Style guide -This is a non-exhaustive list of recommended style guidelines. These are not always strictly enforced and serve as a way to keep the codebase coherent rather than a set of _thou shalt not_ commandments. + +This is a non-exhaustive list of recommended style guidelines. These are +not always strictly enforced and serve as a way to keep the codebase +coherent rather than a set of _thou shalt not_ commandments. + ## Formatting -All code must conform to `clang-format` version 10, unless the result would be unreasonably difficult to read or maintain. -To change your code to conform use `clang-format -i `. + +All code must conform to `clang-format` version 10, +according to the settings in [`.clang-format`](./.clang-format), +unless the result would be unreasonably difficult to read or maintain. +To demarcate lines that should be left as-is, surround them with comments like +this: + +``` +// clang-format off +... +// clang-format on +``` + +You can format individual files in place by running `clang-format -i ...` +from any directory within this project. + +You can install a pre-commit hook to automatically run `clang-format` before every commit: +``` +pip3 install pre-commit +pre-commit install +``` ## Avoid + 1. Proliferation of nearly identical code. 2. Proliferation of new files and classes. 3. Complex inheritance and complex OOP patterns. 4. Unmanaged memory allocation and raw pointers. -5. Macros and non-trivial templates (unless they add significant value.) -6. Lambda patterns (unless these add significant value.) -7. CPU or architecture-specific code unless there is a good reason to include it, and where it is used guard it with macros and provide explanatory comments. +5. Macros and non-trivial templates (unless they add significant value). +6. Lambda patterns (unless these add significant value). +7. CPU or architecture-specific code unless there is a good reason to + include it, and where it is used, guard it with macros and provide + explanatory comments. 8. Importing new libraries unless there is a very good reason to do so. + ## Seek to + 9. Extend functionality of existing code rather than creating new code. -10. Prefer readability over terseness where important logic is concerned. -11. Inline functions that are not used or are not likely to be used elsewhere in the codebase. -12. Use clear and self-explanatory names for functions, variables, structs and classes. -13. Use TitleCase for classes, structs and filenames, camelCase for function and variable names, lower case for namespaces and folders. -14. Provide as many comments as you feel that a competent programmer would need to understand what your code does. +10. Prefer readability over terseness where important logic is + concerned. +11. Inline functions that are not used or are not likely to be used + elsewhere in the codebase. +12. Use clear and self-explanatory names for functions, variables, + structs and classes. +13. Use TitleCase for classes, structs and filenames, camelCase for + function and variable names, lower case for namespaces and folders. +14. Provide as many comments as you feel that a competent programmer + would need to understand what your code does. + # Maintainers -Maintainers are ecosystem participants with elevated access to the repository. They are able to push new code, make decisions on when a release should be made, etc. -## Code Review -New contributors' PRs must be reviewed by at least two of the maintainers. Well established prior contributors can be reviewed by a single maintainer. +Maintainers are ecosystem participants with elevated access to the repository. +They are able to push new code, make decisions on when a release should be +made, etc. -## Adding and Removing -New maintainers can be proposed by two existing maintainers, subject to a vote by a quorum of the existing maintainers. A minimum of 50% support and a 50% participation is required. In the event of a tie vote, the addition of the new maintainer will be rejected. -Existing maintainers can resign, or be subject to a vote for removal at the behest of two existing maintainers. A minimum of 60% agreement and 50% participation are required. The XRP Ledger Foundation will have the ability, for cause, to remove an existing maintainer without a vote. +## Adding and removing -## Existing Maintainers -* [JoelKatz](https://github.com/JoelKatz) (Ripple) -* [Manojsdoshi](https://github.com/manojsdoshi) (Ripple) -* [N3tc4t](https://github.com/n3tc4t) (XRPL Labs) -* [Nikolaos D Bougalis](https://github.com/nbougalis) -* [Nixer89](https://github.com/nixer89) (XRP Ledger Foundation) -* [RichardAH](https://github.com/RichardAH) (XRPL Labs + XRP Ledger Foundation) -* [Seelabs](https://github.com/seelabs) (Ripple) -* [Silkjaer](https://github.com/Silkjaer) (XRP Ledger Foundation) -* [WietseWind](https://github.com/WietseWind) (XRPL Labs + XRP Ledger Foundation) -* [Ximinez](https://github.com/ximinez) (Ripple) +New maintainers can be proposed by two existing maintainers, subject to a vote +by a quorum of the existing maintainers. +A minimum of 50% support and a 50% participation is required. +In the event of a tie vote, the addition of the new maintainer will be +rejected. + +Existing maintainers can resign, or be subject to a vote for removal at the +behest of two existing maintainers. +A minimum of 60% agreement and 50% participation are required. +The XRP Ledger Foundation will have the ability, for cause, to remove an +existing maintainer without a vote. + + +## Current Maintainers + +* [Richard Holland](https://github.com/RichardAH) (XRPL Labs + XRP Ledger Foundation) +* [Denis Angell](https://github.com/dangell7) (XRPL Labs + XRP Ledger Foundation) +* [Wietse Wind](https://github.com/WietseWind) (XRPL Labs + XRP Ledger Foundation) + + +[1]: https://docs.github.com/en/get-started/quickstart/contributing-to-projects +[2]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/about-pull-request-merges#squash-and-merge-your-commits \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md index 9282ed78b..e276f4ccd 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -2,6 +2,7 @@ ISC License Copyright (c) 2011, Arthur Britto, David Schwartz, Jed McCaleb, Vinnie Falco, Bob Way, Eric Lombrozo, Nikolaos D. Bougalis, Howard Hinnant. Copyright (c) 2012-2020, the XRP Ledger developers. +Copyright (c) 2021-2024, XRPL Labs. Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above diff --git a/bin/browser.js b/bin/browser.js deleted file mode 100755 index 81618bd00..000000000 --- a/bin/browser.js +++ /dev/null @@ -1,470 +0,0 @@ -#!/usr/bin/node -// -// ledger?l=L -// transaction?h=H -// ledger_entry?l=L&h=H -// account?l=L&a=A -// directory?l=L&dir_root=H&i=I -// directory?l=L&o=A&i=I // owner directory -// offer?l=L&offer=H -// offer?l=L&account=A&i=I -// ripple_state=l=L&a=A&b=A&c=C -// account_lines?l=L&a=A -// -// A=address -// C=currency 3 letter code -// H=hash -// I=index -// L=current | closed | validated | index | hash -// - -var async = require("async"); -var extend = require("extend"); -var http = require("http"); -var url = require("url"); - -var Remote = require("ripple-lib").Remote; - -var program = process.argv[1]; - -var httpd_response = function (res, opts) { - var self=this; - - res.statusCode = opts.statusCode; - res.end( - "" - + "Title" - + "" - + "State:" + self.state - + "" - + (opts.body || '') - + '
'
-      + (opts.url || '')
-      + '
' - + "" - + "" - ); -}; - -var html_link = function (generic) { - return '' + generic + ''; -}; - -// Build a link to a type. -var build_uri = function (params, opts) { - var c; - - if (params.type === 'account') { - c = { - pathname: 'account', - query: { - l: params.ledger, - a: params.account, - }, - }; - - } else if (params.type === 'ledger') { - c = { - pathname: 'ledger', - query: { - l: params.ledger, - }, - }; - - } else if (params.type === 'transaction') { - c = { - pathname: 'transaction', - query: { - h: params.hash, - }, - }; - } else { - c = {}; - } - - opts = opts || {}; - - c.protocol = "http"; - c.hostname = opts.hostname || self.base.hostname; - c.port = opts.port || self.base.port; - - return url.format(c); -}; - -var build_link = function (item, link) { -console.log(link); - return "" + item + ""; -}; - -var rewrite_field = function (type, obj, field, opts) { - if (field in obj) { - obj[field] = rewrite_type(type, obj[field], opts); - } -}; - -var rewrite_type = function (type, obj, opts) { - if ('amount' === type) { - if ('string' === typeof obj) { - // XRP. - return '' + obj + ''; - - } else { - rewrite_field('address', obj, 'issuer', opts); - - return obj; - } - return build_link( - obj, - build_uri({ - type: 'account', - account: obj - }, opts) - ); - } - if ('address' === type) { - return build_link( - obj, - build_uri({ - type: 'account', - account: obj - }, opts) - ); - } - else if ('ledger' === type) { - return build_link( - obj, - build_uri({ - type: 'ledger', - ledger: obj, - }, opts) - ); - } - else if ('node' === type) { - // A node - if ('PreviousTxnID' in obj) - obj.PreviousTxnID = rewrite_type('transaction', obj.PreviousTxnID, opts); - - if ('Offer' === obj.LedgerEntryType) { - if ('NewFields' in obj) { - if ('TakerGets' in obj.NewFields) - obj.NewFields.TakerGets = rewrite_type('amount', obj.NewFields.TakerGets, opts); - - if ('TakerPays' in obj.NewFields) - obj.NewFields.TakerPays = rewrite_type('amount', obj.NewFields.TakerPays, opts); - } - } - - obj.LedgerEntryType = '' + obj.LedgerEntryType + ''; - - return obj; - } - else if ('transaction' === type) { - // Reference to a transaction. - return build_link( - obj, - build_uri({ - type: 'transaction', - hash: obj - }, opts) - ); - } - - return 'ERROR: ' + type; -}; - -var rewrite_object = function (obj, opts) { - var out = extend({}, obj); - - rewrite_field('address', out, 'Account', opts); - - rewrite_field('ledger', out, 'parent_hash', opts); - rewrite_field('ledger', out, 'ledger_index', opts); - rewrite_field('ledger', out, 'ledger_current_index', opts); - rewrite_field('ledger', out, 'ledger_hash', opts); - - if ('ledger' in obj) { - // It's a ledger header. - out.ledger = rewrite_object(out.ledger, opts); - - if ('ledger_hash' in out.ledger) - out.ledger.ledger_hash = '' + out.ledger.ledger_hash + ''; - - delete out.ledger.hash; - delete out.ledger.totalCoins; - } - - if ('TransactionType' in obj) { - // It's a transaction. - out.TransactionType = '' + obj.TransactionType + ''; - - rewrite_field('amount', out, 'TakerGets', opts); - rewrite_field('amount', out, 'TakerPays', opts); - rewrite_field('ledger', out, 'inLedger', opts); - - out.meta.AffectedNodes = out.meta.AffectedNodes.map(function (node) { - var kind = 'CreatedNode' in node - ? 'CreatedNode' - : 'ModifiedNode' in node - ? 'ModifiedNode' - : 'DeletedNode' in node - ? 'DeletedNode' - : undefined; - - if (kind) { - node[kind] = rewrite_type('node', node[kind], opts); - } - return node; - }); - } - else if ('node' in obj && 'LedgerEntryType' in obj.node) { - // Its a ledger entry. - - if (obj.node.LedgerEntryType === 'AccountRoot') { - rewrite_field('address', out.node, 'Account', opts); - rewrite_field('transaction', out.node, 'PreviousTxnID', opts); - rewrite_field('ledger', out.node, 'PreviousTxnLgrSeq', opts); - } - - out.node.LedgerEntryType = '' + out.node.LedgerEntryType + ''; - } - - return out; -}; - -var augment_object = function (obj, opts, done) { - if (obj.node.LedgerEntryType == 'AccountRoot') { - var tx_hash = obj.node.PreviousTxnID; - var tx_ledger = obj.node.PreviousTxnLgrSeq; - - obj.history = []; - - async.whilst( - function () { return tx_hash; }, - function (callback) { -// console.log("augment_object: request: %s %s", tx_hash, tx_ledger); - opts.remote.request_tx(tx_hash) - .on('success', function (m) { - tx_hash = undefined; - tx_ledger = undefined; - -//console.log("augment_object: ", JSON.stringify(m)); - m.meta.AffectedNodes.filter(function(n) { -// console.log("augment_object: ", JSON.stringify(n)); -// if (n.ModifiedNode) -// console.log("augment_object: %s %s %s %s %s %s/%s", 'ModifiedNode' in n, n.ModifiedNode && (n.ModifiedNode.LedgerEntryType === 'AccountRoot'), n.ModifiedNode && n.ModifiedNode.FinalFields && (n.ModifiedNode.FinalFields.Account === obj.node.Account), Object.keys(n)[0], n.ModifiedNode && (n.ModifiedNode.LedgerEntryType), obj.node.Account, n.ModifiedNode && n.ModifiedNode.FinalFields && n.ModifiedNode.FinalFields.Account); -// if ('ModifiedNode' in n && n.ModifiedNode.LedgerEntryType === 'AccountRoot') -// { -// console.log("***: ", JSON.stringify(m)); -// console.log("***: ", JSON.stringify(n)); -// } - return 'ModifiedNode' in n - && n.ModifiedNode.LedgerEntryType === 'AccountRoot' - && n.ModifiedNode.FinalFields - && n.ModifiedNode.FinalFields.Account === obj.node.Account; - }) - .forEach(function (n) { - tx_hash = n.ModifiedNode.PreviousTxnID; - tx_ledger = n.ModifiedNode.PreviousTxnLgrSeq; - - obj.history.push({ - tx_hash: tx_hash, - tx_ledger: tx_ledger - }); -console.log("augment_object: next: %s %s", tx_hash, tx_ledger); - }); - - callback(); - }) - .on('error', function (m) { - callback(m); - }) - .request(); - }, - function (err) { - if (err) { - done(); - } - else { - async.forEach(obj.history, function (o, callback) { - opts.remote.request_account_info(obj.node.Account) - .ledger_index(o.tx_ledger) - .on('success', function (m) { -//console.log("augment_object: ", JSON.stringify(m)); - o.Balance = m.account_data.Balance; -// o.account_data = m.account_data; - callback(); - }) - .on('error', function (m) { - o.error = m; - callback(); - }) - .request(); - }, - function (err) { - done(err); - }); - } - }); - } - else { - done(); - } -}; - -if (process.argv.length < 4 || process.argv.length > 7) { - console.log("Usage: %s ws_ip ws_port [ [ []]]", program); -} -else { - var ws_ip = process.argv[2]; - var ws_port = process.argv[3]; - var ip = process.argv.length > 4 ? process.argv[4] : "127.0.0.1"; - var port = process.argv.length > 5 ? process.argv[5] : "8080"; - -// console.log("START"); - var self = this; - - var remote = (new Remote({ - websocket_ip: ws_ip, - websocket_port: ws_port, - trace: false - })) - .on('state', function (m) { - console.log("STATE: %s", m); - - self.state = m; - }) -// .once('ledger_closed', callback) - .connect() - ; - - self.base = { - hostname: ip, - port: port, - remote: remote, - }; - -// console.log("SERVE"); - var server = http.createServer(function (req, res) { - var input = ""; - - req.setEncoding(); - - req.on('data', function (buffer) { - // console.log("DATA: %s", buffer); - input = input + buffer; - }); - - req.on('end', function () { - // console.log("URL: %s", req.url); - // console.log("HEADERS: %s", JSON.stringify(req.headers, undefined, 2)); - - var _parsed = url.parse(req.url, true); - var _url = JSON.stringify(_parsed, undefined, 2); - - // console.log("HEADERS: %s", JSON.stringify(_parsed, undefined, 2)); - if (_parsed.pathname === "/account") { - var request = remote - .request_ledger_entry('account_root') - .ledger_index(-1) - .account_root(_parsed.query.a) - .on('success', function (m) { - // console.log("account_root: %s", JSON.stringify(m, undefined, 2)); - - augment_object(m, self.base, function() { - httpd_response(res, - { - statusCode: 200, - url: _url, - body: "
"
-                              + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
-                              + "
" - }); - }); - }) - .request(); - - } else if (_parsed.pathname === "/ledger") { - var request = remote - .request_ledger(undefined, { expand: true, transactions: true }) - .on('success', function (m) { - // console.log("Ledger: %s", JSON.stringify(m, undefined, 2)); - - httpd_response(res, - { - statusCode: 200, - url: _url, - body: "
"
-                          + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
-                          +"
" - }); - }) - - if (_parsed.query.l && _parsed.query.l.length === 64) { - request.ledger_hash(_parsed.query.l); - } - else if (_parsed.query.l) { - request.ledger_index(Number(_parsed.query.l)); - } - else { - request.ledger_index(-1); - } - - request.request(); - - } else if (_parsed.pathname === "/transaction") { - var request = remote - .request_tx(_parsed.query.h) -// .request_transaction_entry(_parsed.query.h) -// .ledger_select(_parsed.query.l) - .on('success', function (m) { - // console.log("transaction: %s", JSON.stringify(m, undefined, 2)); - - httpd_response(res, - { - statusCode: 200, - url: _url, - body: "
"
-                            + JSON.stringify(rewrite_object(m, self.base), undefined, 2)
-                            +"
" - }); - }) - .on('error', function (m) { - httpd_response(res, - { - statusCode: 200, - url: _url, - body: "
"
-                            + 'ERROR: ' + JSON.stringify(m, undefined, 2)
-                            +"
" - }); - }) - .request(); - - } else { - var test = build_uri({ - type: 'account', - ledger: 'closed', - account: 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh', - }, self.base); - - httpd_response(res, - { - statusCode: req.url === "/" ? 200 : 404, - url: _url, - }); - } - }); - }); - - server.listen(port, ip, undefined, - function () { - console.log("Listening at: http://%s:%s", ip, port); - }); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/ci/README.md b/bin/ci/README.md deleted file mode 100644 index 36d4fc1d3..000000000 --- a/bin/ci/README.md +++ /dev/null @@ -1,24 +0,0 @@ -In this directory are two scripts, `build.sh` and `test.sh` used for building -and testing rippled. - -(For now, they assume Bash and Linux. Once I get Windows containers for -testing, I'll try them there, but if Bash is not available, then they will -soon be joined by PowerShell scripts `build.ps` and `test.ps`.) - -We don't want these scripts to require arcane invocations that can only be -pieced together from within a CI configuration. We want something that humans -can easily invoke, read, and understand, for when we eventually have to test -and debug them interactively. That means: - -(1) They should work with no arguments. -(2) They should document their arguments. -(3) They should expand short arguments into long arguments. - -While we want to provide options for common use cases, we don't need to offer -the kitchen sink. We can rightfully expect users with esoteric, complicated -needs to write their own scripts. - -To make argument-handling easy for us, the implementers, we can just take all -arguments from environment variables. They have the nice advantage that every -command-line uses named arguments. For the benefit of us and our users, we -document those variables at the top of each script. diff --git a/bin/ci/build.sh b/bin/ci/build.sh deleted file mode 100755 index fa7a0c968..000000000 --- a/bin/ci/build.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -set -o xtrace -set -o errexit - -# The build system. Either 'Unix Makefiles' or 'Ninja'. -GENERATOR=${GENERATOR:-Unix Makefiles} -# The compiler. Either 'gcc' or 'clang'. -COMPILER=${COMPILER:-gcc} -# The build type. Either 'Debug' or 'Release'. -BUILD_TYPE=${BUILD_TYPE:-Debug} -# Additional arguments to CMake. -# We use the `-` substitution here instead of `:-` so that callers can erase -# the default by setting `$CMAKE_ARGS` to the empty string. -CMAKE_ARGS=${CMAKE_ARGS-'-Dwerr=ON'} - -# https://gitlab.kitware.com/cmake/cmake/issues/18865 -CMAKE_ARGS="-DBoost_NO_BOOST_CMAKE=ON ${CMAKE_ARGS}" - -if [[ ${COMPILER} == 'gcc' ]]; then - export CC='gcc' - export CXX='g++' -elif [[ ${COMPILER} == 'clang' ]]; then - export CC='clang' - export CXX='clang++' -fi - -mkdir build -cd build -cmake -G "${GENERATOR}" -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${CMAKE_ARGS} .. -cmake --build . -- -j $(nproc) diff --git a/bin/ci/test.sh b/bin/ci/test.sh deleted file mode 100755 index 11615d732..000000000 --- a/bin/ci/test.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -set -o xtrace -set -o errexit - -# Set to 'true' to run the known "manual" tests in rippled. -MANUAL_TESTS=${MANUAL_TESTS:-false} -# The maximum number of concurrent tests. -CONCURRENT_TESTS=${CONCURRENT_TESTS:-$(nproc)} -# The path to rippled. -RIPPLED=${RIPPLED:-build/rippled} -# Additional arguments to rippled. -RIPPLED_ARGS=${RIPPLED_ARGS:-} - -function join_by { local IFS="$1"; shift; echo "$*"; } - -declare -a manual_tests=( - 'beast.chrono.abstract_clock' - 'beast.unit_test.print' - 'ripple.NodeStore.Timing' - 'ripple.app.Flow_manual' - 'ripple.app.NoRippleCheckLimits' - 'ripple.app.PayStrandAllPairs' - 'ripple.consensus.ByzantineFailureSim' - 'ripple.consensus.DistributedValidators' - 'ripple.consensus.ScaleFreeSim' - 'ripple.tx.CrossingLimits' - 'ripple.tx.FindOversizeCross' - 'ripple.tx.Offer_manual' - 'ripple.tx.OversizeMeta' - 'ripple.tx.PlumpBook' -) - -if [[ ${MANUAL_TESTS} == 'true' ]]; then - RIPPLED_ARGS+=" --unittest=$(join_by , "${manual_tests[@]}")" -else - RIPPLED_ARGS+=" --unittest --quiet --unittest-log" -fi -RIPPLED_ARGS+=" --unittest-jobs ${CONCURRENT_TESTS}" - -${RIPPLED} ${RIPPLED_ARGS} diff --git a/bin/ci/ubuntu/build-and-test.sh b/bin/ci/ubuntu/build-and-test.sh deleted file mode 100755 index 7ae75f2b1..000000000 --- a/bin/ci/ubuntu/build-and-test.sh +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env bash -set -ex - -function version_ge() { test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1"; } - -__dirname=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) -echo "using CC: ${CC}" -"${CC}" --version -export CC - -COMPNAME=$(basename $CC) -echo "using CXX: ${CXX:-notset}" -if [[ $CXX ]]; then - "${CXX}" --version - export CXX -fi -: ${BUILD_TYPE:=Debug} -echo "BUILD TYPE: ${BUILD_TYPE}" - -: ${TARGET:=install} -echo "BUILD TARGET: ${TARGET}" - -JOBS=${NUM_PROCESSORS:-2} -if [[ ${TRAVIS:-false} != "true" ]]; then - JOBS=$((JOBS+1)) -fi - -if [[ ! -z "${CMAKE_EXE:-}" ]] ; then - export PATH="$(dirname ${CMAKE_EXE}):$PATH" -fi - -if [ -x /usr/bin/time ] ; then - : ${TIME:="Duration: %E"} - export TIME - time=/usr/bin/time -else - time= -fi - -echo "Building rippled" -: ${CMAKE_EXTRA_ARGS:=""} -if [[ ${NINJA_BUILD:-} == true ]]; then - CMAKE_EXTRA_ARGS+=" -G Ninja" -fi - -coverage=false -if [[ "${TARGET}" == "coverage_report" ]] ; then - echo "coverage option detected." - coverage=true -fi - -cmake --version -CMAKE_VER=$(cmake --version | cut -d " " -f 3 | head -1) - -# -# allow explicit setting of the name of the build -# dir, otherwise default to the compiler.build_type -# -: "${BUILD_DIR:=${COMPNAME}.${BUILD_TYPE}}" -BUILDARGS="--target ${TARGET}" -BUILDTOOLARGS="" -if version_ge $CMAKE_VER "3.12.0" ; then - BUILDARGS+=" --parallel" -fi - -if [[ ${NINJA_BUILD:-} == false ]]; then - if version_ge $CMAKE_VER "3.12.0" ; then - BUILDARGS+=" ${JOBS}" - else - BUILDTOOLARGS+=" -j ${JOBS}" - fi -fi - -if [[ ${VERBOSE_BUILD:-} == true ]]; then - CMAKE_EXTRA_ARGS+=" -DCMAKE_VERBOSE_MAKEFILE=ON" - if version_ge $CMAKE_VER "3.14.0" ; then - BUILDARGS+=" --verbose" - else - if [[ ${NINJA_BUILD:-} == false ]]; then - BUILDTOOLARGS+=" verbose=1" - else - BUILDTOOLARGS+=" -v" - fi - fi -fi - -if [[ ${USE_CCACHE:-} == true ]]; then - echo "using ccache with basedir [${CCACHE_BASEDIR:-}]" - CMAKE_EXTRA_ARGS+=" -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache" -fi -if [ -d "build/${BUILD_DIR}" ]; then - rm -rf "build/${BUILD_DIR}" -fi - -mkdir -p "build/${BUILD_DIR}" -pushd "build/${BUILD_DIR}" - -# cleanup possible artifacts -rm -fv CMakeFiles/CMakeOutput.log CMakeFiles/CMakeError.log -# Clean up NIH directories which should be git repos, but aren't -for nih_path in ${NIH_CACHE_ROOT}/*/*/*/src ${NIH_CACHE_ROOT}/*/*/src -do - for dir in lz4 snappy rocksdb - do - if [ -e ${nih_path}/${dir} -a \! -e ${nih_path}/${dir}/.git ] - then - ls -la ${nih_path}/${dir}* - rm -rfv ${nih_path}/${dir}* - fi - done -done - -# generate -${time} cmake ../.. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${CMAKE_EXTRA_ARGS} -# Display the cmake output, to help with debugging if something fails -for file in CMakeOutput.log CMakeError.log -do - if [ -f CMakeFiles/${file} ] - then - ls -l CMakeFiles/${file} - cat CMakeFiles/${file} - fi -done -# build -export DESTDIR=$(pwd)/_INSTALLED_ - -${time} eval cmake --build . ${BUILDARGS} -- ${BUILDTOOLARGS} - -if [[ ${TARGET} == "docs" ]]; then - ## mimic the standard test output for docs build - ## to make controlling processes like jenkins happy - if [ -f docs/html/index.html ]; then - echo "1 case, 1 test total, 0 failures" - else - echo "1 case, 1 test total, 1 failures" - fi - exit -fi -popd - -if [[ "${TARGET}" == "validator-keys" ]] ; then - export APP_PATH="$PWD/build/${BUILD_DIR}/validator-keys/validator-keys" -else - export APP_PATH="$PWD/build/${BUILD_DIR}/rippled" -fi -echo "using APP_PATH: ${APP_PATH}" - -# See what we've actually built -ldd ${APP_PATH} - -: ${APP_ARGS:=} - -if [[ "${TARGET}" == "validator-keys" ]] ; then - APP_ARGS="--unittest" -else - function join_by { local IFS="$1"; shift; echo "$*"; } - - # This is a list of manual tests - # in rippled that we want to run - # ORDER matters here...sorted in approximately - # descending execution time (longest running tests at top) - declare -a manual_tests=( - 'ripple.ripple_data.reduce_relay_simulate' - 'ripple.tx.Offer_manual' - 'ripple.tx.CrossingLimits' - 'ripple.tx.PlumpBook' - 'ripple.app.Flow_manual' - 'ripple.tx.OversizeMeta' - 'ripple.consensus.DistributedValidators' - 'ripple.app.NoRippleCheckLimits' - 'ripple.ripple_data.compression' - 'ripple.NodeStore.Timing' - 'ripple.consensus.ByzantineFailureSim' - 'beast.chrono.abstract_clock' - 'beast.unit_test.print' - ) - if [[ ${TRAVIS:-false} != "true" ]]; then - # these two tests cause travis CI to run out of memory. - # TODO: investigate possible workarounds. - manual_tests=( - 'ripple.consensus.ScaleFreeSim' - 'ripple.tx.FindOversizeCross' - "${manual_tests[@]}" - ) - fi - - if [[ ${MANUAL_TESTS:-} == true ]]; then - APP_ARGS+=" --unittest=$(join_by , "${manual_tests[@]}")" - else - APP_ARGS+=" --unittest --quiet --unittest-log" - fi - if [[ ${coverage} == false && ${PARALLEL_TESTS:-} == true ]]; then - APP_ARGS+=" --unittest-jobs ${JOBS}" - fi - - if [[ ${IPV6_TESTS:-} == true ]]; then - APP_ARGS+=" --unittest-ipv6" - fi -fi - -if [[ ${coverage} == true && $CC =~ ^gcc ]]; then - # Push the results (lcov.info) to codecov - codecov -X gcov # don't even try and look for .gcov files ;) - find . -name "*.gcda" | xargs rm -f -fi - -if [[ ${SKIP_TESTS:-} == true ]]; then - echo "skipping tests." - exit -fi - -ulimit -a -corepat=$(cat /proc/sys/kernel/core_pattern) -if [[ ${corepat} =~ ^[:space:]*\| ]] ; then - echo "WARNING: core pattern is piping - can't search for core files" - look_core=false -else - look_core=true - coredir=$(dirname ${corepat}) -fi -if [[ ${look_core} == true ]]; then - before=$(ls -A1 ${coredir}) -fi - -set +e -echo "Running tests for ${APP_PATH}" -if [[ ${MANUAL_TESTS:-} == true && ${PARALLEL_TESTS:-} != true ]]; then - for t in "${manual_tests[@]}" ; do - ${APP_PATH} --unittest=${t} - TEST_STAT=$? - if [[ $TEST_STAT -ne 0 ]] ; then - break - fi - done -else - ${APP_PATH} ${APP_ARGS} - TEST_STAT=$? -fi -set -e - -if [[ ${look_core} == true ]]; then - after=$(ls -A1 ${coredir}) - oIFS="${IFS}" - IFS=$'\n\r' - found_core=false - for l in $(diff -w --suppress-common-lines <(echo "$before") <(echo "$after")) ; do - if [[ "$l" =~ ^[[:space:]]*\>[[:space:]]*(.+)$ ]] ; then - corefile="${BASH_REMATCH[1]}" - echo "FOUND core dump file at '${coredir}/${corefile}'" - gdb_output=$(/bin/mktemp /tmp/gdb_output_XXXXXXXXXX.txt) - found_core=true - gdb \ - -ex "set height 0" \ - -ex "set logging file ${gdb_output}" \ - -ex "set logging on" \ - -ex "print 'ripple::BuildInfo::versionString'" \ - -ex "thread apply all backtrace full" \ - -ex "info inferiors" \ - -ex quit \ - "$APP_PATH" \ - "${coredir}/${corefile}" &> /dev/null - - echo -e "CORE INFO: \n\n $(cat ${gdb_output}) \n\n)" - fi - done - IFS="${oIFS}" -fi - -if [[ ${found_core} == true ]]; then - exit -1 -else - exit $TEST_STAT -fi - diff --git a/bin/ci/ubuntu/build-in-docker.sh b/bin/ci/ubuntu/build-in-docker.sh deleted file mode 100755 index feeabb118..000000000 --- a/bin/ci/ubuntu/build-in-docker.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash -# run our build script in a docker container -# using travis-ci hosts -set -eux - -function join_by { local IFS="$1"; shift; echo "$*"; } - -set +x -echo "VERBOSE_BUILD=true" > /tmp/co.env -matchers=( - 'TRAVIS.*' 'CI' 'CC' 'CXX' - 'BUILD_TYPE' 'TARGET' 'MAX_TIME' - 'CODECOV.+' 'CMAKE.*' '.+_TESTS' - '.+_OPTIONS' 'NINJA.*' 'NUM_.+' - 'NIH_.+' 'BOOST.*' '.*CCACHE.*') - -matchstring=$(join_by '|' "${matchers[@]}") -echo "MATCHSTRING IS:: $matchstring" -env | grep -E "^(${matchstring})=" >> /tmp/co.env -set -x -# need to eliminate TRAVIS_CMD...don't want to pass it to the container -cat /tmp/co.env | grep -v TRAVIS_CMD > /tmp/co.env.2 -mv /tmp/co.env.2 /tmp/co.env -cat /tmp/co.env -mkdir -p -m 0777 ${TRAVIS_BUILD_DIR}/cores -echo "${TRAVIS_BUILD_DIR}/cores/%e.%p" | sudo tee /proc/sys/kernel/core_pattern -docker run \ - -t --env-file /tmp/co.env \ - -v ${TRAVIS_HOME}:${TRAVIS_HOME} \ - -w ${TRAVIS_BUILD_DIR} \ - --cap-add SYS_PTRACE \ - --ulimit "core=-1" \ - $DOCKER_IMAGE \ - /bin/bash -c 'if [[ $CC =~ ([[:alpha:]]+)-([[:digit:].]+) ]] ; then sudo update-alternatives --set ${BASH_REMATCH[1]} /usr/bin/$CC; fi; bin/ci/ubuntu/build-and-test.sh' - - diff --git a/bin/ci/ubuntu/travis-cache-start.sh b/bin/ci/ubuntu/travis-cache-start.sh deleted file mode 100755 index 6811acb90..000000000 --- a/bin/ci/ubuntu/travis-cache-start.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env bash -# some cached files create churn, so save them here for -# later restoration before packing the cache -set -eux -clean_cache="travis_clean_cache" -if [[ ! ( "${TRAVIS_JOB_NAME}" =~ "windows" || \ - "${TRAVIS_JOB_NAME}" =~ "prereq-keep" ) ]] && \ - ( [[ "${TRAVIS_COMMIT_MESSAGE}" =~ "${clean_cache}" ]] || \ - ( [[ -v TRAVIS_PULL_REQUEST_SHA && \ - "${TRAVIS_PULL_REQUEST_SHA}" != "" ]] && \ - git log -1 "${TRAVIS_PULL_REQUEST_SHA}" | grep -cq "${clean_cache}" - - ) - ) -then - find ${TRAVIS_HOME}/_cache -maxdepth 2 -type d - rm -rf ${TRAVIS_HOME}/_cache - mkdir -p ${TRAVIS_HOME}/_cache -fi - -pushd ${TRAVIS_HOME} -if [ -f cache_ignore.tar ] ; then - rm -f cache_ignore.tar -fi - -if [ -d _cache/nih_c ] ; then - find _cache/nih_c -name "build.ninja" | tar rf cache_ignore.tar --files-from - - find _cache/nih_c -name ".ninja_deps" | tar rf cache_ignore.tar --files-from - - find _cache/nih_c -name ".ninja_log" | tar rf cache_ignore.tar --files-from - - find _cache/nih_c -name "*.log" | tar rf cache_ignore.tar --files-from - - find _cache/nih_c -name "*.tlog" | tar rf cache_ignore.tar --files-from - - # show .a files in the cache, for sanity checking - find _cache/nih_c -name "*.a" -ls -fi - -if [ -d _cache/ccache ] ; then - find _cache/ccache -name "stats" | tar rf cache_ignore.tar --files-from - -fi - -if [ -f cache_ignore.tar ] ; then - tar -tf cache_ignore.tar -fi -popd - - diff --git a/bin/debug_local_sign.js b/bin/debug_local_sign.js deleted file mode 100644 index 24f9aab48..000000000 --- a/bin/debug_local_sign.js +++ /dev/null @@ -1,64 +0,0 @@ -var ripple = require('ripple-lib'); - -var v = { - seed: "snoPBrXtMeMyMHUVTgbuqAfg1SUTb", - addr: "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" -}; - -var remote = ripple.Remote.from_config({ - "trusted" : true, - "websocket_ip" : "127.0.0.1", - "websocket_port" : 5006, - "websocket_ssl" : false, - "local_signing" : true -}); - -var tx_json = { - "Account" : v.addr, - "Amount" : "10000000", - "Destination" : "rEu2ULPiEQm1BAL8pYzmXnNX1aFX9sCks", - "Fee" : "10", - "Flags" : 0, - "Sequence" : 3, - "TransactionType" : "Payment" - - //"SigningPubKey": '0396941B22791A448E5877A44CE98434DB217D6FB97D63F0DAD23BE49ED45173C9' -}; - -remote.on('connected', function () { - var req = remote.request_sign(v.seed, tx_json); - req.message.debug_signing = true; - req.on('success', function (result) { - console.log("SERVER RESULT"); - console.log(result); - - var sim = {}; - var tx = remote.transaction(); - tx.tx_json = tx_json; - tx._secret = v.seed; - tx.complete(); - var unsigned = tx.serialize().to_hex(); - tx.sign(); - - sim.tx_blob = tx.serialize().to_hex(); - sim.tx_json = tx.tx_json; - sim.tx_signing_hash = tx.signing_hash().to_hex(); - sim.tx_unsigned = unsigned; - - console.log("\nLOCAL RESULT"); - console.log(sim); - - remote.connect(false); - }); - req.on('error', function (err) { - if (err.error === "remoteError" && err.remote.error === "srcActNotFound") { - console.log("Please fund account "+v.addr+" to run this test."); - } else { - console.log('error', err); - } - remote.connect(false); - }); - req.request(); - -}); -remote.connect(); diff --git a/bin/email_hash.js b/bin/email_hash.js deleted file mode 100755 index ab4f97c47..000000000 --- a/bin/email_hash.js +++ /dev/null @@ -1,18 +0,0 @@ -#!/usr/bin/node -// -// Returns a Gravatar style hash as per: http://en.gravatar.com/site/implement/hash/ -// - -if (3 != process.argv.length) { - process.stderr.write("Usage: " + process.argv[1] + " email_address\n\nReturns gravatar style hash.\n"); - process.exit(1); - -} else { - var md5 = require('crypto').createHash('md5'); - - md5.update(process.argv[2].trim().toLowerCase()); - - process.stdout.write(md5.digest('hex') + "\n"); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/flash_policy.js b/bin/flash_policy.js deleted file mode 100755 index e1361d46d..000000000 --- a/bin/flash_policy.js +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/node -// -// This program allows IE 9 ripple-clients to make websocket connections to -// rippled using flash. As IE 9 does not have websocket support, this required -// if you wish to support IE 9 ripple-clients. -// -// http://www.lightsphere.com/dev/articles/flash_socket_policy.html -// -// For better security, be sure to set the Port below to the port of your -// [websocket_public_port]. -// - -var net = require("net"), - port = "*", - domains = ["*:"+port]; // Domain:Port - -net.createServer( - function(socket) { - socket.write("\n"); - socket.write("\n"); - socket.write("\n"); - domains.forEach( - function(domain) { - var parts = domain.split(':'); - socket.write("\t\n"); - } - ); - socket.write("\n"); - socket.end(); - } -).listen(843); diff --git a/bin/getRippledInfo b/bin/getRippledInfo deleted file mode 100755 index abfa449ba..000000000 --- a/bin/getRippledInfo +++ /dev/null @@ -1,150 +0,0 @@ -#!/usr/bin/env bash - -# This script generates information about your rippled installation -# and system. It can be used to help debug issues that you may face -# in your installation. While this script endeavors to not display any -# sensitive information, it is recommended that you read the output -# before sharing with any third parties. - - -rippled_exe=/opt/ripple/bin/rippled -conf_file=/etc/opt/ripple/rippled.cfg - -while getopts ":e:c:" opt; do - case $opt in - e) - rippled_exe=${OPTARG} - ;; - c) - conf_file=${OPTARG} - ;; - \?) - echo "Invalid option: -$OPTARG" - exit -1 - esac -done - -tmp_loc=$(mktemp -d --tmpdir ripple_info.XXXXX) -chmod 751 ${tmp_loc} -awk_prog=${tmp_loc}/cfg.awk -summary_out=${tmp_loc}/rippled_info.md -printf "# rippled report info\n\n> generated at %s\n" "$(date -R)" > ${summary_out} - -function log_section { - printf "\n## %s\n" "$*" >> ${summary_out} - - while read -r l; do - echo " $l" >> ${summary_out} - done > ${awk_prog} - BEGIN {FS="[[:space:]]*=[[:space:]]*"; skip=0; db_path=""; print > OUT_FILE; split(exl,exa,"|")} - /^#/ {next} - save==2 && /^[[:space:]]*$/ {next} - /^\[.+\]$/ { - section=tolower(gensub(/^\[[[:space:]]*([a-zA-Z_]+)[[:space:]]*\]$/, "\\1", "g")) - skip = 0 - for (i in exa) { - if (section == exa[i]) - skip = 1 - } - if (section == "database_path") - save = 1 - } - skip==1 {next} - save==2 {save=0; db_path=$0} - save==1 {save=2} - $1 ~ /password/ {$0=$1"="} - {print >> OUT_FILE} - END {print db_path} -EOP - - db=$(\ - sed -r -e 's/\//g;s/^[[:space:]]*//;s/[[:space:]]*$//' ${conf_file} |\ - awk -v OUT_FILE=${cleaned_conf} -v exl="$(join_by '|' "${exclude[@]}")" -f ${awk_prog}) - rm ${awk_prog} - cat ${cleaned_conf} | log_section "cleaned config file" - rm ${cleaned_conf} - echo "${db}" | log_section "database path" - df ${db} | log_section "df: database" -fi - -# Send output from this script to a log file -## this captures any messages -## or errors from the script itself - -log_file=${tmp_loc}/get_info.log -exec 3>&1 1>>${log_file} 2>&1 - -## Send all stdout files to /tmp - -if [[ -x ${rippled_exe} ]] ; then - pgrep rippled && \ - ${rippled_exe} --conf ${conf_file} \ - -- server_info | log_section "server info" -fi - -cat /proc/meminfo | log_section "meminfo" -cat /proc/swaps | log_section "swap space" -ulimit -a | log_section "ulimit" - -if command -v lshw >/dev/null 2>&1 ; then - lshw 2>/dev/null | log_section "hardware info" -else - lscpu > ${tmp_loc}/hw_info.txt - hwinfo >> ${tmp_loc}/hw_info.txt - lspci >> ${tmp_loc}/hw_info.txt - lsblk >> ${tmp_loc}/hw_info.txt - cat ${tmp_loc}/hw_info.txt | log_section "hardware info" - rm ${tmp_loc}/hw_info.txt -fi - -if command -v iostat >/dev/null 2>&1 ; then - iostat -t -d -x 2 6 | log_section "iostat" -fi - -df -h | log_section "free disk space" -drives=($(df | awk '$1 ~ /^\/dev\// {print $1}' | xargs -n 1 basename)) -block_devs=($(ls /sys/block/)) -for d in "${drives[@]}"; do - for dev in "${block_devs[@]}"; do - #echo "D: [$d], DEV: [$dev]" - if [[ $d =~ $dev ]]; then - # this file (if exists) has 0 for SSD and 1 for HDD - if [[ "$(cat /sys/block/${dev}/queue/rotational 2>/dev/null)" == 0 ]] ; then - echo "${d} : SSD" >> ${tmp_loc}/is_ssd.txt - else - echo "${d} : NO SSD" >> ${tmp_loc}/is_ssd.txt - fi - fi - done -done - -if [[ -f ${tmp_loc}/is_ssd.txt ]] ; then - cat ${tmp_loc}/is_ssd.txt | log_section "SSD" - rm ${tmp_loc}/is_ssd.txt -fi - -cat ${log_file} | log_section "script log" - -cat << MSG | tee /dev/fd/3 -#################################################### - rippled info has been gathered. Please copy the - contents of ${summary_out} - to a github gist at https://gist.github.com/ - - PLEASE REVIEW THIS FILE FOR ANY SENSITIVE DATA - BEFORE POSTING! We have tried our best to omit - any sensitive information from this file, but you - should verify before posting. -#################################################### -MSG - diff --git a/bin/hexify.js b/bin/hexify.js deleted file mode 100755 index 1e2fb7000..000000000 --- a/bin/hexify.js +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/node -// -// Returns hex of lowercasing a string. -// - -var stringToHex = function (s) { - return Array.prototype.map.call(s, function (c) { - var b = c.charCodeAt(0); - - return b < 16 ? "0" + b.toString(16) : b.toString(16); - }).join(""); -}; - -if (3 != process.argv.length) { - process.stderr.write("Usage: " + process.argv[1] + " string\n\nReturns hex of lowercasing string.\n"); - process.exit(1); - -} else { - - process.stdout.write(stringToHex(process.argv[2].toLowerCase()) + "\n"); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/jsonrpc_request.js b/bin/jsonrpc_request.js deleted file mode 100755 index 0b9c08666..000000000 --- a/bin/jsonrpc_request.js +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/node -// -// This is a tool to issue JSON-RPC requests from the command line. -// -// This can be used to test a JSON-RPC server. -// -// Requires: npm simple-jsonrpc -// - -var jsonrpc = require('simple-jsonrpc'); - -var program = process.argv[1]; - -if (5 !== process.argv.length) { - console.log("Usage: %s ", program); -} -else { - var url = process.argv[2]; - var method = process.argv[3]; - var json_raw = process.argv[4]; - var json; - - try { - json = JSON.parse(json_raw); - } - catch (e) { - console.log("JSON parse error: %s", e.message); - throw e; - } - - var client = jsonrpc.client(url); - - client.call(method, json, - function (result) { - console.log(JSON.stringify(result, undefined, 2)); - }, - function (error) { - console.log(JSON.stringify(error, undefined, 2)); - }); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/jsonrpc_server.js b/bin/jsonrpc_server.js deleted file mode 100755 index 4cd3ffb95..000000000 --- a/bin/jsonrpc_server.js +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/node -// -// This is a tool to listen for JSON-RPC requests at an IP and port. -// -// This will report the request to console and echo back the request as the response. -// - -var http = require("http"); - -var program = process.argv[1]; - -if (4 !== process.argv.length) { - console.log("Usage: %s ", program); -} -else { - var ip = process.argv[2]; - var port = process.argv[3]; - - var server = http.createServer(function (req, res) { - console.log("CONNECT"); - var input = ""; - - req.setEncoding(); - - req.on('data', function (buffer) { - // console.log("DATA: %s", buffer); - input = input + buffer; - }); - - req.on('end', function () { - // console.log("END"); - - var json_req; - - console.log("URL: %s", req.url); - console.log("HEADERS: %s", JSON.stringify(req.headers, undefined, 2)); - - try { - json_req = JSON.parse(input); - - console.log("REQ: %s", JSON.stringify(json_req, undefined, 2)); - } - catch (e) { - console.log("BAD JSON: %s", e.message); - - json_req = { error : e.message } - } - - res.statusCode = 200; - res.end(JSON.stringify({ - jsonrpc: "2.0", - result: { request : json_req }, - id: req.id - })); - }); - - req.on('close', function () { - console.log("CLOSE"); - }); - }); - - server.listen(port, ip, undefined, - function () { - console.log("Listening at: %s:%s", ip, port); - }); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/rlint.js b/bin/rlint.js deleted file mode 100755 index ce12e9560..000000000 --- a/bin/rlint.js +++ /dev/null @@ -1,252 +0,0 @@ -#!/usr/bin/node - -var async = require('async'); -var Remote = require('ripple-lib').Remote; -var Transaction = require('ripple-lib').Transaction; -var UInt160 = require('ripple-lib').UInt160; -var Amount = require('ripple-lib').Amount; - -var book_key = function (book) { - return book.taker_pays.currency - + ":" + book.taker_pays.issuer - + ":" + book.taker_gets.currency - + ":" + book.taker_gets.issuer; -}; - -var book_key_cross = function (book) { - return book.taker_gets.currency - + ":" + book.taker_gets.issuer - + ":" + book.taker_pays.currency - + ":" + book.taker_pays.issuer; -}; - -var ledger_verify = function (ledger) { - var dir_nodes = ledger.accountState.filter(function (entry) { - return entry.LedgerEntryType === 'DirectoryNode' // Only directories - && entry.index === entry.RootIndex // Only root nodes - && 'TakerGetsCurrency' in entry; // Only offer directories - }); - - var books = {}; - - dir_nodes.forEach(function (node) { - var book = { - taker_gets: { - currency: UInt160.from_generic(node.TakerGetsCurrency).to_json(), - issuer: UInt160.from_generic(node.TakerGetsIssuer).to_json() - }, - taker_pays: { - currency: UInt160.from_generic(node.TakerPaysCurrency).to_json(), - issuer: UInt160.from_generic(node.TakerPaysIssuer).to_json() - }, - quality: Amount.from_quality(node.RootIndex), - index: node.RootIndex - }; - - books[book_key(book)] = book; - -// console.log(JSON.stringify(node, undefined, 2)); - }); - -// console.log(JSON.stringify(dir_entry, undefined, 2)); - console.log("#%s books: %s", ledger.ledger_index, Object.keys(books).length); - - Object.keys(books).forEach(function (key) { - var book = books[key]; - var key_cross = book_key_cross(book); - var book_cross = books[key_cross]; - - if (book && book_cross && !book_cross.done) - { - var book_cross_quality_inverted = Amount.from_json("1.0/1/1").divide(book_cross.quality); - - if (book_cross_quality_inverted.compareTo(book.quality) >= 0) - { - // Crossing books - console.log("crossing: #%s :: %s :: %s :: %s :: %s :: %s :: %s", ledger.ledger_index, key, book.quality.to_text(), book_cross.quality.to_text(), book_cross_quality_inverted.to_text(), - book.index, book_cross.index); - } - - book_cross.done = true; - } - }); - - var ripple_selfs = {}; - - var accounts = {}; - var counts = {}; - - ledger.accountState.forEach(function (entry) { - if (entry.LedgerEntryType === 'Offer') - { - counts[entry.Account] = (counts[entry.Account] || 0) + 1; - } - else if (entry.LedgerEntryType === 'RippleState') - { - if (entry.Flags & (0x10000 | 0x40000)) - { - counts[entry.LowLimit.issuer] = (counts[entry.LowLimit.issuer] || 0) + 1; - } - - if (entry.Flags & (0x20000 | 0x80000)) - { - counts[entry.HighLimit.issuer] = (counts[entry.HighLimit.issuer] || 0) + 1; - } - - if (entry.HighLimit.issuer === entry.LowLimit.issuer) - ripple_selfs[entry.Account] = entry; - } - else if (entry.LedgerEntryType == 'AccountRoot') - { - accounts[entry.Account] = entry; - } - }); - - var low = 0; // Accounts with too low a count. - var high = 0; - var missing_accounts = 0; // Objects with no referencing account. - var missing_objects = 0; // Accounts specifying an object but having none. - - Object.keys(counts).forEach(function (account) { - if (account in accounts) - { - if (counts[account] !== accounts[account].OwnerCount) - { - if (counts[account] < accounts[account].OwnerCount) - { - high += 1; - console.log("%s: high count %s/%s", account, counts[account], accounts[account].OwnerCount); - } - else - { - low += 1; - console.log("%s: low count %s/%s", account, counts[account], accounts[account].OwnerCount); - } - } - } - else - { - missing_accounts += 1; - - console.log("%s: missing : count %s", account, counts[account]); - } - }); - - Object.keys(accounts).forEach(function (account) { - if (!('OwnerCount' in accounts[account])) - { - console.log("%s: bad entry : %s", account, JSON.stringify(accounts[account], undefined, 2)); - } - else if (!(account in counts) && accounts[account].OwnerCount) - { - missing_objects += 1; - - console.log("%s: no objects : %s/%s", account, 0, accounts[account].OwnerCount); - } - }); - - if (low) - console.log("counts too low = %s", low); - - if (high) - console.log("counts too high = %s", high); - - if (missing_objects) - console.log("missing_objects = %s", missing_objects); - - if (missing_accounts) - console.log("missing_accounts = %s", missing_accounts); - - if (Object.keys(ripple_selfs).length) - console.log("RippleState selfs = %s", Object.keys(ripple_selfs).length); - -}; - -var ledger_request = function (remote, ledger_index, done) { - remote.request_ledger(undefined, { - accounts: true, - expand: true, - }) - .ledger_index(ledger_index) - .on('success', function (m) { - // console.log("ledger: ", ledger_index); - // console.log("ledger: ", JSON.stringify(m, undefined, 2)); - done(m.ledger); - }) - .on('error', function (m) { - console.log("error"); - done(); - }) - .request(); -}; - -var usage = function () { - console.log("rlint.js _websocket_ip_ _websocket_port_ "); -}; - -var finish = function (remote) { - remote.disconnect(); - - // XXX Because remote.disconnect() doesn't work: - process.exit(); -}; - -console.log("args: ", process.argv.length); -console.log("args: ", process.argv); - -if (process.argv.length < 4) { - usage(); -} -else { - var remote = Remote.from_config({ - websocket_ip: process.argv[2], - websocket_port: process.argv[3], - }) - .once('ledger_closed', function (m) { - console.log("ledger_closed: ", JSON.stringify(m, undefined, 2)); - - if (process.argv.length === 5) { - var ledger_index = process.argv[4]; - - ledger_request(remote, ledger_index, function (l) { - if (l) { - ledger_verify(l); - } - - finish(remote); - }); - - } else if (process.argv.length === 6) { - var ledger_start = Number(process.argv[4]); - var ledger_end = Number(process.argv[5]); - var ledger_cursor = ledger_end; - - async.whilst( - function () { - return ledger_start <= ledger_cursor && ledger_cursor <=ledger_end; - }, - function (callback) { - // console.log(ledger_cursor); - - ledger_request(remote, ledger_cursor, function (l) { - if (l) { - ledger_verify(l); - } - - --ledger_cursor; - - callback(); - }); - }, - function (error) { - finish(remote); - }); - - } else { - finish(remote); - } - }) - .connect(); -} - -// vim:sw=2:sts=2:ts=8:et diff --git a/bin/sh/install-vcpkg.sh b/bin/sh/install-vcpkg.sh deleted file mode 100755 index 8cf8f2d08..000000000 --- a/bin/sh/install-vcpkg.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env bash -set -exu - -: ${TRAVIS_BUILD_DIR:=""} -: ${VCPKG_DIR:=".vcpkg"} -export VCPKG_ROOT=${VCPKG_DIR} -: ${VCPKG_DEFAULT_TRIPLET:="x64-windows-static"} - -export VCPKG_DEFAULT_TRIPLET - -EXE="vcpkg" -if [[ -z ${COMSPEC:-} ]]; then - EXE="${EXE}.exe" -fi - -if [[ -d "${VCPKG_DIR}" && -x "${VCPKG_DIR}/${EXE}" && -d "${VCPKG_DIR}/installed" ]] ; then - echo "Using cached vcpkg at ${VCPKG_DIR}" - ${VCPKG_DIR}/${EXE} list -else - if [[ -d "${VCPKG_DIR}" ]] ; then - rm -rf "${VCPKG_DIR}" - fi - git clone --branch 2021.04.30 https://github.com/Microsoft/vcpkg.git ${VCPKG_DIR} - pushd ${VCPKG_DIR} - BSARGS=() - if [[ "$(uname)" == "Darwin" ]] ; then - BSARGS+=(--allowAppleClang) - fi - if [[ -z ${COMSPEC:-} ]]; then - chmod +x ./bootstrap-vcpkg.sh - time ./bootstrap-vcpkg.sh "${BSARGS[@]}" - else - time ./bootstrap-vcpkg.bat - fi - popd -fi - -# TODO: bring boost in this way as well ? -# NOTE: can pin specific ports to a commit/version like this: -# git checkout ports/boost -if [ $# -eq 0 ]; then - echo "No extra packages specified..." - PKGS=() -else - PKGS=( "$@" ) -fi -for LIB in "${PKGS[@]}"; do - time ${VCPKG_DIR}/${EXE} --clean-after-build install ${LIB} -done - - diff --git a/bin/sh/setup-msvc.sh b/bin/sh/setup-msvc.sh deleted file mode 100755 index 8d61c9757..000000000 --- a/bin/sh/setup-msvc.sh +++ /dev/null @@ -1,40 +0,0 @@ - -# NOTE: must be sourced from a shell so it can export vars - -cat << BATCH > ./getenv.bat -CALL %* -ENV -BATCH - -while read line ; do - IFS='"' read x path arg <<<"${line}" - if [ -f "${path}" ] ; then - echo "FOUND: $path" - export VCINSTALLDIR=$(./getenv.bat "${path}" ${arg} | grep "^VCINSTALLDIR=" | sed -E "s/^VCINSTALLDIR=//g") - if [ "${VCINSTALLDIR}" != "" ] ; then - echo "USING ${VCINSTALLDIR}" - export LIB=$(./getenv.bat "${path}" ${arg} | grep "^LIB=" | sed -E "s/^LIB=//g") - export LIBPATH=$(./getenv.bat "${path}" ${arg} | grep "^LIBPATH=" | sed -E "s/^LIBPATH=//g") - export INCLUDE=$(./getenv.bat "${path}" ${arg} | grep "^INCLUDE=" | sed -E "s/^INCLUDE=//g") - ADDPATH=$(./getenv.bat "${path}" ${arg} | grep "^PATH=" | sed -E "s/^PATH=//g") - export PATH="${ADDPATH}:${PATH}" - break - fi - fi -done <= 7 - -import argparse -import asyncio -import configparser -import contextlib -import json -import logging -import os -from pathlib import Path -import platform -import subprocess -import time -import urllib.error -import urllib.request - -# Enable asynchronous subprocesses on Windows. The default changed in 3.8. -# https://docs.python.org/3.7/library/asyncio-platforms.html#subprocess-support-on-windows -if (platform.system() == 'Windows' and sys.version_info.major == 3 - and sys.version_info.minor < 8): - asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy()) - -DEFAULT_EXE = 'rippled' -DEFAULT_CONFIGURATION_FILE = 'rippled.cfg' -# Number of seconds to wait before forcefully terminating. -PATIENCE = 120 -# Number of contiguous seconds in a sync state to be considered synced. -DEFAULT_SYNC_DURATION = 60 -# Number of seconds between polls of state. -DEFAULT_POLL_INTERVAL = 5 -SYNC_STATES = ('full', 'validating', 'proposing') - - -def read_config(config_file): - # strict = False: Allow duplicate keys, e.g. [rpc_startup]. - # allow_no_value = True: Allow keys with no values. Generally, these - # instances use the "key" as the value, and the section name is the key, - # e.g. [debug_logfile]. - # delimiters = ('='): Allow ':' as a character in Windows paths. Some of - # our "keys" are actually values, and we don't want to split them on ':'. - config = configparser.ConfigParser( - strict=False, - allow_no_value=True, - delimiters=('='), - ) - config.read(config_file) - return config - - -def to_list(value, separator=','): - """Parse a list from a delimited string value.""" - return [s.strip() for s in value.split(separator) if s] - - -def find_log_file(config_file): - """Try to figure out what log file the user has chosen. Raises all kinds - of exceptions if there is any possibility of ambiguity.""" - config = read_config(config_file) - values = list(config['debug_logfile'].keys()) - if len(values) < 1: - raise ValueError( - f'no [debug_logfile] in configuration file: {config_file}') - if len(values) > 1: - raise ValueError( - f'too many [debug_logfile] in configuration file: {config_file}') - return values[0] - - -def find_http_port(config_file): - config = read_config(config_file) - names = list(config['server'].keys()) - for name in names: - server = config[name] - if 'http' in to_list(server.get('protocol', '')): - return int(server['port']) - raise ValueError(f'no server in [server] for "http" protocol') - - -@contextlib.asynccontextmanager -async def rippled(exe=DEFAULT_EXE, config_file=DEFAULT_CONFIGURATION_FILE): - """A context manager for a rippled process.""" - # Start the server. - process = await asyncio.create_subprocess_exec( - str(exe), - '--conf', - str(config_file), - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - ) - logging.info(f'rippled started with pid {process.pid}') - try: - yield process - finally: - # Ask it to stop. - logging.info(f'asking rippled (pid: {process.pid}) to stop') - start = time.time() - process.terminate() - - # Wait nicely. - try: - await asyncio.wait_for(process.wait(), PATIENCE) - except asyncio.TimeoutError: - # Ask the operating system to kill it. - logging.warning(f'killing rippled ({process.pid})') - try: - process.kill() - except ProcessLookupError: - pass - - code = await process.wait() - end = time.time() - logging.info( - f'rippled stopped after {end - start:.1f} seconds with code {code}' - ) - - -async def sync( - port, - *, - duration=DEFAULT_SYNC_DURATION, - interval=DEFAULT_POLL_INTERVAL, -): - """Poll rippled on an interval until it has been synced for a duration.""" - start = time.perf_counter() - while (time.perf_counter() - start) < duration: - await asyncio.sleep(interval) - - request = urllib.request.Request( - f'http://127.0.0.1:{port}', - data=json.dumps({ - 'method': 'server_state' - }).encode(), - headers={'Content-Type': 'application/json'}, - ) - with urllib.request.urlopen(request) as response: - try: - body = json.loads(response.read()) - except urllib.error.HTTPError as cause: - logging.warning(f'server_state returned not JSON: {cause}') - start = time.perf_counter() - continue - - try: - state = body['result']['state']['server_state'] - except KeyError as cause: - logging.warning(f'server_state response missing key: {cause.key}') - start = time.perf_counter() - continue - logging.info(f'server_state: {state}') - if state not in SYNC_STATES: - # Require a contiguous sync state. - start = time.perf_counter() - - -async def loop(test, - *, - exe=DEFAULT_EXE, - config_file=DEFAULT_CONFIGURATION_FILE): - """ - Start-test-stop rippled in an infinite loop. - - Moves log to a different file after each iteration. - """ - log_file = find_log_file(config_file) - id = 0 - while True: - logging.info(f'iteration: {id}') - async with rippled(exe, config_file) as process: - start = time.perf_counter() - exited = asyncio.create_task(process.wait()) - tested = asyncio.create_task(test()) - # Try to sync as long as the process is running. - done, pending = await asyncio.wait( - {exited, tested}, - return_when=asyncio.FIRST_COMPLETED, - ) - if done == {exited}: - code = exited.result() - logging.warning( - f'server halted for unknown reason with code {code}') - else: - assert done == {tested} - assert tested.exception() is None - end = time.perf_counter() - logging.info(f'synced after {end - start:.0f} seconds') - os.replace(log_file, f'debug.{id}.log') - id += 1 - - -logging.basicConfig( - format='%(asctime)s %(levelname)-8s %(message)s', - level=logging.INFO, - datefmt='%Y-%m-%d %H:%M:%S', -) - -parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter) -parser.add_argument( - 'rippled', - type=Path, - nargs='?', - default=DEFAULT_EXE, - help='Path to rippled.', -) -parser.add_argument( - '--conf', - type=Path, - default=DEFAULT_CONFIGURATION_FILE, - help='Path to configuration file.', -) -parser.add_argument( - '--duration', - type=int, - default=DEFAULT_SYNC_DURATION, - help='Number of contiguous seconds required in a synchronized state.', -) -parser.add_argument( - '--interval', - type=int, - default=DEFAULT_POLL_INTERVAL, - help='Number of seconds to wait between polls of state.', -) -args = parser.parse_args() - -port = find_http_port(args.conf) - - -def test(): - return sync(port, duration=args.duration, interval=args.interval) - - -try: - asyncio.run(loop(test, exe=args.rippled, config_file=args.conf)) -except KeyboardInterrupt: - # Squelch the message. This is a normal mode of exit. - pass diff --git a/bin/stop-test.js b/bin/stop-test.js deleted file mode 100644 index 45aa15e27..000000000 --- a/bin/stop-test.js +++ /dev/null @@ -1,133 +0,0 @@ -/* -------------------------------- REQUIRES -------------------------------- */ - -var child = require("child_process"); -var assert = require("assert"); - -/* --------------------------------- CONFIG --------------------------------- */ - -if (process.argv[2] == null) { - [ - 'Usage: ', - '', - ' `node bin/stop-test.js i,j [rippled_path] [rippled_conf]`', - '', - ' Launch rippled and stop it after n seconds for all n in [i, j}', - ' For all even values of n launch rippled with `--fg`', - ' For values of n where n % 3 == 0 launch rippled with `--fg`\n', - 'Examples: ', - '', - ' $ node bin/stop-test.js 5,10', - (' $ node bin/stop-test.js 1,4 ' + - 'build/clang.debug/rippled $HOME/.confs/rippled.cfg') - ] - .forEach(function(l){console.log(l)}); - - process.exit(); -} else { - var testRange = process.argv[2].split(',').map(Number); - var rippledPath = process.argv[3] || 'build/rippled' - var rippledConf = process.argv[4] || 'rippled.cfg' -} - -var options = { - env: process.env, - stdio: 'ignore' // we could dump the child io when it fails abnormally -}; - -// default args -var conf_args = ['--conf='+rippledConf]; -var start_args = conf_args.concat([/*'--net'*/]) -var stop_args = conf_args.concat(['stop']); - -/* --------------------------------- HELPERS -------------------------------- */ - -function start(args) { - return child.spawn(rippledPath, args, options); -} -function stop(rippled) { child.execFile(rippledPath, stop_args, options)} -function secs_l8r(ms, f) {setTimeout(f, ms * 1000); } - -function show_results_and_exit(results) { - console.log(JSON.stringify(results, undefined, 2)); - process.exit(); -} - -var timeTakes = function (range) { - function sumRange(n) {return (n+1) * n /2} - var ret = sumRange(range[1]); - if (range[0] > 1) { - ret = ret - sumRange(range[0] - 1) - } - var stopping = (range[1] - range[0]) * 0.5; - return ret + stopping; -} - -/* ---------------------------------- TEST ---------------------------------- */ - -console.log("Test will take ~%s seconds", timeTakes(testRange)); - -(function oneTest(n /* seconds */, results) { - if (n >= testRange[1]) { - // show_results_and_exit(results); - console.log(JSON.stringify(results, undefined, 2)); - oneTest(testRange[0], []); - return; - } - - var args = start_args; - if (n % 2 == 0) {args = args.concat(['--fg'])} - if (n % 3 == 0) {args = args.concat(['--net'])} - - var result = {args: args, alive_for: n}; - results.push(result); - - console.log("\nLaunching `%s` with `%s` for %d seconds", - rippledPath, JSON.stringify(args), n); - - rippled = start(args); - console.log("Rippled pid: %d", rippled.pid); - - // defaults - var b4StopSent = false; - var stopSent = false; - var stop_took = null; - - rippled.once('exit', function(){ - if (!stopSent && !b4StopSent) { - console.warn('\nRippled exited itself b4 stop issued'); - process.exit(); - }; - - // The io handles close AFTER exit, may have implications for - // `stdio:'inherit'` option to `child.spawn`. - rippled.once('close', function() { - result.stop_took = (+new Date() - stop_took) / 1000; // seconds - console.log("Stopping after %d seconds took %s seconds", - n, result.stop_took); - oneTest(n+1, results); - }); - }); - - secs_l8r(n, function(){ - console.log("Stopping rippled after %d seconds", n); - - // possible race here ? - // seems highly unlikely, but I was having issues at one point - b4StopSent=true; - stop_took = (+new Date()); - // when does `exit` actually get sent? - stop(); - stopSent=true; - - // Sometimes we want to attach with a debugger. - if (process.env.ABORT_TESTS_ON_STALL != null) { - // We wait 30 seconds, and if it hasn't stopped, we abort the process - secs_l8r(30, function() { - if (result.stop_took == null) { - console.log("rippled has stalled"); - process.exit(); - }; - }); - } - }) -}(testRange[0], [])); \ No newline at end of file diff --git a/bin/update_binformat.js b/bin/update_binformat.js deleted file mode 100644 index 7987f72c8..000000000 --- a/bin/update_binformat.js +++ /dev/null @@ -1,119 +0,0 @@ -/** - * bin/update_bintypes.js - * - * This unholy abomination of a script generates the JavaScript file - * src/js/bintypes.js from various parts of the C++ source code. - * - * This should *NOT* be part of any automatic build process unless the C++ - * source data are brought into a more easily parseable format. Until then, - * simply run this script manually and fix as needed. - */ - -// XXX: Process LedgerFormats.(h|cpp) as well. - -var filenameProto = __dirname + '/../src/cpp/ripple/SerializeProto.h', - filenameTxFormatsH = __dirname + '/../src/cpp/ripple/TransactionFormats.h', - filenameTxFormats = __dirname + '/../src/cpp/ripple/TransactionFormats.cpp'; - -var fs = require('fs'); - -var output = []; - -// Stage 1: Get the field types and codes from SerializeProto.h -var types = {}, - fields = {}; -String(fs.readFileSync(filenameProto)).split('\n').forEach(function (line) { - line = line.replace(/^\s+|\s+$/g, '').replace(/\s+/g, ''); - if (!line.length || line.slice(0, 2) === '//' || line.slice(-1) !== ')') return; - - var tmp = line.slice(0, -1).split('('), - type = tmp[0], - opts = tmp[1].split(','); - - if (type === 'TYPE') types[opts[1]] = [opts[0], +opts[2]]; - else if (type === 'FIELD') fields[opts[0]] = [types[opts[1]][0], +opts[2]]; -}); - -output.push('var ST = require("./serializedtypes");'); -output.push(''); -output.push('var REQUIRED = exports.REQUIRED = 0,'); -output.push(' OPTIONAL = exports.OPTIONAL = 1,'); -output.push(' DEFAULT = exports.DEFAULT = 2;'); -output.push(''); - -function pad(s, n) { while (s.length < n) s += ' '; return s; } -function padl(s, n) { while (s.length < n) s = ' '+s; return s; } - -Object.keys(types).forEach(function (type) { - output.push(pad('ST.'+types[type][0]+'.id', 25) + ' = '+types[type][1]+';'); -}); -output.push(''); - -// Stage 2: Get the transaction type IDs from TransactionFormats.h -var ttConsts = {}; -String(fs.readFileSync(filenameTxFormatsH)).split('\n').forEach(function (line) { - var regex = /tt([A-Z_]+)\s+=\s+([0-9-]+)/; - var match = line.match(regex); - if (match) ttConsts[match[1]] = +match[2]; -}); - -// Stage 3: Get the transaction formats from TransactionFormats.cpp -var base = [], - sections = [], - current = base; -String(fs.readFileSync(filenameTxFormats)).split('\n').forEach(function (line) { - line = line.replace(/^\s+|\s+$/g, '').replace(/\s+/g, ''); - - var d_regex = /DECLARE_TF\(([A-Za-z]+),tt([A-Z_]+)/; - var d_match = line.match(d_regex); - - var s_regex = /SOElement\(sf([a-z]+),SOE_(REQUIRED|OPTIONAL|DEFAULT)/i; - var s_match = line.match(s_regex); - - if (d_match) sections.push(current = [d_match[1], ttConsts[d_match[2]]]); - else if (s_match) current.push([s_match[1], s_match[2]]); -}); - -function removeFinalComma(arr) { - arr[arr.length-1] = arr[arr.length-1].slice(0, -1); -} - -output.push('var base = ['); -base.forEach(function (field) { - var spec = fields[field[0]]; - output.push(' [ '+ - pad("'"+field[0]+"'", 21)+', '+ - pad(field[1], 8)+', '+ - padl(""+spec[1], 2)+', '+ - 'ST.'+pad(spec[0], 3)+ - ' ],'); -}); -removeFinalComma(output); -output.push('];'); -output.push(''); - - -output.push('exports.tx = {'); -sections.forEach(function (section) { - var name = section.shift(), - ttid = section.shift(); - - output.push(' '+name+': ['+ttid+'].concat(base, ['); - section.forEach(function (field) { - var spec = fields[field[0]]; - output.push(' [ '+ - pad("'"+field[0]+"'", 21)+', '+ - pad(field[1], 8)+', '+ - padl(""+spec[1], 2)+', '+ - 'ST.'+pad(spec[0], 3)+ - ' ],'); - }); - removeFinalComma(output); - output.push(' ]),'); -}); -removeFinalComma(output); -output.push('};'); -output.push(''); - -console.log(output.join('\n')); - diff --git a/cfg/genesis.json b/cfg/genesis.json index 45eda37ed..fe7bdb445 100644 --- a/cfg/genesis.json +++ b/cfg/genesis.json @@ -4,13 +4,13 @@ "accountState": [ { "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", - "Balance": "100000000000000000", + "Balance": "100000000000000", "Flags": 0, "LedgerEntryType": "AccountRoot", "OwnerCount": 0, "PreviousTxnID": "A92EF82C3C68F771927E3892A2F708F12CBD492EF68A860F042E4053C8EC6C8D", - "PreviousTxnLgrSeq": 3, - "Sequence": 4, + "PreviousTxnLgrSeq": 0, + "Sequence": 1, "index": "2B6AC232AA4C4BE41BF49D2459FA4A0347E1B543A4C92FCEE0821C0201E2E9A8" }, { @@ -31,6 +31,7 @@ "C4483A1896170C66C098DEA5B0E024309C60DC960DE5F01CD7AF986AA3D9AD37", "8F81B066ED20DAECA20DF57187767685EEF3980B228E0667A650BAF24426D3B4", "621A0B264970359869E3C0363A899909AAB7A887C8B73519E4ECF952D33258A8", + "30CD365592B8EE40489BA01AE2F7555CAC9C983145871DC82A42A31CF5BAE7D9", "89308AF3B8B10B7192C4E613E1D2E4D9BA64B2EE2D5232402AE82A6A7220D953", "00C1FC4A53E60AB02C864641002B3172F38677E29C26C5406685179B37E1EDAC", "25BA44241B3BD880770BFA4DA21C7180576831855368CBEC6A3154FDE4A7676E", @@ -44,7 +45,7 @@ "98DECF327BF79997AEC178323AD51A830E457BFC6D454DAF3E46E5EC42DC619F", "B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856", "32A122F1352A4C7B3A6D790362CC34749C5E57FCE896377BFDC6CCD14F6CD627", - "F1ED6B4A411D8B872E65B9DCB4C8B100375B0DD3D62D07192E011D6D7F339013", + "DF8B4536989BDACE3F934F29423848B9F1D76D09BE6A1FCFE7E7F06AA26ABEAD", "75A7E01C505DD5A179DFE3E000A9B6F1EDDEB55A12F95579A23E15B15DC8BE5A", "47C3002ABA31628447E8E9A8B315FAA935CE30183F9A9B86845E469CA2CDC3DF", "93E516234E35E08CA689FA33A6D38E103881F8DCB53023F728C307AA89D515A7", @@ -55,34 +56,180 @@ "42F8B586B357ABBAAAA1C733C3E7D3B75761395340D0CDF600179E8737E22478", "919857E4B902A20216E4819B9BD9FD1FD19A66ECF63151C18A4C48C873DB9578", "ECF412BE0964EC2E71DCF807EEEA6EA8470D3DB15173D46F28AB6E234860AC32", + "F5751842D26FC057B92CAA435ABF4F1428C2BCC4180D18775ADE92CB2643BBA3", + "D686F2538F410C9D0D856788E98E3579595DAF7B38D38887F81ECAC934B06040", "86E83A7D2ECE3AD5FA87AB2195AE015C950469ABF0B72EAACED318F74886AE90", "3C43D9A973AA4443EF3FC38E42DD306160FBFFDAB901CD8BAA15D09F2597EB87", "0285B7E5E08E1A8E4C15636F0591D87F73CB6A7B6452A932AD72BBC8E5D1CBE3", + "6E739F4F8B07BED29FC9FF440DA3C301CD14A180DF45819F658FEC2F7DE31427", "36799EA497B1369B170805C078AEFE6188345F9B3E324C21E9CA3FF574E3C3D6" ], "Flags": 0, "LedgerEntryType": "Amendments", "index": "7DB0788C020F02780A673DC74757F23823FA3014C1866E72CC4CD8B226CD6EF4" + }, + { + "BaseFee": "A", + "Flags": 0, + "LedgerEntryType": "FeeSettings", + "ReferenceFeeUnits": 10, + "ReserveBase": 1000000, + "ReserveIncrement": 200000, + "AccountCount": 0, + "XahauActivationLgrSeq": 0, + "index": "4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A651" + }, + { + "CreateCode": "0061736D0100000001610E60017F017E60027F7F017F6000017E60037F7F7E017E60037F7F7F017E60027F7F017E60047F7F7F7F017E60037E7F7F017E60017E017E60037E7E7F017E60097F7F7F7F7F7F7F7F7F017E60027F7E017E60027E7E017E60057F7F7F7F7F017E02DE031D03656E760C6574786E5F72657365727665000003656E76025F67000103656E76096F74786E5F74797065000203656E7606616363657074000303656E760A6F74786E5F6669656C64000403656E760C686F6F6B5F6163636F756E74000503656E76057374617465000603656E7608726F6C6C6261636B000303656E7609666C6F61745F696E74000703656E760A666C6F61745F7369676E000803656E7609666C6F61745F6F6E65000203656E760D666C6F61745F636F6D70617265000903656E760B7574696C5F6B65796C6574000A03656E7608736C6F745F736574000403656E760D736C6F745F7375626669656C64000403656E7604736C6F74000403656E76106C65646765725F6C6173745F74696D65000203656E760974726163655F6E756D000303656E760A6C65646765725F736571000203656E7609666C6F61745F736574000B03656E760C666C6F61745F646976696465000C03656E760E666C6F61745F6D756C7469706C79000C03656E76096F74786E5F736C6F74000003656E760A736C6F745F666C6F6174000003656E760A736C6F745F636F756E74000003656E76057472616365000D03656E760C6574786E5F64657461696C73000503656E760D6574786E5F6665655F62617365000503656E7604656D697400060302010005030100020608017F0141A093040B07080104686F6F6B001D0AEB8E0001E78E0002027F067E230041E03E6B22002400410110001A4101410110011A100242E200520440419E10411E42EA0010031A0B200041C03E6A41144181802010041A200041A03E6A411410051A20002903A03E20002903C03E510440024020002802B03E20002802D03E4720002903A83E20002903C83E52720D0041BC10411D42F60010031A0B0B200042D5AA81AAE2F4F5E5D3003703983E2000428080AAE3FA95CF84D6003703903E200041983E6A410841D910410210061A200041903E6A410841DC10410210061A024020002903983E420159044020002903903E22034200550D010B41DF10412C42820110071A20002903903E21030B0240200341004100100822034200590440024020002903983E10094200520D0020002903983E100A4104100B4200520D0020002903903E100A4102100B500D020B0B418B1141CD0042890110071A0B200041E03D6A220241224103200041C03E6A41144100410041004100100C1A200241224101100D1A410141E4800C4102100E420252044041D811412142940110031A0B410141E380084103100E1A410141E480084104100E1A4101418280184105100E1A410141E280084106100E1A410041004106100F2104101020047D22042003530440418E10418E102D0000200320047D220342C0843D7F420A81A76A3A0000418F10418F102D0000200342A08D067F420A81A76A3A00004190104190102D000020034290CE007F420A81A76A3A00004191104191102D0000200342E8077F420A81A76A3A00004192104192102D0000200342E4007F420A81A76A3A00004193104193102D00002003420A7F2204420A81A76A3A00004194104194102D000020032004420A7E7DA76A3A0000418010411E42AD0110071A0B410041004102100F2103410041004103100F2104410041004104100F2105410041004105100F210641F911410B200310111A4185124105200410111A418B124104200510111A2004420159410020054200551B450440419012411B42BC0110071A0B101220047D22044200570440419012411B42C40110071A0B1012210741AB124103200642C0FFFFFFFFFFFFFF1F83220642C0843D80220810111A41F911410B200310111A41F911410B2003200720057D220520087E420020054200551B4200200642BF843D561B7C220310111A41002003101322034200570440419012411B42D90110071A0B41002004101322044200570440419012411B42DC0110071A0B200320041014210341AF12410A20002903983E20031015220310111A200341064101100822034214802104410A1016420A520440419012411B42EA0110071A0B410A41888018410B100E420B520440419012411B42ED0110071A0B410B101722054201590440200541064101100820037C21030B41AA0F20033C000041A90F20034208883C000041A80F20034210883C000041A70F20034218883C000041A60F20034220883C000041A50F20034228883C000041A40F20034230883C000041A30F2003423888A7413F7141C000723A000041F10941C00F29030037030041D90941A80F29030037030041D10941A00F29030037030041DE0941144181802010041A41AA0F20043C000041A90F20044208883C000041A80F20044210883C000041A70F20044218883C000041A60F20044220883C000041A50F20044228883C000041A40F20044230883C000041A30F2004423888A741C000723A000041F309210141D00F41224101100D42015104400240410141DF803C4101100E4201520D00200041306A41843C4101100F4201530D00200041003A00004101101822034280012003428001541B2104200041D7006A2101420021030340419D8280807841810110011A200320045A45044041BA12410420014114410110191A200041012001411410064201510440024020002D0000220241144B0D00200041C03C6A20024103746A42013703000B0B2001413C6A2101200342017C21030C010B0B41F309210141002102034041A882808078411510011A200020023A002F200241FF017141134B2001419B0F4F720D01200041C03C6A20002D002F22024103746A29030050450440200141A00F290300370300200141A80F290300370308200141C00F290300370320200141226A20012001410D6A41142000412F6A410110064214511B210120002D002F21020B200241016A21020C000B000B0B200141F1013A000041DB0841F400101A1A419A08418008200141FF076B2202101B22034238862003423888423F8384200342288642808080808080C0FF0083842003421886428080808080E03F838420034208864280808080F01F8384200342088842808080F80F83842003421888428080FC07838420034228884280FE03838442C000843703004198081012220442057C22033C0000419208200442017C22043C000041970820034208883C000041960820034210883C000041950820034218883C000041910820044208883C000041900820044210883C0000418F0820044218883C000041BE1241064180082002410110191A41C412410B200041204180082002101C220310111A2003427F57044041D012411E42D80210071A0B41EE12412942DB0210031A200041E03E6A240020030B0BBB0407004180080B2412006022800000002400000000201A00000000201B0000000068400000000000000073210041C5080B168114B5F762798A53D543A014CAF8B297CFF8F2F937E80041CF090B02F0600041A00F0B0DE06061000000000000000083140041C10F0B31E10000000000004D43000000000000005261E32E7A24A238F1C619D5F9DDCC41A94B33B66C0163F7EFCC8A19C9FD6F28DC004180100B1D596F75206D75737420776169742030303030303030207365636F6E647300419E100BF8025265776172643A2050617373696E67206E6F6E2D636C61696D2074786E005265776172643A2050617373696E67206F7574676F696E672074786E005252005244005265776172643A2052657761726473206172652064697361626C656420627920676F7665726E616E63652E005265776172643A205265776172647320696E636F72726563746C7920636F6E6669677572656420627920676F7665726E616E6365206F7220756E7265636F76657261626C65206572726F722E005265776172643A2050617373696E67207265776172642073657475702074786E00616363756D756C61746F72006669727374006C617374005265776172643A20417373657274696F6E206661696C7572652E0062616C0078666C5F7265776172640061763A00656D69743A00656D69745F726573756C74005265776172643A20456D6974206C6F6F706261636B206661696C65642E005265776172643A20456D6974746564207265776172642074786E207375636365737366756C6C792E", + "Fee": "8620", + "Flags": 0, + "HookApiVersion": 0, + "HookHash": "610F33B8EBF7EC795F822A454FB852156AEFE50BE0CB8326338A81CD74801864", + "HookNamespace": "0000000000000000000000000000000000000000000000000000000000000000", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFBFFFFF", + "HookParameters": [], + "HookSetTxnID": "6B4BE82F808A27CF7AFA27394D98BF5A9AC2AF33CF02B3F6274A8A04B1A3762F", + "LedgerEntryType": "HookDefinition", + "ReferenceCount": "1", + "index": "052BCC5B9525C99521AFD9E1A4AAFCE1A517C648560702CD3120EC4BC3A1E78F" + }, + { + "CreateCode": "0061736D0100000001420960027F7F017F60017F017E60047F7F7F7F017E60037F7F7E017E6000017E60037F7F7F017E60027F7F017E60057F7F7F7F7F017E60097F7F7F7F7F7F7F7F7F017E02DE021603656E76025F67000003656E760C6574786E5F72657365727665000103656E760A6F74786E5F706172616D000203656E760974726163655F6E756D000303656E76096F74786E5F74797065000403656E7606616363657074000303656E760A6F74786E5F6669656C64000503656E760C686F6F6B5F6163636F756E74000603656E76057472616365000703656E76057374617465000203656E760A686F6F6B5F706172616D000203656E7608726F6C6C6261636B000303656E760973746174655F736574000203656E760A6C65646765725F736571000403656E760C6574786E5F64657461696C73000603656E760D6574786E5F6665655F62617365000603656E7604656D6974000203656E760B7574696C5F6B65796C6574000803656E7608736C6F745F736574000503656E760D736C6F745F7375626669656C64000503656E760D736C6F745F7375626172726179000503656E7604736C6F7400050302010105030100020608017F0141C09B040B07080104686F6F6B00160AE9AE0001E5AE0003097F057E027C230041B00A6B220024004101410110001A410110011A20004180016A410241940841011002420251044041960841062000310081012000310080014208868410031A0B100442E300520440419C0841CC0042810110051A0B200041900A6A410C72220241144181802010061A200041F0096A410C722208411410071A024020002903FC09220B200029039C0A510440200028028C0A20002802AC0A4720002903840A20002903A40A52720D0120004180016A41144183802010064214510440024020002903FC0920002903800151044020002903840A200029038801510440200028028C0A200028029001460D020B0B41E8084121428F0110051A0B0B20002903FC09210B0B0B027F418008290300200B510440200028028C0A4190082802004720002903840A4188082903005272450440410121034189090C020B0B41BC090B413341004100410010081A4100410041EF0941021009220B427B51044020004190096A410141F2094103100A427F57044041F609413A42A301100B1A0B41B00A410320003100900910031A20004190096A410141EF094102100C420057044041B40A411A42A701100B1A0B41CE0A410C20002D0090092206AD42FF0183220B10031A20002D009009220145044041DB0A412E42AE01100B1A20002D00900921010B200141FF017141154F044041890B413D42B101100B1A0B200304400240200041B0096A410841C60B4103100A427F57044041CA0B413942B601100B1A0B200041206A410841830C4103100A427F57044041870C413742B901100B1A0B200029032050044041BE0C412E42BC01100B1A0B200041B0096A410841EC0C4102100C420057044041B40A411A42BF01100B1A0B200041206A410841EF0C4102100C4200550D0041B40A411A42C201100B1A0B0B41002101034041C581808078411510001A0240200020013A000020002D0000220120064F0D00200020013A0052200041C9A6013B005020004180016A4114200041D0006A4103100A421452044041F20C413F42CA01100B1A0B41B10D410820004180016A22014114410110081A2001411420004101100C421452044041B40A411A42D001100B1A0B2000410120004180016A4114100C420152044041B40A411A42D401100B1A0B20002D000041016A21010C010B0B41B90D412A42D70110051A0B41CE0A410C200B10031A41004100200241141009427F57044041E30D41C50042E301100B1A0B200041EE096A410241A80E41011002210A20002D00EE092102200020002D00EF0922013A00ED090240200A42025104400240200241C8006B2206410B4B0D004101200674418118710D020B0B41AA0E413D42F201100B1A20002D00ED0921010B0240200241D300460440200141144F044041E70E413042F601100B1A41002106410121040C020B0B200241C8004604402001410B4F044041970F412F42F901100B1A41012104410121060C020B0B200241C80046210641012104200241D200470D0041002104200141C40046200141D20046720D0041C60F413C42FC01100B1A0B200041013A00EC0920034504400240200041EC096A410141821041011002420152044041841041C100428402100B1A0B41C510410120003100EC0910031A20002D00EC09220141016B41FF017141024F044041C7104130428902100B1A20002D00EC0921010B20014102472004720D0041F71041C500428D02100B1A0B0B4120412041144108200241D300461B20061B22016B220541FC01712207200041B0096A6A2204200141BC11410110022001AD220A52044041BE1141C300429B02100B1A0B41002106024020002903B00950044020002903B80942005220002903C009420052720D0120002903C8095021060B0B4181124110200041B0096A22094138410110081A419112410F2005AD42FF018310031A41A012410C200A10031A41AC12410C20042001410110081A200020023A00910A200041D6003A00900A200020002D00ED093A00920A200020002D00EC093A00930A20004190096A220520076A2001200041900A6A41201009210C41B812411420054120410110081A41CC12410B20094120410110081A41D7124114200C10031A41EB12410B200A10031A200A200C510440024020002903900920002903B0095220002903980920002903B809527220002903A00920002903C0095220002903A80920002903C8095272720D0041F612413F42BB0210051A0B0B20042001200041900A6A4120100C200A52044041B40A411A42C202100B1A0B41002105200C42015904400240200020023A009109200041C3003A009009200041003A008001200020002D00ED093A009209200020002D00EC093A00930920004180016A410120004190096A41201009420152044041B40A411A42CF02100B1A0B20002D008001220545044041B40A411A42D002100B1A20002D00800121050B2000200541016B22073A00800120004180016A4100200741FF017122071B200741004720004190096A4120100C427F550D0041B40A411A42D402100B1A0B0B200041003A008F0920002903B009210A200041C3003A00B009200020002D00EC093A00B309200020002D00ED093A00B209200020023A00B1092000418F096A22074101200041B0096A2209412010091A200020002D008F0941016A3A008F092007410120094120100C420057044041B40A411A42E402100B1A0B2000200A3703B00941B513410F2006AD220E10031A41C5134105200031008F0910031A41CE0A410C200B10031A41CB134106200041EE096A4102410110081A200BB9220F4452B81E85EB51E03FA222109944000000000000E04363047E2010B005428080808080808080807F0B210A2003417F7320002D00EC09410247712107200F449A9999999999E93FA2220F9944000000000000E04363047E200FB005428080808080808080807F0B210C024020070440200031008F09210C200A4202200A4202551B220D2005AD42FF01835704400240200C200D590D00418A14412E41004100410010081A4201210A0C030B0B4200210A200C200D590D0141B8144135428F0310051A054200210A200031008F09200C4202200C4202551B200B200241D300461B590D0141D113413942870310051A0B0B41ED14411141FF144110410010081A20002D00EC09410147200372450440100D210C2000419E016A4280808080B08EC0C014370000200041E880013B009901200041A0363B009301200041A0343B008D012000410036008901200041243A00880120004292808C938210370380012000410036009B012000200CA7220541056A22033A009801200020034108763A009701200020034110763A009601200020034118763A0095012000200541016A22033A009201200020034108763A009101200020034110763A009001200020034118763A008F01200020002903FC093703A60120004183293B01BA01200020002903840A3703AE012000200028028C0A3602B60120004180082903003703BC0120004188082903003703C40120004190082802003602CC01200041D0016A2203418004100EA720036A220341F0B208360208200342F0A780BF818EC680D4003703002003410B6A20023A0000200341166A20013A0000200341156A41193A00002003410D6A42E1C1DF8087A380ABF0003703002003410C6A20002D00ED093A0000200341176A2103200A5004402003200429030037030020032004290308370308200341106A2004290310370300200341186A20042903183703000B200120036A220341E1E3033B0100200320004180016A22036B2105200020032005100F220A3C00A101200041E8003A0099012000200A4208883C00A0012000200A4210883C009F012000200A4218883C009E012000200A4220883C009D012000200A4228883C009C012000200A4230883C009B012000200A423888A7413F7141C000723A009A01418F15412220032005410110081A41B1154118200041206A4120200320051010220A10031A200A422051044041C915412A42E40310051A0B41F315412542E603100B1A0B02400240200241D2006B220341014D044020034101460D01419816410620042001200041EE096A4102100C220A10031A200A420057044041B40A411A42F003100B1A0B20002D00ED0941D200460440419F16412942F20310051A0B41C816412A42F40310051A05200241C800470D020B200041D0006A22014122410120084114410041004100410010111A20014122410510121A4105418B803C410610131A410620002D00ED0941071014420751044002404107419F8014410810134208520D0020004180016A412041081015422052044041B40A411A428B04100B1A0B20002903800120002903B0095220002903880120002903B809527220002903900120002903C0095220002903980120002903C8095272720D0041F216413D428F0410051A0B0B20064504400240200041D0006A220141224118200041B0096A4120410041004100410010111A20014122410910124209510D0041AF1741C300429A04100B1A0B0B200041206A20002D00ED094102746A417F200041B0096A20061B360200100D210A2000411410071A2000419E016A4280808080B08EC0C014370000200041E880013B009901200041A0363B009301200041A0343B008D012000410036008901200041243A0088012000429280D8908210370380012000410036009B012000200AA7220241056A22013A009801200020014108763A009701200020014110763A009601200020014118763A0095012000200241016A22013A009201200020014108763A009101200020014110763A009001200020014118763A008F01200020002903003703A601200020002903083703AE01200020002802103602B601200041BA016A220141C607100EA720016A220141FBDD033B0000200141026A210120002802202202044020014122360000200141046A41013A0000200141066A2104200141056A21012002417F47047F200141D03E3B0000200120022903003703022001200229030837030A200120022903103703122001200229031837031A200441216A05200141FB003B0000200441016A0B21010B200141E1013A000020002802242102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1013A000020002802282102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1013A0000200028022C2102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1013A000020002802302102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1013A000020002802342102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1013A000020002802382102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1013A0000200028023C2102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1013A000020002802402102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1013A000020002802442102200141EE013A00012002047F200141013A0006200141223600022002417F47047F200141D03E3B000720012002290300370309200120022903083703112001200229031037031920012002290318370321200141296A05200141FB003B0007200141096A0B05200141026A0B220141E1E3033B0000200120004180016A22016B41026A2102200020012002100F220A3C00A101200041E8003A0099012000200A4208883C00A0012000200A4210883C009F012000200A4218883C009E012000200A4220883C009D012000200A4228883C009C012000200A4230883C009B012000200A423888A7413F7141C000723A009A0141F217410B20012002410110081A41FD17410B20004120200120021010220A10031A200A4220520440418918412F42B504100B1A0B41B818410F20004120410110081A41C718411B42B80410051A0B20004180016A410C7222034114200041ED096A41011009220A421451044041E218411420004180016A4120410110081A0B200041B0096A410C722102200029038C0120002903BC095104400240200028029C0120002802CC094720002903940120002903C40952720D0041F61841CD0042C70410051A0B0B41004100200241141009220C423F88A74101732101200C420059044041C319413041004100410010081A0B2001200A4214522205410274200641017472722204AD210D200441036B220841044D044002400240200841016B0E03010101000B41B40A411A42D304100B1A0B0B41F3194102200D10031A41F61941022005AD10031A41F8194102200E10031A41FA1941022001AD10031A0240200441016B220141034D044002400240200141026B0E020300010B200B42017C210B0C020B200B42017D210B0B0B41FC194110200A421451AD10031A41B513410F200E10031A41CE0A410C200B10031A200B420157044041B40A411A42F504100B1A0B2000200B3C0020200041206A410141EF094102100C420152044041B40A411A42F804100B1A0B200C420059044002402000200C3C002041004100200041206A4101100C5045044041B40A411A428205100B1A0B4100410020024114100C500D0041B40A411A428505100B1A0B0B200A42145104400240200041D6003A008001410121010340418E85808078412110001A024020014120460D00200041D20041C80041D3002001410C4922041B20014102491B3A008101200041C40041FE0141F40120041B20016A20014101461B3A008201200041206A412020004180016A412010094220510440200041C3003A0020200041003A0050200020002F0081013B0021200041D0006A4101200041206A41201009420151044020002D0050220441014B04402000200441016B3A0050200041D0006A4101200041206A4120100C420152044041B40A411A42AB05100B1A0B41AA1A4118200031005010031A0541004100200041206A4120100C5045044041B40A411A42A505100B1A0B418D1A411D200031005010031A0B0B4100410020004180016A4120100C5045044041B40A411A42B105100B1A0B41C21A4113200041206A4120410110081A0B200141016A21010C010B0B41004100200041ED096A4101100C5045044041B40A411A42B805100B1A0B4100410020034114100C500D0041B40A411A42BB05100B1A0B0B2006450440024020024114200041ED096A4101100C421452044041B40A411A42C205100B1A0B200041ED096A410120024114100C4201510D0041B40A411A42C505100B1A0B0B41D51A412242C80510051A0B41F71A412242CC05100B1A200041B00A6A2400200B0B0BA61302004180080B14B5F762798A53D543A014CAF8B297CFF8F2F937E8004194080B841344004442474C4E00476F7665726E616E63653A2050617373696E67206E6F6E2D496E766F6B652074786E2E20486F6F6B4F6E2073686F756C64206265206368616E67656420746F2061766F696420746869732E00476F766572616E63653A2050617373696E67206F7574676F696E672074786E2E00476F7665726E616E63653A205374617274696E6720676F7665726E616E6365206C6F676963206F6E204C31207461626C652E00476F7665726E616E63653A205374617274696E6720676F7665726E616E6365206C6F676963206F6E204C32207461626C652E004D4300494D4300476F7665726E616E63653A20496E697469616C204D656D62657220436F756E7420506172616D65746572206D697373696E672028494D43292E00696D6300476F7665726E3A20417373657274696F6E206661696C65642E006D656D6265725F636F756E7400476F7665726E616E63653A20496E697469616C204D656D62657220436F756E74206D757374206265203E20302E00476F7665726E616E63653A20496E697469616C204D656D62657220436F756E74206D757374206265203C3D205365617420436F756E7420283230292E0049525200476F7665726E616E63653A20496E697469616C20526577617264205261746520506172616D65746572206D697373696E672028495252292E0049524400476F7665726E616E63653A20496E697469616C205265776172642044656C617920506172616D65746572206D6973732028495244292E00476F7665726E616E63653A20496E697469616C205265776172642044656C6179206D757374206265203E20302E00525200524400476F7665726E616E63653A204F6E65206F72206D6F726520696E697469616C206D656D626572206163636F756E742049442773206973206D697373696E67004D656D6265723A00476F7665726E616E63653A20536574757020636F6D706C65746564207375636365737366756C6C792E00476F7665726E616E63653A20596F7520617265206E6F742063757272656E746C79206120676F7665726E616E6365206D656D6265722061742074686973207461626C652E005400476F7665726E616E63653A2056616C696420544F504943206D75737420626520737065636966696564206173206F74786E20706172616D657465722E00476F7665726E616E63653A2056616C6964207365617420746F70696373206172652030207468726F7567682031392E00476F7665726E616E63653A2056616C696420686F6F6B20746F70696373206172652030207468726F75676820392E00476F7665726E616E63653A2056616C69642072657761726420746F706963732061726520522028726174652920616E642044202864656C6179292E004C00476F7665726E616E63653A204D697373696E67204C20706172616D657465722E205768696368206C617965722061726520796F7520766F74696E6720666F723F006C00476F7665726E616E63653A204C6179657220706172616D65746572206D75737420626520273127206F72202732272E00476F7665726E616E63653A204C32732063616E6E6F7420766F7465206F6E2052522F5244206174204C322C2064696420796F75206D65616E20746F20736574204C3D313F005600476F7665726E616E63653A204D697373696E67206F7220696E636F72726563742073697A65206F6620564F5445206461746120666F7220544F50494320747970652E00746F7069635F646174615F7261773A00746F7069635F70616464696E673A00746F7069635F73697A653A00746F7069635F646174613A0070726576696F75735F746F7069635F6461746100746F7069635F646174610070726576696F75735F746F7069635F73697A6500746F7069635F73697A6500476F7665726E616E63653A20596F757220766F746520697320616C7265616479206361737420746869732077617920666F72207468697320746F7069632E00746F7069635F646174615F7A65726F00766F74657300746F70696300476F7665726E616E63653A20566F7465207265636F72642E204E6F742079657420656E6F75676820766F74657320746F20616374696F6E2E00476F7665726E616E63653A204D616A6F72697479206C6F73742C20756E646F696E67204C3120766F74652E2E2E00476F7665726E616E63653A204E6F742079657420656E6F75676820766F74657320746F20616374696F6E204C3120766F74652E2E0022416374696F6E696E6720766F7465732200416374696F6E696E6720766F74657300476F7665726E616E63653A20456D697474696E6720696E766F6B6520746F204C3100476F7665726E616E63653A20456D697420726573756C7400476F7665726E616E63653A205375636365737366756C6C7920656D6974746564204C3120766F74652E00476F7665726E616E63653A204C3120766F746520656D697373696F6E206661696C65642E00726573756C7400476F7665726E616E63653A205265776172642072617465206368616E676520616374696F6E65642100476F7665726E616E63653A205265776172642064656C6179206368616E676520616374696F6E65642100476F766572616E63653A2054617267657420686F6F6B20697320616C7265616479207468652073616D6520617320616374696F6E656420686F6F6B2E00476F766572616E63653A20486F6F6B204861736820646F65736E2774206578697374206F6E206C6564676572207768696C6520616374696F6E696E6720686F6F6B2E00456D697474656454786E00656D69745F726573756C7400476F7665726E616E63653A20456D6974206661696C656420647572696E6720686F6F6B20616374696F6E696E672E00456D697474656454786E4861736800476F7665726E616E63653A20486F6F6B20616374696F6E65642E0050726576696F75732070726573656E743D3D3A00476F7665726E616E63653A20416374696F6E696E672073656174206368616E67652C20627574207365617420616C726561647920636F6E7461696E7320746865206E6577206D656D6265722E00476F7665726E616E63653A204D6F76696E67206578697374696E67206D656D62657220746F206E657720736561742E006F700045005A004D0070726576696F75735F70726573656E740044656372656D656E7420766F746520636F756E742064656C657465640044656372656D656E7420766F746520636F756E7420746F00566F746520656E7472792064656C6574656400476F7665726E616E63653A20416374696F6E206D656D626572206368616E67652E00476F7665726E616E63653A20496E7465726E616C206C6F676963206572726F722E", + "Fee": "9603", + "Flags": 0, + "HookApiVersion": 0, + "HookHash": "78CA3F5BD3D4F7B32A6BEBB3844380A9345C9BA496EFEB30314BDDF405D7B4B3", + "HookNamespace": "0000000000000000000000000000000000000000000000000000000000000000", + "HookOn": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFBFFFFF", + "HookParameters": [ + { + "HookParameter": { + "HookParameterName": "495252", + "HookParameterValue": "80780D25A6D7CB53" + } + }, + { + "HookParameter": { + "HookParameterName": "495244", + "HookParameterValue": "0080C6A47E8D0355" + } + }, + { + "HookParameter": { + "HookParameterName": "495300", + "HookParameterValue": "AE123A8556F3CF91154711376AFB0F894F832B3D" + } + }, + { + "HookParameter": { + "HookParameterName": "495301", + "HookParameterValue": "F51DFC2A09D62CBBA1DFBDD4691DAC96AD98B90F" + } + }, + { + "HookParameter": { + "HookParameterName": "495302", + "HookParameterValue": "B389FBCED0AF9DCDFF62900BFAEFA3EB872D8A96" + } + }, + { + "HookParameter": { + "HookParameterName": "495303", + "HookParameterValue": "AA266540F7DACC27E264B75ED0A5ED7330BFB614" + } + }, + { + "HookParameter": { + "HookParameterName": "495304", + "HookParameterValue": "D91B8EE5C7ABF632469D4C0907C5E40C8B8F79B3" + } + }, + { + "HookParameter": { + "HookParameterName": "494D43", + "HookParameterValue": "05" + } + } + ], + "HookSetTxnID": "6B4BE82F808A27CF7AFA27394D98BF5A9AC2AF33CF02B3F6274A8A04B1A3762F", + "LedgerEntryType": "HookDefinition", + "ReferenceCount": "4", + "index": "7AF044D5C3658518E1AE02D4597C15B65E5F5C7AC2D1E770EF4DA46058475ED8" + }, + { + "Flags": 0, + "Indexes": [ + "469372BEE8814EC52CA2AECB5374AB57A47B53627E3C0E2ACBE3FDC78DBFEC7B" + ], + "LedgerEntryType": "DirectoryNode", + "Owner": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "RootIndex": "D8120FC732737A2CF2E9968FDF3797A43B457F2A81AA06D2653171A1EA635204", + "index": "D8120FC732737A2CF2E9968FDF3797A43B457F2A81AA06D2653171A1EA635204" + }, + { + "Account": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh", + "Flags": 0, + "Hooks": [ + { + "Hook": { + "HookHash": "78CA3F5BD3D4F7B32A6BEBB3844380A9345C9BA496EFEB30314BDDF405D7B4B3" + } + }, + { + "Hook": { + "HookHash": "610F33B8EBF7EC795F822A454FB852156AEFE50BE0CB8326338A81CD74801864" + } + }, + { + "Hook": {} + }, + { + "Hook": {} + }, + { + "Hook": {} + }, + { + "Hook": {} + }, + { + "Hook": {} + }, + { + "Hook": {} + }, + { + "Hook": {} + }, + { + "Hook": {} + } + ], + "LedgerEntryType": "Hook", + "OwnerNode": "0", + "PreviousTxnID": "6B4BE82F808A27CF7AFA27394D98BF5A9AC2AF33CF02B3F6274A8A04B1A3762F", + "PreviousTxnLgrSeq": 6869678, + "index": "469372BEE8814EC52CA2AECB5374AB57A47B53627E3C0E2ACBE3FDC78DBFEC7B" } ], "account_hash": "5DF3A98772FB73E782B8740E87885C6BAD9BA486422E3626DEF968AD2CB2C514", "close_flags": 0, - "close_time": 733708800, - "close_time_human": "2023-Apr-02 00:00:00.000000", + "close_time": 0, + "close_time_human": "2000-Jan-01 00:00:00.000000", "close_time_resolution": 10, "closed": true, "hash": "56DA0940767AC2F17F0E384F04816002403D0756432B9D503DDA20128A2AAF11", "ledger_hash": "56DA0940767AC2F17F0E384F04816002403D0756432B9D503DDA20128A2AAF11", - "ledger_index": "5", - "parent_close_time": 733708800, + "ledger_index": "1", + "parent_close_time": 0, "parent_hash": "56DA0940767AC2F17F0E384F04816002403D0756432B9D503DDA20128A2AAF11", - "seqNum": "5", - "totalCoins": "100000000000000000", - "total_coins": "100000000000000000", + "seqNum": "1", + "totalCoins": "100000000000000", + "total_coins": "100000000000000", "transaction_hash": "9A77D1D1A4B36DA77B9C4DC63FDEB8F821741D157802F9C42A6ED86003D8B4A0", "transactions": [] }, - "ledger_current_index": 5, + "ledger_current_index": 1, "status": "success", "validated": true } \ No newline at end of file diff --git a/cfg/initdb.sh b/cfg/initdb.sh deleted file mode 100755 index 9ca02ed56..000000000 --- a/cfg/initdb.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -# Execute this script with a running Postgres server on the current host. -# It should work with the most generic installation of Postgres, -# and is necessary for rippled to store data in Postgres. - -# usage: sudo -u postgres ./initdb.sh -psql -c "CREATE USER rippled" -psql -c "CREATE DATABASE rippled WITH OWNER = rippled" - diff --git a/cfg/rippled-standalone.cfg b/cfg/rippled-standalone.cfg index 8963b027a..79c5c9004 100755 --- a/cfg/rippled-standalone.cfg +++ b/cfg/rippled-standalone.cfg @@ -127,13 +127,20 @@ B6B3EEDC0267AB50491FDC450A398AF30DBCD977CECED8BEF2499CAB5DAC19E2 fixRmSmallIncre 98DECF327BF79997AEC178323AD51A830E457BFC6D454DAF3E46E5EC42DC619F CheckCashMakesTrustLine B2A4DB846F0891BF2C76AB2F2ACC8F5B4EC64437135C6E56F3F859DE5FFD5856 ExpandedSignerList 32A122F1352A4C7B3A6D790362CC34749C5E57FCE896377BFDC6CCD14F6CD627 NonFungibleTokensV1_1 +DF8B4536989BDACE3F934F29423848B9F1D76D09BE6A1FCFE7E7F06AA26ABEAD fixRemoveNFTokenAutoTrustLine +75A7E01C505DD5A179DFE3E000A9B6F1EDDEB55A12F95579A23E15B15DC8BE5A ImmediateOfferKilled +47C3002ABA31628447E8E9A8B315FAA935CE30183F9A9B86845E469CA2CDC3DF DisallowIncoming +93E516234E35E08CA689FA33A6D38E103881F8DCB53023F728C307AA89D515A7 XRPFees 2E2FB9CF8A44EB80F4694D38AADAE9B8B7ADAFD2F092E10068E61C98C4F092B0 fixUniversalNumber 73761231F7F3D94EC3D8C63D91BDD0D89045C6F71B917D1925C01253515A6669 fixNonFungibleTokensV1_2 AE35ABDEFBDE520372B31C957020B34A7A4A9DC3115A69803A44016477C84D6E fixNFTokenRemint -ECF412BE0964EC2E71DCF807EEEA6EA8470D3DB15173D46F28AB6E234860AC32 Hooks +ECE6819DBA5DB528F1A241695F5A9811EF99467CDE22510954FD357780BBD078 Hooks 42F8B586B357ABBAAAA1C733C3E7D3B75761395340D0CDF600179E8737E22478 BalanceRewards 919857E4B902A20216E4819B9BD9FD1FD19A66ECF63151C18A4C48C873DB9578 PaychanAndEscrowForTokens ECF412BE0964EC2E71DCF807EEEA6EA8470D3DB15173D46F28AB6E234860AC32 URIToken +F5751842D26FC057B92CAA435ABF4F1428C2BCC4180D18775ADE92CB2643BBA3 Import +6E739F4F8B07BED29FC9FF440DA3C301CD14A180DF45819F658FEC2F7DE31427 XahauGenesis +D686F2538F410C9D0D856788E98E3579595DAF7B38D38887F81ECAC934B06040 HooksUpdate1 86E83A7D2ECE3AD5FA87AB2195AE015C950469ABF0B72EAACED318F74886AE90 CryptoConditionsSuite 3C43D9A973AA4443EF3FC38E42DD306160FBFFDAB901CD8BAA15D09F2597EB87 NonFungibleTokensV1 0285B7E5E08E1A8E4C15636F0591D87F73CB6A7B6452A932AD72BBC8E5D1CBE3 fixNFTokenDirV1 diff --git a/cfg/validators-example.txt b/cfg/validators-example.txt index 8f7c04729..6c2314ebd 100644 --- a/cfg/validators-example.txt +++ b/cfg/validators-example.txt @@ -42,6 +42,15 @@ # ED2677ABFFD1B33AC6FBC3062B71F1E8397C1505E1C42C64D11AD1B28FF73F4734 # ED307A760EE34F2D0CAA103377B1969117C38B8AA0AA1E2A24DAC1F32FC97087ED # +# [import_vl_keys] +# +# This section is used to import the public keys of trusted validator list publishers. +# The keys are used to authenticate and accept new lists of trusted validators. +# In this example, the key for the publisher "vl.xrplf.org" is imported. +# Each key is represented as a hexadecimal string. +# +# Examples: +# ED2677ABFFD1B33AC6FBC3062B71F1E8397C1505E1C42C64D11AD1B28FF73F4734 # The default validator list publishers that the rippled instance # trusts. @@ -62,6 +71,10 @@ ED2677ABFFD1B33AC6FBC3062B71F1E8397C1505E1C42C64D11AD1B28FF73F4734 # vl.xrplf.org ED45D1840EE724BE327ABE9146503D5848EFD5F38B6D5FEDE71E80ACCE5E6E738B +[import_vl_keys] +# vl.xrplf.org +ED2677ABFFD1B33AC6FBC3062B71F1E8397C1505E1C42C64D11AD1B28FF73F4734 + # To use the test network (see https://xrpl.org/connect-your-rippled-to-the-xrp-test-net.html), # use the following configuration instead: # @@ -70,3 +83,6 @@ ED45D1840EE724BE327ABE9146503D5848EFD5F38B6D5FEDE71E80ACCE5E6E738B # # [validator_list_keys] # ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860 +# +# [import_vl_keys] +# ED264807102805220DA0F312E71FC2C69E1552C9C5790F6C25E3729DEB573D5860 diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index dfa99ba6a..000000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -# Use the official image as a parent image. -FROM centos - -# Set the working directory. -WORKDIR /opt/xrpld-hooks/ - -# Copy the file from your host to your current location. -COPY docker/screenrc /root/.screenrc -COPY docker/wasm2wat /usr/bin/ -COPY rippled . -COPY testnet.cfg . -COPY testnetvalidators.txt . -COPY docker/libboost/libboost_coroutine.so.1.70.0 /usr/lib/ -COPY docker/libboost/libboost_context.so.1.70.0 /usr/lib -COPY docker/libboost/libboost_filesystem.so.1.70.0 /usr/lib -COPY docker/libboost/libboost_program_options.so.1.70.0 /usr/lib -COPY docker/libboost/libboost_regex.so.1.70.0 /usr/lib -COPY docker/libboost/libboost_system.so.1.70.0 /usr/lib -COPY docker/libboost/libboost_thread.so.1.70.0 /usr/lib -COPY docker/libboost/libboost_chrono.so.1.70.0 /usr/lib -COPY docker/libboost/libboost_date_time.so.1.70.0 /usr/lib -COPY docker/libboost/libboost_atomic.so.1.70.0 /usr/lib -COPY docker/js/ ./ -# Run the command inside your image filesystem. -RUN dnf install epel-release -y -RUN yum install -y vim screen python3-setuptools-wheel python3-pip-wheel python3 python3-pip curl make nodejs -RUN curl https://cmake.org/files/v3.17/cmake-3.17.1-Linux-x86_64.sh --output cmake-3.17.1-Linux-x86_64.sh \ - && mkdir /opt/cmake \ - && printf "y\nn\n" | sh cmake-3.17.1-Linux-x86_64.sh --prefix=/opt/cmake > /dev/null \ - && ln -s /opt/cmake/bin/cmake /usr/local/bin/cmake -RUN curl https://raw.githubusercontent.com/wasienv/wasienv/master/install.sh | sh -RUN echo 'PATH=$PATH:/root/.wasienv/bin/' >> /root/.bash_rc -RUN rm -f cmake-3.17.1-Linux-x86_64.sh -RUN mkdir /etc/opt/ripple -RUN ln -s /opt/xrpld-hooks/testnet.cfg /etc/opt/ripple/rippled.cfg -RUN ln -s /opt/xrpld-hooks/testnetvalidators.txt /etc/opt/ripple/testnetvalidators.txt - -# Add metadata to the image to describe which port the container is listening on at runtime. -EXPOSE 6005 -EXPOSE 5005 - -# Run the specified command within the container. -CMD ./rippled --conf testnet.cfg --net >> log 2>> log diff --git a/docker/build_docker_xrpllabs.sh b/docker/build_docker_xrpllabs.sh deleted file mode 100755 index 2caa7b342..000000000 --- a/docker/build_docker_xrpllabs.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -cp -r ../hook-api-examples docker/js #docker doesnt like symlinks? -/usr/bin/cp /root/wabt/bin/wasm2wat docker/ -docker build --tag xrpllabsofficial/xrpld-hooks-testnet:latest . && docker create xrpllabsofficial/xrpld-hooks-testnet -rm -rf docker/js -docker push xrpllabsofficial/xrpld-hooks-testnet:latest diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index b3ee85720..000000000 --- a/docs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -html -temp -out.txt diff --git a/docs/0001-negative-unl/README.md b/docs/0001-negative-unl/README.md deleted file mode 100644 index 606b30aab..000000000 --- a/docs/0001-negative-unl/README.md +++ /dev/null @@ -1,597 +0,0 @@ -# Negative UNL Engineering Spec - -## The Problem Statement - -The moment-to-moment health of the XRP Ledger network depends on the health and -connectivity of a small number of computers (nodes). The most important nodes -are validators, specifically ones listed on the unique node list -([UNL](#Question-What-are-UNLs)). Ripple publishes a recommended UNL that most -network nodes use to determine which peers in the network are trusted. Although -most validators use the same list, they are not required to. The XRP Ledger -network progresses to the next ledger when enough validators reach agreement -(above the minimum quorum of 80%) about what transactions to include in the next -ledger. - -As an example, if there are 10 validators on the UNL, at least 8 validators have -to agree with the latest ledger for it to become validated. But what if enough -of those validators are offline to drop the network below the 80% quorum? The -XRP Ledger network favors safety/correctness over advancing the ledger. Which -means if enough validators are offline, the network will not be able to validate -ledgers. - -Unfortunately validators can go offline at any time for many different reasons. -Power outages, network connectivity issues, and hardware failures are just a few -scenarios where a validator would appear "offline". Given that most of these -events are temporary, it would make sense to temporarily remove that validator -from the UNL. But the UNL is updated infrequently and not every node uses the -same UNL. So instead of removing the unreliable validator from the Ripple -recommended UNL, we can create a second negative UNL which is stored directly on -the ledger (so the entire network has the same view). This will help the network -see which validators are **currently** unreliable, and adjust their quorum -calculation accordingly. - -*Improving the liveness of the network is the main motivation for the negative UNL.* - -### Targeted Faults - -In order to determine which validators are unreliable, we need clearly define -what kind of faults to measure and analyze. We want to deal with the faults we -frequently observe in the production network. Hence we will only monitor for -validators that do not reliably respond to network messages or send out -validations disagreeing with the locally generated validations. We will not -target other byzantine faults. - -To track whether or not a validator is responding to the network, we could -monitor them with a “heartbeat” protocol. Instead of creating a new heartbeat -protocol, we can leverage some existing protocol messages to mimic the -heartbeat. We picked validation messages because validators should send one and -only one validation message per ledger. In addition, we only count the -validation messages that agree with the local node's validations. - -With the negative UNL, the network could keep making forward progress safely -even if the number of remaining validators gets to 60%. Say we have a network -with 10 validators on the UNL and everything is operating correctly. The quorum -required for this network would be 8 (80% of 10). When validators fail, the -quorum required would be as low as 6 (60% of 10), which is the absolute -***minimum quorum***. We need the absolute minimum quorum to be strictly greater -than 50% of the original UNL so that there cannot be two partitions of -well-behaved nodes headed in different directions. We arbitrarily choose 60% as -the minimum quorum to give a margin of safety. - -Consider these events in the absence of negative UNL: -1. 1:00pm - validator1 fails, votes vs. quorum: 9 >= 8, we have quorum -1. 3:00pm - validator2 fails, votes vs. quorum: 8 >= 8, we have quorum -1. 5:00pm - validator3 fails, votes vs. quorum: 7 < 8, we don’t have quorum - * **network cannot validate new ledgers with 3 failed validators** - -We're below 80% agreement, so new ledgers cannot be validated. This is how the -XRP Ledger operates today, but if the negative UNL was enabled, the events would -happen as follows. (Please note that the events below are from a simplified -version of our protocol.) - -1. 1:00pm - validator1 fails, votes vs. quorum: 9 >= 8, we have quorum -1. 1:40pm - network adds validator1 to negative UNL, quorum changes to ceil(9 * 0.8), or 8 -1. 3:00pm - validator2 fails, votes vs. quorum: 8 >= 8, we have quorum -1. 3:40pm - network adds validator2 to negative UNL, quorum changes to ceil(8 * 0.8), or 7 -1. 5:00pm - validator3 fails, votes vs. quorum: 7 >= 7, we have quorum -1. 5:40pm - network adds validator3 to negative UNL, quorum changes to ceil(7 * 0.8), or 6 -1. 7:00pm - validator4 fails, votes vs. quorum: 6 >= 6, we have quorum - * **network can still validate new ledgers with 4 failed validators** - -## External Interactions - -### Message Format Changes -This proposal will: -1. add a new pseudo-transaction type -1. add the negative UNL to the ledger data structure. - -Any tools or systems that rely on the format of this data will have to be -updated. - -### Amendment -This feature **will** need an amendment to activate. - -## Design - -This section discusses the following topics about the Negative UNL design: - -* [Negative UNL protocol overview](#Negative-UNL-Protocol-Overview) -* [Validator reliability measurement](#Validator-Reliability-Measurement) -* [Format Changes](#Format-Changes) -* [Negative UNL maintenance](#Negative-UNL-Maintenance) -* [Quorum size calculation](#Quorum-Size-Calculation) -* [Filter validation messages](#Filter-Validation-Messages) -* [High level sequence diagram of code - changes](#High-Level-Sequence-Diagram-of-Code-Changes) - -### Negative UNL Protocol Overview - -Every ledger stores a list of zero or more unreliable validators. Updates to the -list must be approved by the validators using the consensus mechanism that -validators use to agree on the set of transactions. The list is used only when -checking if a ledger is fully validated. If a validator V is in the list, nodes -with V in their UNL adjust the quorum and V’s validation message is not counted -when verifying if a ledger is fully validated. V’s flow of messages and network -interactions, however, will remain the same. - -We define the ***effective UNL** = original UNL - negative UNL*, and the -***effective quorum*** as the quorum of the *effective UNL*. And we set -*effective quorum = Ceiling(80% * effective UNL)*. - -### Validator Reliability Measurement - -A node only measures the reliability of validators on its own UNL, and only -proposes based on local observations. There are many metrics that a node can -measure about its validators, but we have chosen ledger validation messages. -This is because every validator shall send one and only one signed validation -message per ledger. This keeps the measurement simple and removes -timing/clock-sync issues. A node will measure the percentage of agreeing -validation messages (*PAV*) received from each validator on the node's UNL. Note -that the node will only count the validation messages that agree with its own -validations. - -We define the **PAV** as the **P**ercentage of **A**greed **V**alidation -messages received for the last N ledgers, where N = 256 by default. - -When the PAV drops below the ***low-water mark***, the validator is considered -unreliable, and is a candidate to be disabled by being added to the negative -UNL. A validator must have a PAV higher than the ***high-water mark*** to be -re-enabled. The validator is re-enabled by removing it from the negative UNL. In -the implementation, we plan to set the low-water mark as 50% and the high-water -mark as 80%. - -### Format Changes - -The negative UNL component in a ledger contains three fields. -* ***NegativeUNL***: The current negative UNL, a list of unreliable validators. -* ***ToDisable***: The validator to be added to the negative UNL on the next - flag ledger. -* ***ToReEnable***: The validator to be removed from the negative UNL on the - next flag ledger. - -All three fields are optional. When the *ToReEnable* field exists, the -*NegativeUNL* field cannot be empty. - -A new pseudo-transaction, ***UNLModify***, is added. It has three fields -* ***Disabling***: A flag indicating whether the modification is to disable or - to re-enable a validator. -* ***Seq***: The ledger sequence number. -* ***Validator***: The validator to be disabled or re-enabled. - -There would be at most one *disable* `UNLModify` and one *re-enable* `UNLModify` -transaction per flag ledger. The full machinery is described further on. - -### Negative UNL Maintenance - -The negative UNL can only be modified on the flag ledgers. If a validator's -reliability status changes, it takes two flag ledgers to modify the negative -UNL. Let's see an example of the algorithm: - -* Ledger seq = 100: A validator V goes offline. -* Ledger seq = 256: This is a flag ledger, and V's reliability measurement *PAV* - is lower than the low-water mark. Other validators add `UNLModify` - pseudo-transactions `{true, 256, V}` to the transaction set which goes through - the consensus. Then the pseudo-transaction is applied to the negative UNL - ledger component by setting `ToDisable = V`. -* Ledger seq = 257 ~ 511: The negative UNL ledger component is copied from the - parent ledger. -* Ledger seq=512: This is a flag ledger, and the negative UNL is updated - `NegativeUNL = NegativeUNL + ToDisable`. - -The negative UNL may have up to `MaxNegativeListed = floor(original UNL * 25%)` -validators. The 25% is because of 75% * 80% = 60%, where 75% = 100% - 25%, 80% -is the quorum of the effective UNL, and 60% is the absolute minimum quorum of -the original UNL. Adding more than 25% validators to the negative UNL does not -improve the liveness of the network, because adding more validators to the -negative UNL cannot lower the effective quorum. - -The following is the detailed algorithm: - -* **If** the ledger seq = x is a flag ledger - - 1. Compute `NegativeUNL = NegativeUNL + ToDisable - ToReEnable` if they - exist in the parent ledger - - 1. Try to find a candidate to disable if `sizeof NegativeUNL < MaxNegativeListed` - - 1. Find a validator V that has a *PAV* lower than the low-water - mark, but is not in `NegativeUNL`. - - 1. If two or more are found, their public keys are XORed with the hash - of the parent ledger and the one with the lowest XOR result is chosen. - - 1. If V is found, create a `UNLModify` pseudo-transaction - `TxDisableValidator = {true, x, V}` - - 1. Try to find a candidate to re-enable if `sizeof NegativeUNL > 0`: - - 1. Find a validator U that is in `NegativeUNL` and has a *PAV* higher - than the high-water mark. - - 1. If U is not found, try to find one in `NegativeUNL` but not in the - local *UNL*. - - 1. If two or more are found, their public keys are XORed with the hash - of the parent ledger and the one with the lowest XOR result is chosen. - - 1. If U is found, create a `UNLModify` pseudo-transaction - `TxReEnableValidator = {false, x, U}` - - 1. If any `UNLModify` pseudo-transactions are created, add them to the - transaction set. The transaction set goes through the consensus algorithm. - - 1. If have enough support, the `UNLModify` pseudo-transactions remain in the - transaction set agreed by the validators. Then the pseudo-transactions are - applied to the ledger: - - 1. If have `TxDisableValidator`, set `ToDisable=TxDisableValidator.V`. - Else clear `ToDisable`. - - 1. If have `TxReEnableValidator`, set - `ToReEnable=TxReEnableValidator.U`. Else clear `ToReEnable`. - -* **Else** (not a flag ledger) - - 1. Copy the negative UNL ledger component from the parent ledger - -The negative UNL is stored on each ledger because we don't know when a validator -may reconnect to the network. If the negative UNL was stored only on every flag -ledger, then a new validator would have to wait until it acquires the latest -flag ledger to know the negative UNL. So any new ledgers created that are not -flag ledgers copy the negative UNL from the parent ledger. - -Note that when we have a validator to disable and a validator to re-enable at -the same flag ledger, we create two separate `UNLModify` pseudo-transactions. We -want either one or the other or both to make it into the ledger on their own -merits. - -Readers may have noticed that we defined several rules of creating the -`UNLModify` pseudo-transactions but did not describe how to enforce the rules. -The rules are actually enforced by the existing consensus algorithm. Unless -enough validators propose the same pseudo-transaction it will not be included in -the transaction set of the ledger. - -### Quorum Size Calculation - -The effective quorum is 80% of the effective UNL. Note that because at most 25% -of the original UNL can be on the negative UNL, the quorum should not be lower -than the absolute minimum quorum (i.e. 60%) of the original UNL. However, -considering that different nodes may have different UNLs, to be safe we compute -`quorum = Ceiling(max(60% * original UNL, 80% * effective UNL))`. - -### Filter Validation Messages - -If a validator V is in the negative UNL, it still participates in consensus -sessions in the same way, i.e. V still follows the protocol and publishes -proposal and validation messages. The messages from V are still stored the same -way by everyone, used to calculate the new PAV for V, and could be used in -future consensus sessions if needed. However V's ledger validation message is -not counted when checking if the ledger is fully validated. - -### High Level Sequence Diagram of Code Changes - -The diagram below is the sequence of one round of consensus. Classes and -components with non-trivial changes are colored green. - -* The `ValidatorList` class is modified to compute the quorum of the effective - UNL. - -* The `Validations` class provides an interface for querying the validation - messages from trusted validators. - -* The `ConsensusAdaptor` component: - - * The `RCLConsensus::Adaptor` class is modified for creating `UNLModify` - Pseudo-Transactions. - - * The `Change` class is modified for applying `UNLModify` - Pseudo-Transactions. - - * The `Ledger` class is modified for creating and adjusting the negative UNL - ledger component. - - * The `LedgerMaster` class is modified for filtering out validation messages - from negative UNL validators when verifying if a ledger is fully - validated. - -![Sequence diagram](./negativeUNL_highLevel_sequence.png?raw=true "Negative UNL - Changes") - - -## Roads Not Taken - -### Use a Mechanism Like Fee Voting to Process UNLModify Pseudo-Transactions - -The previous version of the negative UNL specification used the same mechanism -as the [fee voting](https://xrpl.org/fee-voting.html#voting-process.) for -creating the negative UNL, and used the negative UNL as soon as the ledger was -fully validated. However the timing of fully validation can differ among nodes, -so different negative UNLs could be used, resulting in different effective UNLs -and different quorums for the same ledger. As a result, the network's safety is -impacted. - -This updated version does not impact safety though operates a bit more slowly. -The negative UNL modifications in the *UNLModify* pseudo-transaction approved by -the consensus will take effect at the next flag ledger. The extra time of the -256 ledgers should be enough for nodes to be in sync of the negative UNL -modifications. - -### Use an Expiration Approach to Re-enable Validators - -After a validator disabled by the negative UNL becomes reliable, other -validators explicitly vote for re-enabling it. An alternative approach to -re-enable a validator is the expiration approach, which was considered in the -previous version of the specification. In the expiration approach, every entry -in the negative UNL has a fixed expiration time. One flag ledger interval was -chosen as the expiration interval. Once expired, the other validators must -continue voting to keep the unreliable validator on the negative UNL. The -advantage of this approach is its simplicity. But it has a requirement. The -negative UNL protocol must be able to vote multiple unreliable validators to be -disabled at the same flag ledger. In this version of the specification, however, -only one unreliable validator can be disabled at a flag ledger. So the -expiration approach cannot be simply applied. - -### Validator Reliability Measurement and Flag Ledger Frequency - -If the ledger time is about 4.5 seconds and the low-water mark is 50%, then in -the worst case, it takes 48 minutes *((0.5 * 256 + 256 + 256) * 4.5 / 60 = 48)* -to put an offline validator on the negative UNL. We considered lowering the flag -ledger frequency so that the negative UNL can be more responsive. We also -considered decoupling the reliability measurement and flag ledger frequency to -be more flexible. In practice, however, their benefits are not clear. - - -## New Attack Vectors - -A group of malicious validators may try to frame a reliable validator and put it -on the negative UNL. But they cannot succeed. Because: - -1. A reliable validator sends a signed validation message every ledger. A -sufficient peer-to-peer network will propagate the validation messages to other -validators. The validators will decide if another validator is reliable or not -only by its local observation of the validation messages received. So an honest -validator’s vote on another validator’s reliability is accurate. - -1. Given the votes are accurate, and one vote per validator, an honest validator -will not create a UNLModify transaction of a reliable validator. - -1. A validator can be added to a negative UNL only through a UNLModify -transaction. - -Assuming the group of malicious validators is less than the quorum, they cannot -frame a reliable validator. - -## Summary - -The bullet points below briefly summarize the current proposal: - -* The motivation of the negative UNL is to improve the liveness of the network. - -* The targeted faults are the ones frequently observed in the production - network. - -* Validators propose negative UNL candidates based on their local measurements. - -* The absolute minimum quorum is 60% of the original UNL. - -* The format of the ledger is changed, and a new *UNLModify* pseudo-transaction - is added. Any tools or systems that rely on the format of these data will have - to be updated. - -* The negative UNL can only be modified on the flag ledgers. - -* At most one validator can be added to the negative UNL at a flag ledger. - -* At most one validator can be removed from the negative UNL at a flag ledger. - -* If a validator's reliability status changes, it takes two flag ledgers to - modify the negative UNL. - -* The quorum is the larger of 80% of the effective UNL and 60% of the original - UNL. - -* If a validator is on the negative UNL, its validation messages are ignored - when the local node verifies if a ledger is fully validated. - -## FAQ - -### Question: What are UNLs? - -Quote from the [Technical FAQ](https://xrpl.org/technical-faq.html): "They are -the lists of transaction validators a given participant believes will not -conspire to defraud them." - -### Question: How does the negative UNL proposal affect network liveness? - -The network can make forward progress when more than a quorum of the trusted -validators agree with the progress. The lower the quorum size is, the easier for -the network to progress. If the quorum is too low, however, the network is not -safe because nodes may have different results. So the quorum size used in the -consensus protocol is a balance between the safety and the liveness of the -network. The negative UNL reduces the size of the effective UNL, resulting in a -lower quorum size while keeping the network safe. - -

Question: How does a validator get into the negative UNL? How is a -validator removed from the negative UNL?

- -A validator’s reliability is measured by other validators. If a validator -becomes unreliable, at a flag ledger, other validators propose *UNLModify* -pseudo-transactions which vote the validator to add to the negative UNL during -the consensus session. If agreed, the validator is added to the negative UNL at -the next flag ledger. The mechanism of removing a validator from the negative -UNL is the same. - -### Question: Given a negative UNL, what happens if the UNL changes? - -Answer: Let’s consider the cases: - -1. A validator is added to the UNL, and it is already in the negative UNL. This -case could happen when not all the nodes have the same UNL. Note that the -negative UNL on the ledger lists unreliable nodes that are not necessarily the -validators for everyone. - - In this case, the liveness is affected negatively. Because the minimum - quorum could be larger but the usable validators are not increased. - -1. A validator is removed from the UNL, and it is in the negative UNL. - - In this case, the liveness is affected positively. Because the quorum could - be smaller but the usable validators are not reduced. - -1. A validator is added to the UNL, and it is not in the negative UNL. -1. A validator is removed from the UNL, and it is not in the negative UNL. - - Case 3 and 4 are not affected by the negative UNL protocol. - -### Question: Can we simply lower the quorum to 60% without the negative UNL? - -Answer: No, because the negative UNL approach is safer. - -First let’s compare the two approaches intuitively, (1) the *negative UNL* -approach, and (2) *lower quorum*: simply lowering the quorum from 80% to 60% -without the negative UNL. The negative UNL approach uses consensus to come up -with a list of unreliable validators, which are then removed from the effective -UNL temporarily. With this approach, the list of unreliable validators is agreed -to by a quorum of validators and will be used by every node in the network to -adjust its UNL. The quorum is always 80% of the effective UNL. The lower quorum -approach is a tradeoff between safety and liveness and against our principle of -preferring safety over liveness. Note that different validators don't have to -agree on which validation sources they are ignoring. - -Next we compare the two approaches quantitatively with examples, and apply -Theorem 8 of [Analysis of the XRP Ledger Consensus -Protocol](https://arxiv.org/abs/1802.07242) paper: - -*XRP LCP guarantees fork safety if **Oi,j > nj / 2 + -ni − qi + ti,j** for every pair of nodes -Pi, Pj,* - -where *Oi,j* is the overlapping requirement, nj and -ni are UNL sizes, qi is the quorum size of Pi, -*ti,j = min(ti, tj, Oi,j)*, and -ti and tj are the number of faults can be tolerated by -Pi and Pj. - -We denote *UNLi* as *Pi's UNL*, and *|UNLi|* as -the size of *Pi's UNL*. - -Assuming *|UNLi| = |UNLj|*, let's consider the following -three cases: - -1. With 80% quorum and 20% faults, *Oi,j > 100% / 2 + 100% - 80% + -20% = 90%*. I.e. fork safety requires > 90% UNL overlaps. This is one of the -results in the analysis paper. - -1. If the quorum is 60%, the relationship between the overlapping requirement -and the faults that can be tolerated is *Oi,j > 90% + -ti,j*. Under the same overlapping condition (i.e. 90%), to guarantee -the fork safety, the network cannot tolerate any faults. So under the same -overlapping condition, if the quorum is simply lowered, the network can tolerate -fewer faults. - -1. With the negative UNL approach, we want to argue that the inequation -*Oi,j > nj / 2 + ni − qi + -ti,j* is always true to guarantee fork safety, while the negative UNL -protocol runs, i.e. the effective quorum is lowered without weakening the -network's fault tolerance. To make the discussion easier, we rewrite the -inequation as *Oi,j > nj / 2 + (ni − -qi) + min(ti, tj)*, where Oi,j is -dropped from the definition of ti,j because *Oi,j > -min(ti, tj)* always holds under the parameters we will -use. Assuming a validator V is added to the negative UNL, now let's consider the -4 cases: - - 1. V is not on UNLi nor UNLj - - The inequation holds because none of the variables change. - - 1. V is on UNLi but not on UNLj - - The value of *(ni − qi)* is smaller. The value of - *min(ti, tj)* could be smaller too. Other - variables do not change. Overall, the left side of the inequation does - not change, but the right side is smaller. So the inequation holds. - - 1. V is not on UNLi but on UNLj - - The value of *nj / 2* is smaller. The value of - *min(ti, tj)* could be smaller too. Other - variables do not change. Overall, the left side of the inequation does - not change, but the right side is smaller. So the inequation holds. - - 1. V is on both UNLi and UNLj - - The value of *Oi,j* is reduced by 1. The values of - *nj / 2*, *(ni − qi)*, and - *min(ti, tj)* are reduced by 0.5, 0.2, and 1 - respectively. The right side is reduced by 1.7. Overall, the left side - of the inequation is reduced by 1, and the right side is reduced by 1.7. - So the inequation holds. - - The inequation holds for all the cases. So with the negative UNL approach, - the network's fork safety is preserved, while the quorum is lowered that - increases the network's liveness. - -

Question: We have observed that occasionally a validator wanders off on its -own chain. How is this case handled by the negative UNL algorithm?

- -Answer: The case that a validator wanders off on its own chain can be measured -with the validations agreement. Because the validations by this validator must -be different from other validators' validations of the same sequence numbers. -When there are enough disagreed validations, other validators will vote this -validator onto the negative UNL. - -In general by measuring the agreement of validations, we also measured the -"sanity". If two validators have too many disagreements, one of them could be -insane. When enough validators think a validator is insane, that validator is -put on the negative UNL. - -

Question: Why would there be at most one disable UNLModify and one -re-enable UNLModify transaction per flag ledger?

- -Answer: It is a design choice so that the effective UNL does not change too -quickly. A typical targeted scenario is several validators go offline slowly -during a long weekend. The current design can handle this kind of cases well -without changing the effective UNL too quickly. - -## Appendix - -### Confidence Test - -We will use two test networks, a single machine test network with multiple IP -addresses and the QE test network with multiple machines. The single machine -network will be used to test all the test cases and to debug. The QE network -will be used after that. We want to see the test cases still pass with real -network delay. A test case specifies: - -1. a UNL with different number of validators for different test cases, -1. a network with zero or more non-validator nodes, -1. a sequence of validator reliability change events (by killing/restarting - nodes, or by running modified rippled that does not send all validation - messages), -1. the correct outcomes. - -For all the test cases, the correct outcomes are verified by examining logs. We -will grep the log to see if the correct negative UNLs are generated, and whether -or not the network is making progress when it should be. The ripdtop tool will -be helpful for monitoring validators' states and ledger progress. Some of the -timing parameters of rippled will be changed to have faster ledger time. Most if -not all test cases do not need client transactions. - -For example, the test cases for the prototype: -1. A 10-validator UNL. -1. The network does not have other nodes. -1. The validators will be started from the genesis. Once they start to produce - ledgers, we kill five validators, one every flag ledger interval. Then we - will restart them one by one. -1. A sequence of events (or the lack of events) such as a killed validator is - added to the negative UNL. - -#### Roads Not Taken: Test with Extended CSF - -We considered testing with the current unit test framework, specifically the -[Consensus Simulation -Framework](https://github.com/ripple/rippled/blob/develop/src/test/csf/README.md) -(CSF). However, the CSF currently can only test the generic consensus algorithm -as in the paper: [Analysis of the XRP Ledger Consensus -Protocol](https://arxiv.org/abs/1802.07242). \ No newline at end of file diff --git a/docs/0001-negative-unl/negativeUNLSqDiagram.puml b/docs/0001-negative-unl/negativeUNLSqDiagram.puml deleted file mode 100644 index 8cb491af6..000000000 --- a/docs/0001-negative-unl/negativeUNLSqDiagram.puml +++ /dev/null @@ -1,79 +0,0 @@ -@startuml negativeUNL_highLevel_sequence - -skinparam sequenceArrowThickness 2 -skinparam roundcorner 20 -skinparam maxmessagesize 160 - -actor "Rippled Start" as RS -participant "Timer" as T -participant "NetworkOPs" as NOP -participant "ValidatorList" as VL #lightgreen -participant "Consensus" as GC -participant "ConsensusAdaptor" as CA #lightgreen -participant "Validations" as RM #lightgreen - -RS -> NOP: begin consensus -activate NOP -NOP -[#green]> VL: update negative UNL -hnote over VL#lightgreen: store a copy of\nnegative UNL -VL -> NOP -NOP -> VL: update trusted validators -activate VL -VL -> VL: re-calculate quorum -hnote over VL#lightgreen: ignore negative listed validators\nwhen calculate quorum -VL -> NOP -deactivate VL -NOP -> GC: start round -activate GC -GC -> GC: phase = OPEN -GC -> NOP -deactivate GC -deactivate NOP - -loop at regular frequency -T -> GC: timerEntry -activate GC -end - -alt phase == OPEN - alt should close ledger - GC -> GC: phase = ESTABLISH - GC -> CA: onClose - activate CA - alt sqn%256==0 - CA -[#green]> RM: getValidations - CA -[#green]> CA: create UNLModify Tx - hnote over CA#lightgreen: use validatations of the last 256 ledgers\nto figure out UNLModify Tx candidates.\nIf any, create UNLModify Tx, and add to TxSet. - end - CA -> GC - GC -> CA: propose - deactivate CA - end -else phase == ESTABLISH - hnote over GC: receive peer postions - GC -> GC : update our position - GC -> CA : propose \n(if position changed) - GC -> GC : check if have consensus - alt consensus reached - GC -> GC: phase = ACCEPT - GC -> CA : onAccept - activate CA - CA -> CA : build LCL - hnote over CA #lightgreen: copy negative UNL from parent ledger - alt sqn%256==0 - CA -[#green]> CA: Adjust negative UNL - CA -[#green]> CA: apply UNLModify Tx - end - CA -> CA : validate and send validation message - activate NOP - CA -> NOP : end consensus and\nbegin next consensus round - deactivate NOP - deactivate CA - hnote over RM: receive validations - end -else phase == ACCEPTED - hnote over GC: timerEntry hash nothing to do at this phase -end -deactivate GC - -@enduml \ No newline at end of file diff --git a/docs/0001-negative-unl/negativeUNL_highLevel_sequence.png b/docs/0001-negative-unl/negativeUNL_highLevel_sequence.png deleted file mode 100644 index b962693b49ce31c1e02fc29b7c8d5fb2dc2d5c20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140927 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 z 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

MqoO+fX+kvZpR_mOru_CDJHI)_H3czlafff^rvN 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 F{~t7mxy=9o diff --git a/docs/0010-ledger-replay/README.md b/docs/0010-ledger-replay/README.md deleted file mode 100644 index 170fd15c4..000000000 --- a/docs/0010-ledger-replay/README.md +++ /dev/null @@ -1,88 +0,0 @@ -# Ledger Replay - -`LedgerReplayer` is a new `Stoppable` for replaying ledgers. -Patterned after two other `Stoppable`s under `JobQueue`---`InboundLedgers` -and `InboundTransactions`---it acts like a factory for creating -state-machine workers, and a network message demultiplexer for those workers. -Think of these workers like asynchronous functions. -Like functions, they each take a set of parameters. -The `Stoppable` memoizes these functions. It maintains a table for each -worker type, mapping sets of arguments to the worker currently working -on that argument set. -Whenever the `Stoppable` is asked to construct a worker, it first searches its -table to see if there is an existing worker with the same or overlapping -argument set. -If one exists, then it is used. If not, then a new one is created, -initialized, and added to the table. - -For `LedgerReplayer`, there are three worker types: `LedgerReplayTask`, -`SkipListAcquire`, and `LedgerDeltaAcquire`. -Each is derived from `TimeoutCounter` to give it a timeout. -For `LedgerReplayTask`, the parameter set -is {reason, finish ledger ID, number of ledgers}. For `SkipListAcquire` and -`LedgerDeltaAcquire`, there is just one parameter: a ledger ID. - -Each `Stoppable` has an entry point. For `LedgerReplayer`, it is `replay`. -`replay` creates two workers: a `LedgerReplayTask` and a `SkipListAcquire`. -`LedgerDeltaAcquire`s are created in the callback for when the skip list -returns. - -For `SkipListAcquire` and `LedgerDeltaAcquire`, initialization fires off the -underlying asynchronous network request and starts the timeout. The argument -set identifying the worker is included in the network request, and copied to -the network response. `SkipListAcquire` sends a request for a proof path for -the skip list of the desired ledger. `LedgerDeltaAcquire` sends a request for -the transaction set of the desired ledger. - -`LedgerReplayer` is also a network message demultiplexer. -When a response arrives for a request that was sent by a `SkipListAcquire` or -`LedgerDeltaAcquire` worker, the `Peer` object knows to send it to the -`LedgerReplayer`, which looks up the worker waiting for that response based on -the identifying argument set included in the response. - -`LedgerReplayTask` may ask `InboundLedgers` to send requests to acquire -the start ledger, but there is no way to attach a callback or be notified when -the `InboundLedger` worker completes. All the responses for its messages will -be directed to `InboundLedgers`, not `LedgerReplayer`. Instead, -`LedgerReplayTask` checks whether the start ledger has arrived every time its -timeout expires. - -Like a promise, each worker keeps track of whether it is pending (`!isDone()`) -or whether it has resolved successfully (`complete_ == true`) or unsuccessfully -(`failed_ == true`). It will never exist in both resolved states at once, nor -will it return to a pending state after reaching a resolved state. - -Like promises, some workers can accept continuations to be called when they -reach a resolved state, or immediately if they are already resolved. -`SkipListAcquire` and `LedgerDeltaAcquire` both accept continuations of a type -specific to their payload, both via a method named `addDataCallback()`. Continuations -cannot be removed explicitly, but they are held by `std::weak_ptr` so they can -be removed implicitly. - -`LedgerReplayTask` is simultaneously: - -1. an asynchronous function, -1. a continuation to one `SkipListAcquire` asynchronous function, -1. a continuation to zero or more `LedgerDeltaAcquire` asynchronous functions, and -1. a continuation to its own timeout. - -Each of these roles corresponds to different entry points: - -1. `init()` -1. the callback added to `SkipListAcquire`, which calls `updateSkipList(...)` or `cancel()` -1. the callback added to `LedgerDeltaAcquire`, which calls `deltaReady(...)` or `cancel()` -1. `onTimer()` - -Each of these entry points does something unique to that entry point. They -either (a) transition `LedgerReplayTask` to a terminal failed resolved state -(`cancel()` and `onTimer()`) or (b) try to make progress toward the successful -resolved state. `init()` and `updateSkipList(...)` call `trigger()` while -`deltaReady(...)` calls `tryAdvance()`. There's a similarity between this -pattern and the way coroutines are implemented, where every yield saves the spot -in the code where it left off and every resume jumps back to that spot. - -### Sequence Diagram -![Sequence diagram](./ledger_replay_sequence.png?raw=true "A successful ledger replay") - -### Class Diagram -![Class diagram](./ledger_replay_classes.png?raw=true "Ledger replay classes") diff --git a/docs/0010-ledger-replay/ledger_replay_classes.png b/docs/0010-ledger-replay/ledger_replay_classes.png deleted file mode 100644 index f4cbab62907bd8508393996b3b5e6957a741efd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91658 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 - -m_inboundLedgers : uptr -} - -Application *-- "1" LedgerReplayer -': m_ledgerReplayer -Application *-- "1" InboundLedgers -': m_inboundLedgers - -Stoppable <.. InboundLedgers -Application "1" --o InboundLedgers -': app_ - -class InboundLedgers { - -app_ : Application& -} - -Stoppable <.. LedgerReplayer -InboundLedgers "1" --o LedgerReplayer -': inboundLedgers_ -Application "1" --o LedgerReplayer -': app_ - -class LedgerReplayer { - +createDeltas(LedgerReplayTask) - -app_ : Application& - -inboundLedgers_ : InboundLedgers& - -tasks_ : vector> - -deltas_ : hash_map> - -skipLists_ : hash_map> -} - -LedgerReplayer *-- LedgerReplayTask -': tasks_ -LedgerReplayer o-- LedgerDeltaAcquire -': deltas_ -LedgerReplayer o-- SkipListAcquire -': skipLists_ - -TimeoutCounter <.. LedgerReplayTask -InboundLedgers "1" --o LedgerReplayTask -': inboundLedgers_ -LedgerReplayer "1" --o LedgerReplayTask -': replayer_ - -class LedgerReplayTask { - -inboundLedgers_ : InboundLedgers& - -replayer_ : LedgerReplayer& - -skipListAcquirer_ : sptr - -deltas_ : vector> - +addDelta(sptr) -} - -LedgerReplayTask *-- "1" SkipListAcquire -': skipListAcquirer_ -LedgerReplayTask *-- LedgerDeltaAcquire -': deltas_ - -TimeoutCounter <.. SkipListAcquire -InboundLedgers "1" --o SkipListAcquire -': inboundLedgers_ -LedgerReplayer "1" --o SkipListAcquire -': replayer_ -LedgerReplayTask --o SkipListAcquire : implicit via callback - -class SkipListAcquire { - +addDataCallback(callback) - -inboundLedgers_ : InboundLedgers& - -replayer_ : LedgerReplayer& - -dataReadyCallbacks_ : vector -} - -TimeoutCounter <.. LedgerDeltaAcquire -InboundLedgers "1" --o LedgerDeltaAcquire -': inboundLedgers_ -LedgerReplayer "1" --o LedgerDeltaAcquire -': replayer_ -LedgerReplayTask --o LedgerDeltaAcquire : implicit via callback - -class LedgerDeltaAcquire { - +addDataCallback(callback) - -inboundLedgers_ : InboundLedgers& - -replayer_ : LedgerReplayer& - -dataReadyCallbacks_ : vector -} -@enduml \ No newline at end of file diff --git a/docs/0010-ledger-replay/ledger_replay_sequence.png b/docs/0010-ledger-replay/ledger_replay_sequence.png deleted file mode 100644 index 37bcbd5069aebfe8dc83d0067670dcd6890322a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 124133 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Ț!%)5Xyc<8#QYk0t^w?9*TMQRQZgTo-Vm^WU>=YrgkcshF&b)}> zlA-FK{hzQY%6jXFP<=fFi;fFNwX75U3ZA9Cip_E*SRE~FfqNU4t!obg&z)p{&G49D z%dx8^V8Nu*?#_qsWk``#r0}K~Eo$sWe&gk>JaY?HZb0DosE(-rbxh#lAy);tO4H+o zyL(@nHYVTVSLG>VmCHtwtr;Y?TEsbol=z$2c+Nx3HZHqYyuAx-aapl{){dz(7lN`D z#6BJ7gUx-}B+BK9B_7+rKrZf$r3clN;cls zJ@H@E6L!|C2zv1}ge6lph_Z`MS`MHM4)zVLdO(co5H;w}^1OU$8(Heso1=+F>j*CH zv*K&4mr>c_I@Q`Jek#Q4RNN$n&N@&90OxVA(>eAiN#T&hB2!q;I$T!3ibLd!$F4nb zHDF$K6pfsm;!I=`9P&FmU#+|sm7kvvJuXVIMc=%QT2-~;E54|2D*dr6WfQIv7X-l` zU~%!ziXTULpdn5=N7Sqc$P`BHnQ?`MilwyA?x<-O8b?~aU%a%Ir6$Wv9LcV}Icq!t z8C0DxRdnG_sqswdtTU@X_6}dlU8!K=aDH3oazFsgJ0CRt@_1QZk=EOYBN2UFf)Gh8 z4jl!3nV?A&)m`cQ8I52i}^0g2S7ZeGmBwyeYm6B>~Xn0y6fY-^w zO2)~`IuE@`ib07!!n)71zuK>sq+Q;R=*N=}qZ~9Lv|)K1_Ng3Z*4bqmr4Xczp>PptC?LI@mKU zlG2{zFBKQ{3=E*$#D3|AJNP68C8gB>Ujy|-p%7nL-s)KS0@FdrWeljiQw1N2LXls+ z*P2mZUk_mrV1AViJQo)dyvMp)6`K3@?L&yC1JUs`)cgXWFLeVPBhVP-?QruT3f-c3 zFcRY8z+Hi&q=_$awa}W4;Y5$t=70F1x6Nhc=Tb`bIJil`RjEOuyFZ9G_6Pn?B!{@#X7RME&k-f|Sy_*8AzJ z(6RW#XVo#_G$ukjU{$B}oRSyMf`i!|R?M?fuO6OFs2a1{VR$x8&s*8`HMx29H*`N0 zN=!P-a}NfjGIpIw4An{?yCaA-TK;WBh(?ClkEU~zQlH>69b@94?M7D5Cl$D zb>Ol*e)wHM~9hdQ?X%z#*yp-ajaC}FKi zODo#|Q`|@6sAr62ZIW(S(qKLJ%R6uRT4Z1ZSd6Z8UtOA zoK@l}&e=i*m&Sc>Ua7O3?QxeAZ4Cmcu<(xsRSqjbh6K2p`ngt1pyA6(htei<3^EqMWrp7_6#dQbnY-npum;H@Ek0ZdlE} ziDtPYC@7e&Qc{E7q_{ZC7GKgb3g_&&nYsOXcZ79zRA0VX9_1y)iB6Ez z9KHBme8-@qjml@-8s-Y!S>`V-MGLg#ocksq^qFQ z|0IKJ7}V^H>fKqgJc9_Ui=He+@%V@F9}_*(R#SW5yN|e=&uAcnD`b{`~ryAJ2k3G%6D;lPEWkheAy#wP!?5PL@B^ zhj&aObkFMnb1OwW(>j7xRO9zdsG!cd7?e#1dOjw~Svm7IXZ&p(2Q=RfA{AI0OHKf0 zVYXOTyMuxkh;nL1R5KrVwnfQ*ir}^}1=-G)&8Fht^;Og@aV^?t@J4TPva|1`{MhDg z-qCODyOlcW8FJM`z3n=o{yY%V!wlbB4j?*RWE)c$@7K3X!%!==LF1(Uo@%}PwG{lN6a7e zMgdCnWOLHjoK}@0s3XlPi;W!sg$1ZM>j&y1^p+tEhmyVt*e9Up2M34IQgdA4Oef@R zip+n3?l{uBN?tYd`+|phYA0yvjg08czA+zg+L(=W2X%w|UY@u?RZ)-Xk&c{Es0AI1 zGa?cf&h70G+g9RIi5J)&QmJN1#$?+g^Fdoz`ugg=n>gJJy_a}O

Fm{zLm0SzB_Uo{`O&9rDrizq8#1h0Uzu^4$lj6ePW=u z&D_Yh(LQ)EsKN_u3Ti8P7+zzX_y%PMz|sE1ZhhTAiu-Bl#ZHB_tRL!Pxf{=&I#=t+ zG?qNjUqfveSVYXHROt+l67BEini;zLtKXGvc3cXb6%ks+JHih=19rj7CB74sij2S+ z`wsmX(00B_s4raY>V2IlEHi#LsCjfX^^0%=iXUg>J3SAx4DS8!9gyKnj5&)ZUdQfFAIuftDTp3@d#CMWoHoQRt zNN7wBQbKKmueuHmUpxEiFN_2CF>Z~`O(pqPmhVFs-V1<&7F-|uTK42R$&)JF7@>XS zU#QO*p*B)E6t4q!4bmN^$9J#qdypZ{c9J%!A1ccs;1apXRwV9Ebj!Zr zH>BZ0u0}y-TOlPBsvPe2r4^>fkvlyCMG&kn-%t)=2AC}bK`tGw<*MZ^c1(EhZ9vdHd=KT=}=+54)#!J1WCbA8dBvf@f{@Nm4pKK0Yq4PJ`=qi#mBy zUOG6Y(2vUd1jBPXjlo}^g_UmY0l(fxL)bbudFpgaUwK zM=Ku*t8>38DOoaAft6k`6iN%=5afMlMA%w1gqL2sy1F7QW-M4M>=dHAdwlyH&v0qr zzIUXN49&Kk*DGMB@jRkz?SaH>u?mh+?7dE#>rhDnonjPA?F(`!h}QQ5NyV1r z6J}YTiN=86`87l1dX@t?f1o`h6(UeGfrx5qXvE}{SQAdmL$fnPLlDr}pUNH+?mvi; zmUA2QmF)q24(qS>g1)(XXUG(RAioBj^txONtM?9@ePTSoxlreW4h@JROv-q-ieBEj z2eyjC{5PmL0R`|-x%!P;YF2#xaVODz#FDt&XA2o`Ps*UP_jBndFq@3p@)DP?_3E4U zqbf$L#OYbfXX=9+I(o+AEIa+$zPBhD6Oky%L21ofE)%=kP-LA;_Upb+P-B$5Yl5s7 zgE?Z6m`p=j4)zdrnljSS=|km$mK{KX7Oy*V-pN{k>bqNv%f=y&=ts(vQsy(kSYOZShsznl)&a)M12Hkr_FkYX zfBt3)^%p7Q--@~c?tzdH@H5qWGQf#yZLZ9ZuFj8IK{6OF|3GAsC=9MzdykEvp(Hg^ zyWzSziRrPF`V_l@aaG%2yE`b?TCG0U=9^w8SGVQv-nqcXb22853YugS?HRATF3)#m z7;l%O^yI=z%u)RV5-kfKaGXv}*R%I}Sb{{rnKF*s24%**yjctj#+wo@!$|S}$ml4P zkDCFwOID?Sf`NT{4jQe^Pjq)GHoEf`USMLHgf>l=VLLFBd@(bz8{UC_9d#pCon>u) z^Jk#Uk6`6FXKAz1s((cIdX1Z9;dtfv_RNm?fi~_Zu8DlX5g$o|C@ivm$Sv*K)EWZ) zcVFRv^UOEPv;-4Nyt>+?_|VI7)Q$oY8!T26_puWpUyorGM?AF;m)^q?Me`o zj!ZD-a)V4N)CQ((KE9Ak?5FN1Rq1ksU`&;-39gBtPd+p>1g%e?s-D$+b3ax~0!j7y zdhGSyQ@d}Zlkq$fda>rb{5F}pSzOFL%Hf4ApnAJHxC2h9zJB^4mwhi35gu;1Q6e!~ zb)sI7FZZJe;4-U#RnI6Z3gxLBory4)L;`#~IO;KyJ^K_K;{6+JXxHuQt|B4G!a*>FYr z-iV620v=ii4A*P0>p8VJbWpUIt|CV6Wl@`HnGBV(p16AocWC^Xaw1CYomK(Uc;8O% zeb_#5(7X3C9|a!rSR^&L8<)yR@jw|ua*Wn~d1Ik()(97^Ah$o=i_3?;Y}{naj_iUD z6*VHtN=?a;ThlCakj~!ve~w#emt6dESMS{5=ZqRvjaHm~JS!@$>$1NnFxbHgeLuTJ z_aRcmE0cF)d!u@$v{nkSstqD}RgZSR^{2Ngx7s`W?T4QRp7?96_RzjaY}KzuiBO=RM#-@!>**Nv z6b%w&Cx&aAQ^f^7leOInZE0fOrLV5giz^pWH3rBmUO5%$5HV0QW3ry8?+6EXat$# z(humW0{pv;2b5u$!S%b*y?xJxYN|i6yVmA@7Swf!n)dNAp*h=0a3XjeIz|wqV>dq%7#eyp4SMnY92$ax!}aIljCc?)=^BINRc&o; z(b`OHm83eK)=xOaP?pvP7bg&>?gD{wh?V{`tk*&Ou1`8%D$*!7IXM}`OgbRK=M9zE zxt&Jv7c7bs>e2=@zpJ>5W7;2b8BB+A?}uYm-VdR6+1qh?#PcVqCEpiuJ*THp;YJ8% z8M>y@JpJF#BZJ}}%PI(czl0Vsp04XifwM)@Tewcczd3F!|AcDQ5MGBB(Du_?SR8KB zfJid(`ejaK^GYVwH}%gMA|z(OPxTA0uRQ_bT)1jO75^yAY%d@@tuk|_y!y(Ht@3WI zmXfaHO2tM);tzPO^j86#+zh?)OVs-a0gX$y-`w+#NR7S5pYtSp6b53(H%8>j6tlE^ zb-W{^8Eoqe<0W3+R#NH&IUA^8_B(m0qN``R?leQB8D7G>!lMv)Kj&UU05BxA*E!Z( zj#?dn-c|*13sbW2CIY?;g8~CJ4RfK_fPNNqCHS&(Ha`vm;xN0+ogkSpNF;YpEtjci z3`&}V*4HPU@^Z~bv(vv+MYA(7NRAMK#w{3c&D`9i)i$JAIm?bUp68LH zGyJ6xE+$$|aOHtWE?mBl;4Q>UE^@{ldfPPf(gP%YLdN%$Z*OdsZ;LOQc1ol~^R3Ux zYyoR`1|BPYyC&oHz#BSHse9XT<+);~`_UqTJla7}<5?A3{#Blzv7qsi-8f=+t$Wf@ zdtS6tUhZsTO4Cg1DZutEcj5AiSu=}|AgVGnG2-+amC${mZUGAA1^Ec3`$Z-qJ#oDy zR<$VrhbAmpie;dBvULOI6HYu0UpVw|w+y=~rffUj2T5WMlRlT6jJZGzqcG^mR}4F= zMN75}W_w+psR>L8KvYoG&n3$vD$@7^9IB_A#$$u$VAqa(OO}Il3Dl3L>OEbtX_s33 z6i7D-o%Ehbg0rH)Z<;$a<<-_=%>Sh-8UK<=pU|uw1&u_=eFrp`>XxA zSAkjm280ygn4E*Wh>1%-q z?dQ$#b3r+vj0yRNJ`*@WdWNt3{nb)G5QTXLu7UPJYJG}h-us5y+AI}{j7M-wl!PC~ zC4qBcTg7Ox1!iAjC@c)mA~vFWV|anIKY>XXT75D(PJ0`6=6WtfZp7^^5 zip6$tBS2%uvNh9b{+1|c@rx)(fk;(-WoR+5ihzMMbT_$o{H@^TbvNs$Een0ZA;1p` zW>l_BUfc>FYV2EVn`b{0)+9JZ^VUWEHuyGY`C8Z|-HtklIn9Rkra&aWP>g#JjDF|a z@lS;#)>_-LQEEZV&fjnCcu%tsZnT~_(xI-MJ%DG+N*)2d;lqpy#U>10AoMcHD-f>C|?F?VZjA z5yDM_{E%laVx{Cef61xwQC#bLx5a6gC*j`8mrUU%pFGD1)K2;Am&aHHx_X!BjjiI1pp(u$gPpER&&216n76JtyfQ>P{Sz;^L(kg?9KFa2KnYQ zE2IHzi;Wpje`iTUX?1Sr3#Uifb-a;W&D7DXW6}`Fi>FISE4tqd%+$C^PfV@={~}!O zEud)P3s?neYVb?Dus#zM9I;n*)8VrRDryv>C>dTe@bf1zA>oVQ;M%-%%v%Zdr?vp< zX#apZ%zOy8_WruuvT+X6lT#+7W}711jDRj@p>5To z2jNXm&cj>LD1Ae;aI?IdC^Yw{gNe!!tIFft0V z69k4pk7+GK6i)z+q#|^r(81|zST;Z-4SXSuqr-y)ci*u;zZ_taER;X5WNK;({ltkn zvf$oPP_g9skn(Z(Px05TE)whR{_4Y3z@ z&CVXba4w}td>!;}HHK-={!yyo1Sgo)$eXp|3ZMZ%h70@(vSfYmBcAXh_@zWR$Qlb# zFtWUS@dA8XJk&k2v9a;4&wZs7@nK#CF=rqrE&81R>6-{}OF8R)R>uqUSbHE=2l;BK zW@;(6g?_Hwi(O{XO>p?YScitwOnXGLWMi1XPn6;ZOXG+_wbgIP4^;^GKO|_VsRt3a zyb7jSR+k(?Mq3~Pi4(aKSIAPhfOyLUA_%0&JO2=3ZJ~!e;JrixF->x05^hHEcp%Z= zzDbW|MRP7Mx^1*8E1cf1VW z$;ajRHr-AD<>8~_*Sg?Y>6Mzz2l4%YQ803Hn>PS87eZHI-RScjXed}&zZry_p~Hi8 zE6Ej|&meEvQe^zP5B{@(W{up94EKrm!}*TIxE%Y$Yy zjC1@DrY_%JF^^Xe3EA-l-+tf!6-c%@Z@aG#wgNj``|_>`hXttnWwCdg2ehB?74|-{ zK4)18?2IL^h8WV<(BBgFt6K!iONa)S&U~ViQ?>}4_v7{#LQIP7Q(Jye=h!-H907n8 ze(j29JUjN+|7Q-k2A}*+_xGW$dw>gf!=4<3mUN|we!Y6kHwj%{;4px!1sv;imgUrZRP;DPJWF)PN2~{^pNcNYa&H9*j^NZk0O7x_m5C<3k$rmJ`PTLeTkFuo z@ZQNjyT#(V75yy{!(}UfWB*?8Ur$8L3hBQF15m2hV^U(s+~GY0RUknIL6vKNUW%#% z4%x}QW^g*R25NBU%8ZvAfkO^~lTUe7o-4PSEVmqppx8hR>9hNHD9ELEuIQqPEYxFL z&+pOR$cKa$-Hj4Q!)n!>Z85*y*`pdu#GnG|o9K>rMJkS@>mH1J;#--V#!2Nc7Ls25 zF?o;q%@v1xVL|779{!mXLiojd`+u>DHz0!-UE00}(%u29Bato3f!neQnEzSCW>Nq@|=c z@m)pH4^)|iXl%L-3|Lge(;h@Q#}XyG*3%kqjHgCfm3#@65<$oH$3(wT;?6;yq0Xvy z5QU<;XF$wG>vw0&K}&i5`rycsrBlc!4#Fp-)w$FtQLwSeIi?K`7`=V_h>`*ilhBQ0 ziI9MeaD^8|E^W<*#xCFX4iCO^^!*uouOlQ!9mr76&U1%3lh7M{_ka<(svYO8a=~^j z#X*S@Mo7NHKEd`-i0Z(j3TBK*^$ItEUJMk~(MFo@hp|YmQs6)0R||O}bxBRIJg*O} z##5W%;S*QvGkBi-ubJ!06GGmiq4@9b9|+vtj_rHoVHE07dBx$U9zx`|P7ZySk!XV) zAoE|NgiRuP^Z$L6S_#QF6NSm~A2}acX2#guGuApGCvyL;*ypNgx9y~ck--t_wqgj6 z^*&2^ktQzXw)3hXo*NHGnoFpj^LjeYeBmfLB61!X)7mA-#Vb1JQ;se;`#g= z^_iASx|NLWtVVK1!O<;#io?9ZerJs zws$YtjD}oM4<0+6N0%oqJ$jwNJaTMB?Bf$WAqw2{EAwcp>{JXCc(;aEQO-g?+Ff3D zAOGs`#dzLRC|}Cbw==LaE^$8QM4?o4q>juaAA<^M#eH4Z-#D5jeJ=p!K zf^@bhXz;OUH56ycB+SB%exs7$iRO=|XY+ckHLfMg>M|(W8xDNL!a2K=LEmaHFC*at zQRlSLo)SqBk*uB)uF}OG9L?pLfJF#XeGBKx`&cKjy0OT_YiSVrr8()aYT#Ae^iTDM z?S&RAv0}lpce_)K&y94RN?o5%@11O$?y4pwIsa7E$)S!qI9ptbFF`4dJE@Uy5INXy_Msn zU2h2I{AGO^?Ba_i%n$E3Y^(Wihe^B)^| z!%7W14K+T@J#!s;uy`U%doeKhjv{A)YT3;XaUFr3>p^29VKU8RPG94lCRTVwR1Gf6rrg6 zph7BlM*=4NIw>(>c2DWLrH%d6_ZJP}jd^U}-X-H>KrZL1&DzFl|ICcyh?2*OWwgJr zciK3tSlQa(iI}NTRX(R571vf5Bs1A`B!}{FTkqd{Zq3wxd;HV5qqyaKea%GmzjK?&Y>$~iA@jlDr$Eq`Q#3I#0jWY^Vb_jtkGD+f?-NSEitis}*`OUM zDR&gAS6A0pts3ei#FM^e>%O7Sn^>-|Iqm5YDhcCfqhr;b(d-{;Mn?Uiw(60NWUoMT z9s!Z5nNp9PF`1c~$uy3L&u~Yfg)In6rJ0XPFjj`VEGC}}Qr@|Bc zJvhutm%Ln_KhG+qxHgsnQ5lg81)@Rr9(i1gWMjjNbae0AP)egG+u?LxeR%(AqJs3L zaVDpN!IjY>`7pijcRin!KQS95roLxqIFX{@FwY?5z-0sdCnxi#DrA9_FerEN7+H@+ zZ4jCLLi-#xiP6aCANLe=Zdw{&G8+o~K<(WYM^bVt`c{jwxzy0eqMn+EYE!PmWxBv8XnD47n-DvmlB{9bDoYblh zH6NL)YNZhB9#IOjoohm4P;#tKd+N_)Geg>>b?w@ykB?UGhUKc9$|+65H;?23Z!cC; znwlzR>jkobIq=!sG;W1m#L_@|l{pS<(qgYu&Q+DHA-4#g&iI5#vl{C0jVbqx%*Pz< zC9e5y)BR;jVZ;Rm3{^^3gSO9YK(`;$ZRw_ujLMg#UWKSR1lCg7HbEe~YHdbi= z4m!Hywwb+8dy>0eRJKwMCZda8o0eYm6h+5H-(I`DZdL6jtyItK+*iTUX& zDE{avg9;x}^rRnKzxH1bqaa9uCtY?*S|(zOa9*E2^;M7SwBP9B)x{LVG&WXRoZ;)I_K%6zlc9Iv|$ywIf@s zx4^7;{)I-Sib`|dRA@9?CKyBo1!(dvl^0~Qs1E{n2RREyYz<}mQv0Qs3&wPn)x&aJ0Y{>67A@Ro^?Cj+sz_D^aT^h z{;ln%8XXjNz)G)4^PhBNpL8X5Q>yKzrNHCIee3i@3g!{@&gwK5{yChdXTxOgtv$IQ zQ`();UtqT&kzGnPQai8vvtfF?gVkxkf5UF^Ca39xkuc+ppWn+1TJ(kLwD1c5&$Ip#JDfa?$!7-}xdF2{b~L#c{! zIXcrh{*+AI=EK#Q#cxI?JPFFEKh1(!Ssu8rp{*}x)VD0C^kgrjpr3h z13%TZKCT<9E5Y(i5@$df`FmGaP^wabRH%6p^!sIab@h_q8fG|WI3(E3rUl}1$~NX# z&vHeqwrL!!GP!xvySs??qiGRwM~OIh`s^KLiR)cgZSIwAZI$2P>t?fP(lc!;KBbhkADCq%;u2!z{lpXvDpC=6_r}24YOC=j*}&1r&k{ond(zT z7ut$sX-U4QkkKylp1&)d9By_qppn;XBcdviAq>Zd4&pv0(tM}y8$nlknKkDdhnhY{ z3%3G$XhL!kc%soWyS&<-WU^&LUKBd-%ftaQ?xde5}=9UYmUn z`==o^)b2RqlW@FeQk9GYswd0%8Zx@BGJmOiDc55^8{A8vw#b;2q+RkUt)nf2htz)R zbezMwcr@urxedfor94u`QZ5wQOu44}YhZ1y&Yg5bo3O`RChuniiPnRd($5ph(WF2J_ipm=kEQvYdAX9n=Kx(mxVJ~@IG$6G zr8WO8k6F8cxVMb_XlifS)DL&7d)8`nlvih9D%`MZgR3o>vh9KsF?`L#DX`Cmmf0`Q zi?rxeI{am~c5Z`eCs^?_O!_6&vpP}~0&a#kr~*L9U?t+}K}c++8vR7t(brpaCJF3bVGTe8%*L#l}V z%;>kQM^44aHA>~53*&hp_#OXcbmYMl;E&HxC?L1JKbp*C0=52{DPjFOZ zOG5<#SIova{VN{GUl{QleeAZR?74;>kdA>%OfO`yo6Vxm**+cSizfCgy(1$Nv+$OD zE3UD#TTln~M>L{#w_E=HpvCUJ6}{`e+QI7xG(BcEb%DlU7m55|12VhI^H)ITztI!X z!xt{7rX5Yez*cMh2&q|jY!Vv3@sYM^#a_CYbNRw762-viM2I34+m(#)cfEb|eOB7-BjxAHqLAx~j1i z{-Hc2e-QUl`_y$q1m1!I4|}HcsE&22adp~RGaEIvA0WdjL5qeu4q+YXxg#g1F6>05 zjx5V^>!T`+VkX3zMMV5aOVq25Qj+96b!%O*9P79g%mjcL)HmY;FmqfW{4q6%3iS~@MeqkmUaJ;cXV7;6$uLnmMlnb4TePq@iBWzOTyBDt4&wIl7lRH+ zI+R;mb(vJdR@{R4F*#-HS{xMJwj)tXKzhPO$`TaA@~PM(jcLs2+dS$ ztCXZ7xD|>u933}gqdIm-!EU{nfi5Q&G-eHI9AL7GJ-UZP+;xATDw zz!YGS9B;wH0MuT#efzcpN>5g1W=py%6V}(SUlC=N4C(9gZ||2wr!6Suwg@cnE$ zvUM}>&Dq#c1C0atyJgZ&aEu{4rD<^(It;cwO=MQD#FTFT_~~HL0;Pqj?zyy;IjgWkLqX8GFj z4!r6}r;P&cAO)NIt&Xu1s@fi-?3tJa@;qVuZ!`9XRWnv(i=hlskuUaHWMmmMNPukQ zE6CSD1>uJ@u90%!zz$3=jCcAr3bp0n&W~5NL)HdL%m$%}(xszNvshyO>$cfhn_KXY zqN3gll1i@Aa&TQ>iz)5arhp^hezHyhS(ILR4z0SAl-|$0zhxakC)pQ$jq!&hR3420SOn8VK18GbwKXr5e&dOJAXa|a)b2u zAQoWJs!Z$W%UJ<>z(=d(&dSKWPspD?#%Itklt? zM?+clTYwh=nJHmx{*xHcLk*6g;kP&6fMf6DgrT-`V}%k=cs+=5F;Q5kmVSos0u7$d z0*W(*p8)f!_T$IlZ^^B0*dz}MmW>~H1o^H2KkFo)qdhci$p2VPYA12;dFk0AQ5WS^ zpn!wVdXtvMJ9`@COt5cTi3q+ZTklad+E}JbP3KwrS(g0sIgm4E-HxAq6U6pzb+Rln zEG#*Q%_ko*q{(q86vO`S^St7|ov}K7H|(g9Vt4FfXm;`%k();pydf#4xel=FVFMIH zinRGF$~j--FJIB?MazdiJyWpGHsmAk&_JZ$SVEJn<{{cGCjdD_IA04uJYnC|y!HCh zaHJ#(f8Ue~;^p9+Bzr91J5e;6<>tXj;mUmstx};`o51<;zNkE2Qc>2*9Q;b9lU$^k z>pY>S5QV>J&8udP##j$m$@9DMdn7u3oVI$^@j>lVzWK=P!e1{%D~Fsmf34&Sg6*bTv)unlOKBzvC%~uDW?GNkY5idGG=UYfZ zcOlIJ#2f5|C~_8S>z8ve$w`+!-1y7aiNuyJDmx1G)o%o-=sGZzW1{#k?{~IBr|o;C zcDLQ9Zv-e*CGox~qO5ShK%pP{U;W*hvvJDb-dyPP&(eh0s}gfhiTd78Umk+OI)gT5 zn=yHXA33FRBCB9ip}Py;D%IoN*Ol&XsONumX)7Cor~7JkBL9e03NG17Ez|)UK;syw zOsE^7Q?f~&3~btf$ALMA?r)8}e*8^*2`DPqTg~}qEV$a+4iEW#E~5(Hqfc4mUZiIm zb=yKq9TD@_kLD&z?U!c|)j9v@`?% zujCY-XOjc5#bNBz=FkNSPUYNWZ*LnF6Sz;Pcn2HGWji+vr5W6Y9aj{L?l2oCxB{uJ zba^NYP!RCB!Y*rmf+F_#J6s^_4Ky(zZq@4N>i4FFC$=sZ^{%IZxq`NbnGJw|No|ME znLLY#01YQeX;r;LocY>kz=IXZGarqDn0O`GyMZGEXS{plzyr3fT}^A z{qBb1QsE@1%RoXSxEfdhtZX%4`8sp-gSnxxhab35dcScBJS_miU}k5oR>eZ=A4of8 zcBMJ6m~mOQ+O%s1mjKnuzYvG`-ox@kmr?#(o>^@%-qQEy;NW;yfefkl(Wm1cN1>cG zxcV|3&R7R=rG?gm2PYL!n6$7P9~6zD);xYMc~M(-jCyo!i$q;Yxn94hJv zb|wtUXpWs^CI^;Si!pR{Ea-sRhmCR!GNh45dhv`GeICr$*`m>VK=A-BFBE;j#1=sn zfl_WM zaP^~_FS)XnyFeB#vK&j3Ie+mYetYlQ5W7eX++BcZ!$~>1B-qXhJx>4Q zm;*Ko(XUmp%l>`!Kz7j(AI>x|gh|2%pac+HFF;}jO3E0ybQS2q`fO0d6|Rig2JK%y z8o{!G{HH>e7F5mPGi7@VAw*MX%cQ$IBzcHBfo3(*Kj{UCt3jVkE#LxO-Wrx8^x%X! zg+7x|@x!~&rqTCiZoEwxfK6|XzMQPAEJ$s>Y$bm<*LVTtx!*_qD0PCse7b6ZY259r zaI=jPbie3|J-x9y2@I+?aoCh;4>#79^)5UX{)c0kurAk2c9j3Gt&=}#vAK2*sv)5}=ZI&ULjFTFOH0enTtldJwwzTxeCXbn9lN||m0ebk zFQN6yANlJ}=<%=@4Rvk*JrQw`Vu8)02T|YYK3$25Wc8A7bAf>0ZbBYUwcBbv?f^>Q z>Hg`M{^roCdJ#oF@RtkS{y5r)e=Kup;pB?=p#we*IDe08X{2 zYFgPH@^`~)e=!1lJ<=zNHf}#c#mpZ3i(5dEQ98MYlHe)-S@k0BeR~b+zaNetv%0aI z^p%U$egk~Cs;Eczu28Y0%(5`cO$Jme?rN{Sw>c~kTSKr;$h1t0oN}s@Mfj0#F);bJ0AwgUNm-fu9$Pr_C1ZO8{+#ibvk>PAtIHaoC(p0 zNOh4Xdw3@lL8~{RP-=;g<@6p}2r_GhXsCAyAx(QoC&+|+#dfBuMD{XsO!*#~3SO;4 z0tre?6q(0=ekaz68BO#*0}3c3iH)T)CAtJHt)Vcarhhm5L8?QzHNQotu&0ARvZCXf z?cgi=MV{rNYX>Ot_QXJ-IzUTP^RAp+q%xKV&-#-i{4?D?ZcE~Arw`~H`|~}T?$oY~1Sz;y9Uab8~_F1T{?@z}-Zu0icB=edBhlg*ym(8CTwYDUL#U;?JJK zE*JbwI6}4+Ov(#C1`l8>P{OsXa(dEnu?PysNyuzYf@;4Y4iA+d;3xnV%c9*F*gnRt zgq2(%v@;Bs-JN)cfj#)44_K~nV}p_1Ju^4f4z2QfQ{V;&y8J+%H7XisQ@B>F2Q5|r zFTvX5a8L0=R!MXD2@Y=?D7!#aHuMzN0cex?u>A2MK#N_V8v`#5)s#apOEojlx&FFSy%clq{=Q>lCsFta0`5+mj+AzPkQgC?#7vFLKz#?KfgqgWp)sv$ zQVeCl3LsYC1VD7g8gN18H0(oYqWKF7o&5_NSqFxOLVE??Bqn}rXb7tAy9@C6d3E1e z->GYm+V^R^eiB5obM;#pZPuXCGwgo_(uBCU3;vk?^&dYn2cuBu5CgIVX^+e)hzqB!E}lUo3I!wZSDj8pc{Cro;PU|{ z-`mTpvK(Ol#w_2a45GHC2`my==uCek8e`gj_eM)s{y83=Zu4^&wgN7o4*)_=j|#Ma zR0Wvtm>ZUk$yBC_hD3Zz zqYxn>VF=R)W)TwykN>Kc@*u$CuSH@WcuE5k%%%wp?%gKz8hB zdeKB-Rj^B}$Ufu|mjR2fyom zs5^Jv_viC{JU)N?&L8*VaqGO_=QXa^bv>`~dR{Nv*K6hw6@R=0By*QRq0L3Q9pn(; zYXyk4xS#AWa4{Ksjy*4Uq6|$`+(7U`{h_EF_?!way@zn<1Tb4k6wLuwg2csl{m>3W z@))$NJguqu7MvP5!Qh_Njx$Dl+Z@3mkF2kPh9i@o?7B*z5o3sT=TlREfm|Sf2bBS* z^MVUt!u5#pfn8!Oh}OIm!9cntJx3K~vJo{lE1sAfCIHTZ6}Wix{*(fQqPl^`OJw&bVOls*B+GGRE^GXld+K%P=u8hJ>!`cO$QaHpmBm*6{? zOXRDdT{JYB684{MgNT6G@!OVS3%}VGlvfx7=`Tfyu%Q27<@S^wI>kM^ghH`DXxO!M zG3|Fi!0NmWAl#uU#EvbvswjO%YPQx3A`#2C@z00t2|s_IhzNSY{u>E$Mm6%OwWgRDtXR5yLidL}) z2Q7>TMRZFgrG=bi(iLeFoA)hc_vCrjMkL$ymB^ ztfKArO^o6_7V8^xFO~@_V}?&{L77r@GLZWH0=U5{jCPS8OZ9bb4V0wGn4@(z9$lRn z?c9B_4gZKA+ZQ}?5l?4-xoPyJ?RJ+3mB{%L>t|GYIyaynIoFKK%SeJIE23?iRF7RF zkJAAJ%fdgC4yd&#NF4zL2PyH5Dp_R7M+=A@=K5p8x}tME#9jM8C2TWUDym59&#=%f zduOJ|4E)Fe!K-T9+1yjA0O=$3yc?yrfN9z-X$A`h?9saO&0-Y=5>9VN9(WU}phWKb zQf^T-&J?DVVBb9HS^YpMaPvO{_!~zq@pHdE$`y9X6VPAsx$Wds_}y&hiwHbHvzgT?UJfnswP4*VNfck)Z{&6v5uSm4U6K(7(%uZN2F**{5M3J)4cC1jiMLyX1U7r=Li4q zlS3&^o%`eOpsw~;QWI=eO0dvx`L8bE(egItjph-vJ67B~#Iuxj`1TlJ44@nm zEbga#ZiLF?yd(ac=;{t_z3U<3nI-b!JO0Xcx?pgLQ0{wm`*3@1>fip!oD2IHNVO!t zVxrx(-|U#b^%W6Y;O!fQJD^|?m$q1mVfD4cQF_9GJCwlQges$Q*6W6za&l6brTd7% zqmL#CqRO!u;QRwG2`JSzCzRRIH7qM&t;6yTl1p3T(UAmZ`Uuxh~eCuH3V|M%g+2?~xF1a@bTr9urM7*poQh`b0 z=EO?rvGq@p@Y# z`PyoZ<$N$4f1r_msg}vzJG&TaoQ!s*a{8nW26=^1Yr1{rxxR%6Gh>FC0lP8%EN z=sXtU;o2V7Cro!|g$Y+Z8nEZio#R|pf=uj`rp-A~M(z#b{gGy~2G%kkC{b2iQQ9~4 zl^zI-?JFi3ZAq^IkcA=jfK)P4lXz^lIv_yNfqAg1z}Fw`mh$vfYaA0xC~_4Wx!n)! z0m5=}UjZ)uf&m#yN0S{>G06eyy=Z&pzOeG6>{^3 zb#0*r!h!kT`c`FHZ#s0%>@Z&628q)vv@nDDkuIm2Do~>7*Q_+lmce(~TOZA;Aa7c= zeeyBweuD^l5iDd9Ez#qi7dk>}_a|i&jdGSY$@NZ!>{0TxPc6Pk`a_L;aXAWOdSQ$PE4Eqs>`;M)`k0s?| zaN~pL-2-2rG>^Y^#GBLKu_K>iG`H&b2a)cXASS!(14zH>4hTk{sc?ZP-ui;j)Buzf zX?O6o(cOxQ#5fR(a#F@Ti%`WtWX{Yd`sQ`=y-}|W-JsHpE|<#1&BO5(Ck5m`X=(tX zQX%nMnwm7sWV{Vf8tYk9`_;k?K_iRvqebYI?2mD4i_N|tT(?>0UZ>-WuI@nC7^tc5 zLuB0Xe7i^G4!RHu0`JMA_2`K+XKD=X z=4upH^B}kfdz47?*+frAC*k3D-?e$)!NVOPv&X(g4bU(u#Aw;k&PIL{JZq6ncg~_M z#y&YI2@>8D+IM0r=AP%Ktdt0SEZ1R{wEfg(ShE7>YQzu8kX*i9)exeL)b3wB``dh> z>;k(GcT%1LiZyU~Qna4VHQM=s5SFgXk`hjhWalJ75RtcpS*UU?TNTvO0ez~e{4B6L zoCjZQiuI7!=-Hlw(@VKG`A0b^KAe|a#(n$tExzPwRQs-QMmFK1-ocNJG%DVlrS*j} z5^)0`tgd;bLjgjn(Tade?uo^Hj2s$CJ?)LiXe*bvwmxi&^YV?aItNXuxFp)T+VIpzN&-36eSt)KF(_vN z&+qn1nCLg-&I)hOn3ZLqQ*97!zS+}0z5ukcbTx2)JYIi5V5IRsPNTr0@z|r~10ldk zSuf;|BzXJyI;y}O2INo->IbgEhkT0Xxt`SPX^8a7&Y(CgR|fo|EZRI2TmHZylA?DN#V! zR4*hNJwR7Iw7-wG8O=+Yq-^O09wR$1bfQ~2(r|CoWX%Ka*_KtzRnwW+wCAKaNN|4= zzZuQy-cOOPpx2z%odwpOA2fD^sxnfU^kP7&A<%M-z<2VXX>ca5q%5TatYng?C0r2( zpVoQ!-36G}Yt~w1-vo@y7Sh56-_+KUTe5n76LH_ileMvp6s-y38RHY6{z7|=!F@nj z0pd%9yfvHIcit=w^VrRzpQ?<~K{UKsrmz)xDC)E0CS5*C7iuL{Y^kk&p6e1l2Oha_ z_|;1-mL7!e>geedq#2vc$VE0iJkCKMH+{?b+vo{}C{5|s*Zj#j211l7%W>06MXs%v z>m6?HYF;H>#X48*K6!Gt9@k;2|NJ$L(_CpHUm?zk$C3hlC{&$4p8!2rVms;GPG36E zl_q5xAHNLOITDiufswJU`ftAa4FH4(N61Xq%RF6JEY!;|d?u857r}35{6Gv*Y1Xw1 z%#hLKrMQZrrUf4WRkR5Om_wm}{*HPnHu-fF_ov}0b9~DuPH<54`U*QhsjVmc`{IWx zf4o4WmLEYSslNa5dBIeG!EmekI4{)$ps2=Y0`6uYNYLkY)j22?|J!=DkvEfdpcwDq@q9 zKY_`Dln=AiWyNgsSL0(55avrHW0l8!i<>-OUIu~2Gf#B*0#R29!s@7l0)7_+s?ewP z`@SVOd?+vC?Bj++;e`tqAliZ+dHkd)$E+TCBS1gM!D83n2t)@Fdt`L@wxh%}k3SIR zVumWf{l6h09SUa#UWHF=4BXA~%Qld?0K&2Nx+b=(QZK=}e}p6o)OGN6I%@&*v0(HK z?Lmth{!o#paYwco#tZrn5J|k&o%JNEyTGWBahcT5im70?8$YtPnEJm$fK0QIqtR{E z$3V};!6zxn9WFOOZin$bnB8u;ehzHv05PFs;Tc*+bMZsC5)2KaK1%Vpm>03q0k+?c z$d8p7G%9L{q8CZa$~w-xHtvds>sde?U9Szc*z@bX;07UzOwdACfI~a1^jw)C%U=Ca zzprWj1f&PuzV`w}ArMvD$3rq1nrPIW*Ei9j!c?xz_XyQPU=otJ_P{>QD&u1FCZ4aT z%jK3<&kG;ZKSlN!-m640>l+wA_17YF?VK6wY~PzmNT5|2Qh-94ar0=?Q%3!xxaglJ zghZ-jexi{}2SRrHXxZxJ4mv}&^V|6>>l+$A7uw#MbnJURm^I7xOQ=u9-M}E3GF13+ zsB7rbWI$M0*tc&s?zbK1X2YMifZX+ili&-beU|B;U_<-!++<3duPBc+L7H}N;8g+y zMN`D_k?cJB=VS13e_vLfKLpc0*XEd@EAHOyof&Qgu`qgO6{A)25NSLB%5^ur@Jo+3 zx1Y1z&&WtwPw}S9N=nW{K=gV|Ov%#VCG43gH*giOCqyB?3svBs+8)|htj^3_(LZ$Q z-ThFl#)s#d_6@|8kROK#-zg$1iiqpUJf~TRHPiho_X@OI%GrP!9r{Ff z44xE&C~R%XE6LqJ`2RD%8xO|HWB6Uhl+-ERo`;3r%PxJQ6j((8r0csQ^nL{qH0Vr( zQX{x=)5slb#C3SlR(Yf%&k-V-$Jp=U9Y~R+s_U2kth)lc4gfJ`{l}4`0%xz>d-zb5 zdUa3|Epn{E86jH$WHvwCdej1fddnamr*(A3AwLgm_yOhTz-BCNUQ6D$i!H)2FTNPa zwfpn3>`ybvx_t*iE#7+gA{ydn5RC)e9>pmB=2OM9%U=$+yja)*wR~{XDH2U~i7r&r zhp7s5T|fHd7RWw^qVC^3ZmKHvXI)%n$53>x@){uEPh?8l^iLNRCak~lkxU-? z^HFI#&%o=G2T2PkFw{DUfv6#h=;oUDaP*T~a})*d>`S9Qtt>o#$Qq;BcAi+tYm?RL zatg}i#p^P?*IQ7rn6-+Tqayq?8O9YAeNV+3bMt(Z4_8trz^&n5jP6c{hd1VZ z;rfrp<0v??<#K&nI#^>uP9^aPAeSOOI~qO;#$%$AA(E3P@#d}eJ+ z@6oj$i&1^t7>EB1(3J@dhijhaYANb8WT9`G>t=Pke4w?d+h`GgylcKgavQ_kPR?%J3K7f&j}KF3K!kBx($1n`w@bDqVLT6B80150RVT z&tT2-^(cbn*T4NDxnuAeZvOdx!h=3Uhu4@z(z(g-Ti<7}?q`W!ar0QmB+g9atexY& zI{UY3W-g^ql{aTOO|uhOh@saFPR<6RR02e~zDY%}Nx?qE=T)Y6{o^Ykw)Hhr_r=f_OFLI7!Iz7IdozIMkUy;qxa)uYTxcGB$QlXob^yS{G26aJ3s%9HC-HAYxlLPrd!&CPE@M6yFPSjom<*6wI z4yUH8B)2e9p0KL5Zj5k&I!y?X08OCJ`!l*JM%4*MTnNV=zfP8LqQH8U_h78YI!yX) zZx}Cj5h&u-^b+6kHRj^mEkMCN4rm){b&9OpHJC%P1nBC60D%DyA1BnYz!d|eKI%<# z*#bX6E9k;k2cL!pq}>2iy&_k;|5mBymhF~^geRt;+c9XnTb#SJIw@!nwkz;A+uBYi z-57WWfeK)di%cHW{_w(IR#hZs0Mb~1CSq!07s^BHB@)}1{=9Er9J>ghM(@YMa3+d= z0=6)yvb}Ow11dt1l3abk1X6^_X#akwkn`&GBLp5K>-bdnNnPM46owuw5aih-=P?7o z<&K1HvH;z#{VfZS;JncH+S;-)`HY^Po{lBdv8h0fR9Y3JN|i5g@{_@;Ls>Z^w`~G^K(kXPIG7@!k8(x(#w{HZjejZf8c3Tu<2!i_Go-`FnYJtuW>lNNWe(puA zD8Pi_F<}YcU(yx4n=7xTds7A45$nO%k?moUz_6StOG^_0jLXV_h%0(NNqhtIIJ|ji z(F9|8_DqbMl06@4y#IOc4RbnCsE}SO zPawP${nt%{e)nH9pWbY+f~MKGADN^5Hc-U-cO}irP~EP?V&7TV=$4JI)y^xW9|r#R z*GDB9SZ$@Qe7!!KAGvMu22~K?c&Hs~Gt4)yiv^$Irus-E9x=Y4T@N{uY=j)2TrRfT zhGN@2qpf$`;u&Bt#vUq>b1$z#@l~B;X`?S(0f6G{Bb<=udd3_T$q- zIudJ<5l~%fpcB$ss@{c9X))0@z)I$jz zRJ1zw1%B}VQHrMX6ObGz{edekCE2q5SzA{Pl#nWJ!)FDTz$F&_^rLi}r)s^NdtY>Q zC3L%QmN)VJvpNej`CxmsXBbdxtPgRk!cjH(^b-h4(>*1?^sG{sdx7RWO(W=pO<2!Y25`dZaU)@O|WmxCrVBdI6X4 z;gz4pF!oXx0g6Z(jLiR^U)xTPFUU%*@)AoQ783uCV5nijaLq9!_3#rk966QUc@@?A z)6m6UQfW20)Qjl6cVx8pJ|WSOrne9sLBbDV_YI1+Yu(<9}owj{U?sRSsPQY&;tqt24on z4HaeGj4ti!CZ(603;0c%7Me%=uaT3YSOemDYgVZXhQ+plE_Tj$C{-&^* zW8qsIh?JCX3;xp@2RehKD5e1_vX)4STRim&GSYxFpYHuT(u71N>be*#kUZSrgCc#m z`J9?|i`@d3-knt;lyEL~FuGOguy9OD9~kUjkiY`%#VWsOlS#|=bGkVja_ z;&lLF{yOf=?Ef3?#3Pyl;>PXslcN(j_u7=)XB7$OlsOTgJ0Nv^159%N0Fz?7#5c0I zAWM){)wujif#gmxdOS?<6Ih3Le9{~6?#m0!ZRAuxj=la4D#NY+uowbu>p&U-aLxN} z_EJJwAw;ZxoBg?a1i#GwUtjohb$MQFUk|$eHY>e{>kzrslIHm3ov@)0WMkV1S{{R- zCEg2ps<{otMfRV^1(8qu+6Y&2LsA?Y4xWLL?*n z?xZOsop%cQt@~c)8-dcg4OKu)ducrqiD>TsFjuS+;ymHS`rNfAsjX*t+c+lv<+YG> zu2YNf-+1R@p0!+$~e`4n|4`&<8giUd-yT3)oXkDt}{+4yFwk|6ipdV4Z$A%1rhQ7;Hf2p^om<_ zC68LKFBxmM1y^m%*~gpwF+OYj>*^v^2O-L#CBsWIt&iqEw`Qs*Hq6X8E1wzy9)PO`^jT#tRQu2H7sQ6EqB<2}}=4D4!|kTD;oOxD(lYsdc-HooRx=Z~y! zSjjM>td#5L7xv?yr7QBM#^pSD1kbuahd$S5I-;kxxdufE!L6g|{=q$6Z4Pl}@1w*i zLLZt?k_Af4uC`(aqShBCihp)p{mtM0VHDvuHR^EIUIQ);xs}@|6;dwkryItEGKg9l zcRXrc9P5o4n#U#86AatSJ#PVPM7gJ{7tm6?nTq3`aPRedBI9Zolaw^KGGXHN z?W35!@fqiNOlS|3p6y>}z$)y_GN>P86wBNrV+Z8cTU*@1X-$}c~KeQdJNi|OgR z&jZj@#|Z#E2^}Ga^=WbiBcP7>klo6AqU5yU)8{+6OGi%Bm;^o_ppGt5ySRTu2xDbfw~z2cc<9o;QvSSAVQiwP4~}jC zTZI{rE{t=Wn|SJ@CVPMh>PySq3*`UxC>@DZ_L?tsPe1DFIhsAOM?v05dN$m|Ybe?J z;8?fZmzREgR6Jhlv|+;*n2;QxTcJK%0X;Lon+{fi8GzTEzJ zibv8Ph)1?PveC{Sa3M`@-QX&zzTvwx+*TJS1oU3$i?B>mKtY5(hPhD7pCtYySL=}R zJymRP#d6L&u{8TPw}DK|b#^2M?nZfc7Iwal82<8TkCyGi_Z(Iqx8R17#WQ-osdwz+ zranDHlaHR2V$qB1TX{Yztgzg1BP}rdH)% zgw#aEy-j82L{e)z+Gn*Y&>#4NPe;2bKbP}tDtp_QTeY-2bLCciyUI$SUQgBJ%Vg$> zT%%wL^b^}oyEy!f<2UP@jTC-Dw=3uxsAFho2myaBt$Xsi01M`sbw}1M#9z@l_;Y}M zn`%Ie#+|aGHZu0b18Mh^rZ1=&e3DM}e&C~7Whb+5u7nSIb=@~$q99a(+dIrmVwr!@ zrkKM$<@7cY#?v{<=8?o&_30AGHid=z3Y#gngJ_ptsq+E?4G`k@Py-_R{xfc0e8O11 z;H~`9#}92U?ar!`y5P#~vPUJJY0abB(5_wMO$Ykb68B`S0JxeVLK~D`-Z@~4#-(%G zUg1kp{)$P$pC>CNb$EEaxeh;=ntB9$2=-HYHuutfcsMT2RqZ-E)*-6($m{XAuY-Np z(!kmqpS2ayHU6_U0{r_baJ(zPXe07w50e;g%ffUs*>ZoJjP<2)X|Dy1fluZKh{ahI zg>y7dhb(O&94ICDmYmO%$I$)s%LCXO&r3%a58-E1-p!NY*k%&aw_kL(m`P)=8%*c* zxF}pJRvsfU*4FAmH|ascNSq`iT$F+U*N796*K2n8lSSLmxs0JNa8pshP^5e6z&&6Y zB9p)Awmg=IoX@GY+tMapCj+E1;6IB4Dsy=?1VEF=Id|QxU?~y(*>Ppo$b1nPV|KIL zw)PsnsOS>7YB)4lT)4l`kiKJpv~) zNPx|4wWB#lY#+U@8<4eVp=a0;$}tw}{FdUCQ+A~1tF#SZ+ zV9w)K{2MJ__Nbx;DNR9@i-s&8jY1I#<=?nzot08)fW3*~)INRs8AK2u%9U$WItPRV z`}XfYlgbY!>PO8uukGtncd3U`u+b(dA0_ix-Fb`=8wu8-9n7x!rl3b7wLx)i5T- z`_4yIA!DyWd&`?9cIGGVlvx4~-i{sFq6d<_mpjKy+%LonNUqgwYYEX>E1&m)z92`n zih)85^uA?R<0o+|4JOI%D_;V$;X3!bN3C=wZ-8{|BDD_?rOAvhxRkn>;O-GSoWoIF zjW1E4VfS%yhyk_8Kf+q&w!veT$LD158x`4|Pg*|Yl4#IFrI@TW}KE70=;BzyswaS2H8endS$iHEaDpickgqOldYB1ZP$jU-ZIY?E$ zW%K%w@0 z$_a>_(>whh^asF1ZowV_n2c2I-@XFOHC%W$r}MvCd15f~2vb^UKayH7Yxv^{TgQyD z+`uRn@o)M>gdld~m(-7FYygU5?HRmGAxHxM2#oOsqySW2jZ9k-O<321CV%B$eqh%x7-`t@aHw5J_!YEZ_d9bDw(GhN!;okH68Yn96z4H%fvLf$59b8EXHT@3t zUR@BpVp6>=oh_K_3Pd*0Dbe4oV;Y$39}c}0#)?pog}a$!{IwC=rSZ?UOOd?v(bSY< zUN)$Z{fDr){EiG{h#k;^(yTg+#;ha#j?$};8s&|pJaHm&eJTGefd4yx59)3=Tq*VS zu--QP^}LR@;}1V4kP-1Iplbd9=$rlP3zv8&*Pgp7oYOfofUP-nMDa8=E^h5R*}1SA zD#Lg66c3yl5!bfw+B;$BJA0k-q}5#OOyahE=gHVP+SRXAsxeqeIgtkuklY|>$y3s5 z(A1J}$|xQnc|cVZ#dpnl2$wMaaZmf5@;UjTh7Ql{@`_YTIa$vMQOo9_m5NcLrH^8Y*yVskkd*ayM%OYt| zR!$=o(=m-BD4;fo9Sb!-Na0gT3685+TN2UBdxEATMmu*1s$Ai?`gAMr0na-<=MoO9 z=gY+$=dH5Wtpd-QKp~HkNXe+Gt(213FygB+%5;Z@`J61eQXnwF+>;|oBcLZIAdnHI z$T~v#p!~+&=4qyeQ&wt)ys^W|3uDJ11kuvVtFzSaD2BU{64c}dedx(_T`%pVi@hoSPp=zvxpzdqeYv*hoy;Zs^Fvu4!tRCZt( z*5DCuc>D<%dw3Do(8RH5^|U2JJSZHVnXsx8V& zDWNE4I08+aMQP8ofkt4~^+B*t|77}u`-Dbi<2R#^d=5h4Ppy07`l%(h-8i*xLs36Z z?NE%{^LryvGogu@(YM1H{!o$jcM&0ogk=43*r=}{lf;j$>??3JtZSp6#b3!MGrG0(z2a$!2%-G<$HJai zq0g?&h$c1~Nan{{D4XLo({J*Cu}8wrGi}^i@nJ6K>|N&bUweCc^wVh){DVjugTRq< z{|Ax$p<3u^8ma&Mo~jbkkf5K7dRojI_84?o`?@a6e!HQ|)D&_$F|04VzINd%UQS3| z=h{#n&MdR%k0^!yc~19P+iiVFcg(x>(xG-f*wFSvS_(R1@$1^~w^Ov_&_(-E^ZW8v zbf04EhAwDxZ;PfO6Jq{QODxTvD146#TEQu1knWcmw*-il+XjtTy zI(t?nQixE9hI*sbqPhDYe*>!h-LcI`J+Rl}Kq6eJwHUg)unj#3Aru)IxE?r*Fb~2N z-f@SEN*JWmZ)r)1vBz)*biIM~M}dTAG1HI^DE?WNtFs~C!O-W^U&+1t66w`txg06k zO^*;t8GfRNoO-U$EWhR1+rb*!QHbRncxbhk@Xrc?&#p_ty!JZKvuPjPD^6WTO61D9 zHfHAk-#rO;jpY@nT8465&qL`0aM zWED^q;o9Zg{s<_0-l_5KhX8^!eFYU=N0K6bMABqfYfO11Dkqo{IK)b_cLh|S+~CDlKKm}=sGqV zJJc^xJpf~lQp6lic>3T0&!pE`xtvo1HiONnXrPmGP?jCH12UU2Uz?B9IcpO;Thc+I z1|%D$vpfKC9j3JjKC_Mkr(Afe^f{gt6$xe8Gdeq8QVf(@Xj@>iQi1k=wD|!S4lrmH zk25*6fX{)cvVi{ZSk<#f)@_4Wohsr(5}*1jq;8*-G*9UgMh z^?q*pmK(M+n(UUcC~RjFVbhj}fdZx}DJf|-`&q%x#}Ll0t}Zz_xegl_ zD2w^G_jhYxdS>Seg|d1MTo^2gxgo}R_1z-?L+QT9=&>qz5lP;#Y3F{}G{5>6Kd{Ct zbn%X3X`o`GR`;8R?82L*i%sk1``Qol{WM|&bRW|@urBF?8<6$moN~VQ)@bR$n`*Q# zd|vW7O+9qw#=eKJ=yxU7B~76I_cBJU9PLl`BDzY*Ex>@;8UZkf80<43Nrkv>K$_6x zgckJSIRM<60HZ^C2K)U5U-Vvs8w3-dotkNACd;@=kXKJ5uRh}tRM5koN{6~?rBxMc z4mGXtENcDPs#@~{Cr+H0ot=&5jz37UH606`S4&ssIw#O;K8s~2lyW#_g0R^v_lI+4 z+#fnR_u%T8nyeo{a-%33B{vOTryES z#PZ`UTxMO|IwoeMJUV8uQBy1Y0CKsG^@>>zO*75tT2&T`#>yN#h*Sy@o5F!P7}{n^ zPER9h*@SzeTjAK_JzqBj*Fz2BpK?)*3g#_QS_|hUH_hYU5cqw>sr%^4MpzR2`N&Jv;+#Ec&msrB_&T>xo4RV@w?0;yd65Bxv zRq6-Q^kLT`Zx2;GaphLtK^|%3lvp2(a?`9L2a8V`cyV`7+Bwdl;t6o(w6>t${`r+C zl=uJW0cHPGy`2I7FgQ|Yo~@Vv{6p&?`44M>IA{aBmW9ureM>Giw2?_=kGAlv@4wZ> zza{nrVoCxN;F2@#<|TC1l~Y!|-#QGfka4a@l=kE)#*&XI(sxrPp!wDEp5_69uJpNXIHc^oFQmGIv@GM3eFZ#b0G{R;D;Sdp`CmS6~yn~ zbEAPd+A1*1YB#Nf%jWT#&|iUz7FVtau!#8p&;Zsj8Eo z`r!6MUrUqPu)%Yt=Xp2nJ`**;2oM#0eEk`3R29>N8!I)bZTe;ByY342ic+AidJXD` zDFR?{Oz#>K#nd z&E7(SBpwDXcFTsdph9!)x?+6Gvf2`fxpubf4rmdgA*};V`qwheU#sd}cb}MQj1%$h zQ-)R{yQ3G+RtYU$9@J4j8q$Qjzn%uqTH%k+zQ#1njEKMD$yQi=6Qs271B;wAR$}`( z8fUYum#KAI^gikZZkm^$=~Fj@_mBI8tm)<5$F#IDb`iEjaE;y*5rRM+vESr{gJjO; zO^9wrp2c?z9c>n6w3=C`yIz=0XU7iI%NSy#7DoXa8{`!K-0=CA!fyTFp6IY1WCwR> z@*7Q2mV&8)Kq_EKHj{fak%5tcn@%pvJ`xrWt5+wSZmAfhFlw?#$%?NMB*V6Rq|rtu zuz6#41XfxLU6FTvuggSW6w9bLx$sm?j1z?t*_V-4Nx69gct|`vJLx{yCmnF=sy&uW zp(y=bTkERu(!DhH;Y~v@K1R>{@m5!PmP5}Smc<>Y4E&0NZ@@*f={W4%rl>T6+1`6M zjh*~|@DF$wVISjG#9;gs$`oM~iasnXNO99#cu7#GptRqA7IpRBLo1@q2d)Y@DE9vS zwQ|BFn1?GEx+C=K%0fX^D0ysuoV`o#_NQTSM5s36Y+%qrVmrU=WSdMmK{ec60J3J= zix=yBb;a7)iMi-2$pXG)TP>ExQtx8o|7Gw?B@@H0ZSC!Fuga|ZhGfGXxn*eHUfdTY z1FV~HlgOB28}|K&4?4p}6ur5Dru*&hZ2fL#>i_FZ*Ot4XTZcyGlbSP7k=O-I9^t;_ z<42DuwrJ|=@|xW(FE{epb~S&pUK_Qj_mS<_U0AEI1Zy@pxU6D`-1r27m$UZe&kGAB zQZ&L*R&XV8WF!_81stdkQ-6Hi^}kXyK5&FtY^B(s(b});E;>>%ElhyYJhyp1<1#2V zzRd&8dA97cNrf~6V4?oocRnt6|BCXXaD5jtDo&%W4*czVFOhc@dbf;3p3hY$&C(O? zf48@jTpCVvI0a6TUcly8TSvE4VQ(;_YT+@PY#R3=)$775b{gyGJIoGDTc0K!Jh??` z^UDP>-X^lym)=h%ij$<4%{}BZlYA|)-FH8U^`mL(tH9j;tKi1ZdpAFba67|jO>ol7 zwDK_++i=@Vaq^DBf?axh2U0UphNm7pq~fivdVTCK$u1_JUx_KmHSqo#&{nB|DbW3# zzZ!5c5BBJ3!XF0I@9q2b9;sxb?FOEnTF28`*lmaYK3CmdZ{M-NrlFjrORw&#pW4RH z!YUDJu^l3=o7Y75v-iZ9t%)A`!kY$XPX3F4&eNXRpKKn#5J@;^F+e9vlYMh*@cs0^ zH17?Up6bJz0)*9Rnm%B*^4*c^1&Cz59kJeA;1v}>!r8mEn4qE|i+R&30 zY=3R;mXI)5D{JXSq8PT(lM4%?+LocD)knFwelf*xO2<=Vp0GSmT`)VC(v8dTL>#9A ztZre4h0L2VoXJW>kZoahR}<^W+ukV)&SN5pV;%7T2>b{)6dlq}(xw=0Q;j&>aGDC? z#74Ehe;<0QySrNuy+!eK+qCGpY~4cKmB#Dp(=rs1yvLW{mq&k3B3ih&v2>tuP2d!I za|#;VKFaLA+)92+vIvOFoSp0JQRFnUIFgUUthOOaJYpmz=Jgj$EH<5_MW`7VSsROL zbjQR1cA1--%gM>HDU4n#-lHgXn=EbH!A7C3Z$3rPNfNX9kW>2XW4X)gNJX^y zNZ@;c3ik7mLpR4?Km@+wuVL+pzbO!Qq~qv|>$m(Z(=(?}bw@B)-@7X!3y3ouY6DZroG)w*@`O3krPoI+4a;&bm zIUu5;b&{L!4s@rruLQT8yiP*%$2#~Vz5BB%P){x?IhgnOqP=}0=<}u_PI5T}@S*ja zE2p7HH!r?1YRInQodI7G`I3%5C@x;CprAXEDqsHi@d(0_oSl6lv(-$k^#}H>L+}e$ za#Y&Q$G`BavSO7<3kpAfoX!Enr`fY7oG>yKE*F5uMkk>67K-`cQIP!i?{73(3`oYa zs_miMJOtQ?phNr&vl(e#2-0ZN4%I1OxgHInELd%SodaGx9D<015;S@!${&P2m9R~9 z>l<9aLIUG~7pU;@C;jlLTRG91EI%H~Xz);kq>^G)6%o>=Iza35u?LwKh6Z^J1eYaU+1-F5a?tvI9`mm4PhRuUU&;& zgj#HL%MwJ&etn`ew&NerCX%}frF8rNdtL%T{a+t)bDn(m_)Lw-2Vt+NPw5Xry68K} zf6T(KfTh{~Emg{T(_G}B1aW9@0-K-2U5h`u7;KBNl_^Cc;#|kx_Elc(}~fy`xllZPz&(8((tD3qdEfI*$? z%-f(_gA$P?2gUCmW_G`XBNgM!g1A>GyXb=ya{Fb9ymOK%cf-}@(=*3- zYD^yLL2#2YBVL~@L@P9fNUNZeF1uT54(iCm#FYdyNMlgA)9bC2RqpXK=;7T~eX^i^ zB~&e~`J$rb9*s}cMo(58c)b?Rw4(9jcs>*j6qj}c=@RxUFoxg-xLWG!;W$R}Cx>My z=DU5`r%ra=mLH%RjVkp*TmXtsAjQwNAk<6tKb0CWtK9zWae<1l#$s|wzuwlO$?y1I!t0ydpM7mh)xwUVjfOhEjS z8@ua;-(AXAi}l>75>TSop7I1EhvGp(LPFyNPgKZa4gkvI?j1HdKHJEjaKM)OHnsj? z-+}pQw_e;UG6=Ybn1rT;phy3P8BmI6LBiO4R$4=)zP{}K2Jm5dZl+cULQyD2I7z6< z(H`XRqwYe=QT2dN7WHvh8p;PkNTY1c?UaOwy)qxEkyd2Avfh0fu>};W%x+-0V?{ND)y(5uGE2Qmo^?>Dz}-4RRyK8fU-#rKLe_H@B8l>T=C49T^k1~7M9_0?|HR>5 zFIOwWd7bD18D%!i|1O=S3TL#a7#x zvH_O<6bjYtt%RXE#0M$fhRciQix%7;610Jww4Gfykc8hf^ziWL=MPHwFMs%r%tUT( zuDy*7b)5Ryvu9mhi@d7e#{S1?dRv%VT0C0zXgnV+$HSBO;K76AJgpF0G!c1r|0G+7 zu-S21yJr-fuZjE$Rl6O@rkaSjt_}Mu^Y4J2JCe%Kk)+Q!D9dJ%K*O&Cksfe~qM~*$ zhTY@#M)u@9>`5fOhzhbN37*$oRoEzwvvL{mA$zjaP}?A&(#m_?hF*kcm*l4qit_=A zXSwW)3EeHXQ&!F#O1l9m=b5zTh=v9;vH$XQ{MKxwKzHD&`GjJU=Jid13*{~4F>7kH zB4+3+VLEc;7pl2)P0AMckTD-Y=Y39}*~K{#p=rnwz?^YZ%a_zUN0~9hgnnaF%v4w| zzwNCI2IABark({X^jDqs(f1{_piO_YtDe}_T(r+6^?KKoL>#tp!mYP`#$EXPE?U8|6Xug?M@*(G+Dy`$C(gcQn~1op8u0G? z-5Jq-vZ7NYdk!MRWJ~?LyzTA2)4pr2!Snp(ugYVu35F`G%Yt;N-(=9w(t^8&sj`c& zL@j+jEnip>zo{QV%X2-9B_oyH_l0FAdW{#oaKz)&vvA9X7ax`{?1)?~uX+hPxYzEA zy)RBW-X{om?@PJh=T+y9vZ-srU0_MXH z^CS#(3(a}jA4*hC;|44Il^YjyLZD-ZeaW|DDfo3C*7U1g}4PO-o3@Vd^s zqTlr}-}n2Y!y_L16rR2x(trMVa2qSV%$2X_Cf~WDW!k;NJ)3%P4<<`S1(`(5;8x>N zpAl_sV{hmBT;KBX{-YI7uLkY0R*2{#@>weL?#J&;8|H zd%CBkYGe*p_%@1bM=7j+xB7T|69XcgVf{1?s|st= zS@UkWzGcNVuej7xdB2HP5tiMWzLA~%gjb{N?tDtk{lY?5Bed!lGViaSftc2J!n2t? z@e9lRExoeDe(#G{Eth6*?Y$4`=}-(&_xH;|94H(|b`c5pags@>Kcl*I$s$nt#X z@mg4`dRm7coHI%vm8J>hXV1KJ1!OR}x#&9-;i2_HXt(Y%AwpPUsS9rc*H(HIzWd}F zThP9O^|joKHE(^uo#v)6-QYM$U38&7Un{-4@6I8CGhK<8T(~J3yBv!RIMu7x&Ur_p z`ryZ|GpR?tYH+(er|P)hNmqN`y0tbPDOm^%Zq1F!vq?feliJwcGrHc;dF;~s*^oCY zfkK8<3*|G%X{#e$1Uo%7Cp(`F8JE6VKH4_qj-gjry-monFw$LqwxA=yGBrCzV$5uq z1iBwkTT4wE4+oUzf!fJX?G|m89atPKL6U%E1WMm9Kg8Xy4;EwP)Qa(SNO`g-SP^C|lb{(ca&xAotoWeZcur_1xH#&$+mj z3CTzXCxc#fY=Dfb#0w!c|D zPhH2)fqT&xwK(LPU0!w{ilpTeD1;fudYwEXO-30mv8ZX-r)R z#j9xrUV(jSoPMr?;!aqjB{n70V$ito}Uo zSaH@Eub6+u%2MRB!jYHfIZvQf_R330F7Aj!dP@Bq%W0g%SaJLK<(~1~=;;tXUBfSl z6<4~>M|X90tz21Ufab#QxD#)uHWsR8Ivzz#`lGm_%pnGfiv@(LF8A*1q6YDOpmMUMYB$DSQRJZ)@s_RM4 zu+YPd01v1`dr6~>FQE2vWTTJWEFIgON3DPjVK>!yKct4+w>#8gC!*W$0djz*B(lC; zH(XYk#Q7o~`P=2g&NT%C`Gjsv&4bl(r{G`xKB4$d^M z%x5@*x5r~N6N?+4Tw1b+f{e~JTt2j+-6!57{czQ|+kYIO61C)~iF_LL3D0ro)uaqg zpCO9#Lrp=8)0R-zae6W{@A4PhafU)0eV3}8oDz08*WuIf6j(avsln(8?}^pvCZ;i) zWe}o=rm-2#l5XV6=1iSg&5yKYx5 zO1Kq?#%f@79aP2C5m-o^5|bk0fZfrvI%m|~HGO7db&Tlt5lMN)yI65 zq0rvM`JGzL`*z>fq|uFIzq1!38dNYwXK!~mNG$=^GE|8pQuy{%smqsT>J5J* zaA?+utm1}f9WaX`p4g;IjmbN@3;1|wMYi?(3XfPSJZWBwRAp+?JWl;?-S*4-Yg3@Y zRQZqYq*A*7`q@P~-|1T>4lb{5?^C$v;f;s}*$>f>uwQM0BLa=6@7%d#iNVccsK`zx zIhyvWhf&QPD4@@It9S|%`f+ZVK{YJ_3a|N^<UIkIv7@vf*ub69-L4I*3Y8U6y-}^tJAuwmN(^B zsKRNzPuPUmyT0M$4T%fkeQ1K?*q`6IxV0L?;bV;*>*_ig9-2|Ss8ACr!@nlUVJoF1 zqNVx+mFOKoPMfd#N55^ICLY6e;?}ewHM6+2YSD&AQ&f-JGqKmL<`A$?eUP(M>A0L( z6upGa*Ss1QBYo*F&}zD-*?!(r&HFGOA*x}S=fkN)5`=Q)`%>1HFE!k3y}!16EX)6- z!V1?A5G@r4v&z?c*G&X0+Ru-NP4>sBzm8VmZE*j*mZg!kkHy_QYW_9=mvHUSCzRao zli1E_bmHDGM_Jr4^+NV8(GStOtBGoyug$eSTMgxNH#wktEOJlG8+eq;z)~k%(9YCh z_MUkPDUrcX)(VB7<0cqbu%<(zoQ4tWC&Opiyf}ab0Dd zuQ?3b-qSEeAQmUNbOh9;0$Y<4qKI>4;oMax7V}zxuY6;>}<(LDU z^U?_R)o1etnZaS{hTBb=Z8~-4{m3Fx6nqQkt>1_pL@!x207|vIOF*!$~a$B(zdg;%s}yvN2ra;Zf5Xo!Ue9gc+ap* z-gL!KC^bnBMFj4$cUl`hzdijcC4aY+&BwQ-OskWxo*ZNT{p~Gvlmq|%_W!Zp^#AMY z5XYU6l{|FM1bO?*1~b9`=ms`LWHp1l#M>e6JvX@b1d)0ih8emRBnJoo^ zl~}ZjOVlkIzx-NMedI&W+V_!C^qKkD?jA<`Ri8I5XJKbZX$6>Nl6KbFpMz;>tt88cnCj5duvzMeiQCz znQCkuY~2vg7!~Tq`_cIv6UPs6&_^osZv`LcNqYKuAf4mLxRspzZjz$M$k6` lr : replay(finishId, numLedgers) - lr -> sla : make_shared(finishHash) - return skipList - lr -> lrt : make_shared(skipList) - return task - lr -> sla : init(numPeers=1) - sla -> sla : trigger(numPeers=1) - sla -> peer : sendRequest(ProofPathRequest) - return - return - return - lr -> lrt : init() - lrt -> sla : addDataCallback(callback) - return - return -deactivate lr - -[-> peer : onMessage(ProofPathResponse) - peer -> lr : gotSkipList(ledgerHeader, item) - lr -> sla : processData(ledgerSeq, item) - sla -> sla : onSkipListAcquired(skipList, ledgerSeq) - sla -> sla : notify() - note over sla: call the callbacks added by\naddDataCallback(callback). - sla -> lrt : callback(ledgerId) - lrt -> lrt : updateSkipList(ledgerId, ledgerSeq, skipList) - lrt -> lr : createDeltas(this) - loop - lr -> lda : make_shared(ledgerId, ledgerSeq) - return delta - lr -> lrt : addDelta(delta) - lrt -> lda : addDataCallback(callback) - return - return - lr -> lda : init(numPeers=1) - lda -> lda : trigger(numPeers=1) - lda -> peer : sendRequest(ReplayDeltaRequest) - return - return - return - end - return - return - return - return - return - return -deactivate peer - -[-> peer : onMessage(ReplayDeltaResponse) - peer -> lr : gotReplayDelta(ledgerHeader) - lr -> lda : processData(ledgerHeader, txns) - lda -> lda : notify() - note over lda: call the callbacks added by\naddDataCallback(callback). - lda -> lrt : callback(ledgerId) - lrt -> lrt : deltaReady(ledgerId) - lrt -> lrt : tryAdvance() - loop as long as child can be built - lrt -> lda : tryBuild(parent) - lda -> lda : onLedgerBuilt() - note over lda - Schedule a job to store the built ledger. - end note - return - return child - end - return - return - return - return - return -deactivate peer - - -@enduml \ No newline at end of file diff --git a/docs/CheatSheet.md b/docs/CheatSheet.md deleted file mode 100644 index 3b70c7c8f..000000000 --- a/docs/CheatSheet.md +++ /dev/null @@ -1,20 +0,0 @@ -# Code Style Cheat Sheet - -## Form - -- One class per header file. -- Place each data member on its own line. -- Place each ctor-initializer on its own line. -- Create typedefs for primitive types to describe them. -- Return descriptive local variables instead of constants. -- Use long descriptive names instead of abbreviations. -- Use "explicit" for single-argument ctors -- Avoid globals especially objects with static storage duration -- Order class declarations as types, public, protected, private, then data. -- Prefer 'private' over 'protected' - -## Function - -- Minimize external dependencies - * Pass options in the ctor instead of using theConfig - * Use as few other classes as possible diff --git a/docs/CodingStyle.md b/docs/CodingStyle.md deleted file mode 100644 index 0ff50c780..000000000 --- a/docs/CodingStyle.md +++ /dev/null @@ -1,82 +0,0 @@ -# Coding Standards - -Coding standards used here gradually evolve and propagate through -code reviews. Some aspects are enforced more strictly than others. - -## Rules - -These rules only apply to our own code. We can't enforce any sort of -style on the external repositories and libraries we include. The best -guideline is to maintain the standards that are used in those libraries. - -* Tab inserts 4 spaces. No tab characters. -* Braces are indented in the [Allman style][1]. -* Modern C++ principles. No naked ```new``` or ```delete```. -* Line lengths limited to 80 characters. Exceptions limited to data and tables. - -## Guidelines - -If you want to do something contrary to these guidelines, understand -why you're doing it. Think, use common sense, and consider that this -your changes will probably need to be maintained long after you've -moved on to other projects. - -* Use white space and blank lines to guide the eye and keep your intent clear. -* Put private data members at the top of a class, and the 6 public special -members immediately after, in the following order: - * Destructor - * Default constructor - * Copy constructor - * Copy assignment - * Move constructor - * Move assignment -* Don't over-inline by defining large functions within the class -declaration, not even for template classes. - -## Formatting - -The goal of source code formatting should always be to make things as easy to -read as possible. White space is used to guide the eye so that details are not -overlooked. Blank lines are used to separate code into "paragraphs." - -* Always place a space before and after all binary operators, - especially assignments (`operator=`). -* The `!` operator should be preceded by a space, but not followed by one. -* The `~` operator should be preceded by a space, but not followed by one. -* The `++` and `--` operators should have no spaces between the operator and - the operand. -* A space never appears before a comma, and always appears after a comma. -* Don't put spaces after a parenthesis. A typical member function call might - look like this: `foobar (1, 2, 3);` -* In general, leave a blank line before an `if` statement. -* In general, leave a blank line after a closing brace `}`. -* Do not place code on the same line as any opening or - closing brace. -* Do not write `if` statements all-on-one-line. The exception to this is when - you've got a sequence of similar `if` statements, and are aligning them all - vertically to highlight their similarities. -* In an `if-else` statement, if you surround one half of the statement with - braces, you also need to put braces around the other half, to match. -* When writing a pointer type, use this spacing: `SomeObject* myObject`. - Technically, a more correct spacing would be `SomeObject *myObject`, but - it makes more sense for the asterisk to be grouped with the type name, - since being a pointer is part of the type, not the variable name. The only - time that this can lead to any problems is when you're declaring multiple - pointers of the same type in the same statement - which leads on to the next - rule: -* When declaring multiple pointers, never do so in a single statement, e.g. - `SomeObject* p1, *p2;` - instead, always split them out onto separate lines - and write the type name again, to make it quite clear what's going on, and - avoid the danger of missing out any vital asterisks. -* The previous point also applies to references, so always put the `&` next to - the type rather than the variable, e.g. `void foo (Thing const& thing)`. And - don't put a space on both sides of the `*` or `&` - always put a space after - it, but never before it. -* The word `const` should be placed to the right of the thing that it modifies, - for consistency. For example `int const` refers to an int which is const. - `int const*` is a pointer to an int which is const. `int *const` is a const - pointer to an int. -* Always place a space in between the template angle brackets and the type - name. Template code is already hard enough to read! - -[1]: http://en.wikipedia.org/wiki/Indent_style#Allman_style diff --git a/docs/Docker.md b/docs/Docker.md deleted file mode 100644 index 9f67c87ee..000000000 --- a/docs/Docker.md +++ /dev/null @@ -1,5 +0,0 @@ -# `rippled` Docker Image - -- Some info relating to Docker containers can be found here: [../Builds/containers](../Builds/containers) -- Images for building and testing rippled can be found here: [thejohnfreeman/rippled-docker](https://github.com/thejohnfreeman/rippled-docker/) - - These images do not have rippled. They have all the tools necessary to build rippled. diff --git a/docs/Dockerfile b/docs/Dockerfile deleted file mode 100644 index d716ca213..000000000 --- a/docs/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM ubuntu:16.04 - -RUN apt -y update -RUN apt -y upgrade -RUN apt -y install build-essential g++ git libbz2-dev wget python-dev -RUN apt -y install cmake flex bison graphviz graphviz-dev libicu-dev -RUN apt -y install jarwrapper java-common - -RUN cd /tmp -ENV CM_INSTALLER=cmake-3.10.0-rc3-Linux-x86_64.sh -ENV CM_VER_DIR=/opt/local/cmake-3.10.0 -RUN cd /tmp && wget https://cmake.org/files/v3.10/$CM_INSTALLER && chmod a+x $CM_INSTALLER -RUN mkdir -p $CM_VER_DIR -RUN ln -s $CM_VER_DIR /opt/local/cmake -RUN /tmp/$CM_INSTALLER --prefix=$CM_VER_DIR --exclude-subdir -RUN rm -f /tmp/$CM_INSTALLER - -RUN cd /tmp && wget https://ftp.stack.nl/pub/users/dimitri/doxygen-1.8.14.src.tar.gz -RUN cd /tmp && tar xvf doxygen-1.8.14.src.tar.gz -RUN mkdir -p /tmp/doxygen-1.8.14/build -RUN cd /tmp/doxygen-1.8.14/build && /opt/local/cmake/bin/cmake -G "Unix Makefiles" .. -RUN cd /tmp/doxygen-1.8.14/build && make -j2 -RUN cd /tmp/doxygen-1.8.14/build && make install -RUN rm -f /tmp/doxygen-1.8.14.src.tar.gz -RUN rm -rf /tmp/doxygen-1.8.14 - -RUN mkdir -p /opt/plantuml -RUN wget -O /opt/plantuml/plantuml.jar http://sourceforge.net/projects/plantuml/files/plantuml.jar/download -ENV DOXYGEN_PLANTUML_JAR_PATH=/opt/plantuml/plantuml.jar - -ENV DOXYGEN_OUTPUT_DIRECTORY=html -CMD cd /opt/rippled && doxygen docs/Doxyfile diff --git a/docs/Doxyfile b/docs/Doxyfile deleted file mode 100644 index 48a0b5d1e..000000000 --- a/docs/Doxyfile +++ /dev/null @@ -1,344 +0,0 @@ -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -DOXYFILE_ENCODING = UTF-8 -PROJECT_NAME = "rippled" -PROJECT_NUMBER = -PROJECT_BRIEF = -PROJECT_LOGO = -PROJECT_LOGO = -OUTPUT_DIRECTORY = $(DOXYGEN_OUTPUT_DIRECTORY) -CREATE_SUBDIRS = NO -ALLOW_UNICODE_NAMES = NO -OUTPUT_LANGUAGE = English -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = YES -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = src/ -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = YES -QT_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 4 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -OPTIMIZE_FOR_FORTRAN = NO -OPTIMIZE_OUTPUT_VHDL = NO -EXTENSION_MAPPING = -MARKDOWN_SUPPORT = YES -AUTOLINK_SUPPORT = YES -BUILTIN_STL_SUPPORT = YES -CPP_CLI_SUPPORT = NO -SIP_SUPPORT = NO -IDL_PROPERTY_SUPPORT = YES -DISTRIBUTE_GROUP_DOC = NO -GROUP_NESTED_COMPOUNDS = NO -SUBGROUPING = YES -INLINE_GROUPED_CLASSES = NO -INLINE_SIMPLE_STRUCTS = NO -TYPEDEF_HIDES_STRUCT = NO -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = YES -EXTRACT_PRIVATE = YES -EXTRACT_PACKAGE = NO -EXTRACT_STATIC = YES -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = YES -EXTRACT_ANON_NSPACES = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -HIDE_COMPOUND_REFERENCE= NO -SHOW_INCLUDE_FILES = NO -SHOW_GROUPED_MEMB_INC = NO -FORCE_LOCAL_INCLUDES = NO -INLINE_INFO = NO -SORT_MEMBER_DOCS = NO -SORT_BRIEF_DOCS = NO -SORT_MEMBERS_CTORS_1ST = YES -SORT_GROUP_NAMES = NO -SORT_BY_SCOPE_NAME = NO -STRICT_PROTO_MATCHING = NO -GENERATE_TODOLIST = NO -GENERATE_TESTLIST = NO -GENERATE_BUGLIST = NO -GENERATE_DEPRECATEDLIST= NO -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = NO -SHOW_FILES = NO -SHOW_NAMESPACES = YES -FILE_VERSION_FILTER = -LAYOUT_FILE = -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# Configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_AS_ERROR = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# Configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = \ - docs \ - src/ripple \ - src/test \ - src/README.md \ - README.md \ - RELEASENOTES.md \ - - -INPUT_ENCODING = UTF-8 -FILE_PATTERNS = *.h *.cpp *.md -RECURSIVE = YES -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = -EXCLUDE_SYMBOLS = -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = \ - docs/images/ \ - docs/images/consensus/ \ - src/test/csf/ \ - -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -FILTER_SOURCE_PATTERNS = -USE_MDFILE_AS_MAINPAGE = src/README.md - -#--------------------------------------------------------------------------- -# Configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = YES -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = NO -REFERENCES_RELATION = NO -REFERENCES_LINK_SOURCE = YES -SOURCE_TOOLTIPS = YES -USE_HTAGS = NO -VERBATIM_HEADERS = YES -CLANG_ASSISTED_PARSING = NO -CLANG_OPTIONS = - -#--------------------------------------------------------------------------- -# Configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = YES -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_EXTRA_STYLESHEET = -HTML_EXTRA_FILES = -HTML_COLORSTYLE_HUE = 220 -HTML_COLORSTYLE_SAT = 100 -HTML_COLORSTYLE_GAMMA = 80 -HTML_TIMESTAMP = NO -HTML_DYNAMIC_SECTIONS = NO -HTML_INDEX_NUM_ENTRIES = 100 -GENERATE_DOCSET = NO -DOCSET_FEEDNAME = "Doxygen generated docs" -DOCSET_BUNDLE_ID = org.doxygen.Project -DOCSET_PUBLISHER_ID = org.doxygen.Publisher -DOCSET_PUBLISHER_NAME = Publisher -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -CHM_INDEX_ENCODING = -BINARY_TOC = NO -TOC_EXPAND = NO -GENERATE_QHP = NO -QCH_FILE = -QHP_NAMESPACE = org.doxygen.Project -QHP_VIRTUAL_FOLDER = doc -QHP_CUST_FILTER_NAME = -QHP_CUST_FILTER_ATTRS = -QHP_SECT_FILTER_ATTRS = -QHG_LOCATION = -GENERATE_ECLIPSEHELP = NO -ECLIPSE_DOC_ID = org.doxygen.Project -DISABLE_INDEX = NO -GENERATE_TREEVIEW = NO -ENUM_VALUES_PER_LINE = 4 -TREEVIEW_WIDTH = 250 -EXT_LINKS_IN_WINDOW = NO -FORMULA_FONTSIZE = 10 -FORMULA_TRANSPARENT = YES -USE_MATHJAX = NO -MATHJAX_FORMAT = HTML-CSS -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest -MATHJAX_EXTENSIONS = -MATHJAX_CODEFILE = -SEARCHENGINE = YES -SERVER_BASED_SEARCH = NO -EXTERNAL_SEARCH = NO -SEARCHENGINE_URL = -SEARCHDATA_FILE = searchdata.xml -EXTERNAL_SEARCH_ID = -EXTRA_SEARCH_MAPPINGS = - -#--------------------------------------------------------------------------- -# Configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = NO -LATEX_OUTPUT = latex -LATEX_CMD_NAME = -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4 -EXTRA_PACKAGES = -LATEX_HEADER = -LATEX_FOOTER = -LATEX_EXTRA_STYLESHEET = -LATEX_EXTRA_FILES = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -LATEX_SOURCE_CODE = NO -LATEX_BIB_STYLE = plain -LATEX_TIMESTAMP = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -RTF_SOURCE_CODE = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_SUBDIR = -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# Configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the DOCBOOK output -#--------------------------------------------------------------------------- -GENERATE_DOCBOOK = NO -DOCBOOK_OUTPUT = docbook -DOCBOOK_PROGRAMLISTING = NO - -#--------------------------------------------------------------------------- -# Configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = YES -EXPAND_ONLY_PREDEF = YES -SEARCH_INCLUDES = YES -INCLUDE_PATH = $(DOXYGEN_INCLUDE_PATH) -INCLUDE_FILE_PATTERNS = -PREDEFINED = DOXYGEN \ - GENERATING_DOCS \ - _MSC_VER \ - NUDB_POSIX_FILE=1 - -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration options related to external references -#--------------------------------------------------------------------------- -TAGFILES = $(DOXYGEN_TAGFILES) -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -EXTERNAL_PAGES = YES - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = NO -DIA_PATH = -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = YES -# DOT_NUM_THREADS = 0 means 1 for every processor. -DOT_NUM_THREADS = 0 -DOT_FONTNAME = Helvetica -DOT_FONTSIZE = 10 -DOT_FONTPATH = -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -UML_LIMIT_NUM_FIELDS = 10 -TEMPLATE_RELATIONS = NO -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = png -INTERACTIVE_SVG = NO -DOT_PATH = $(DOXYGEN_DOT_PATH) -DOTFILE_DIRS = -MSCFILE_DIRS = -DIAFILE_DIRS = -PLANTUML_JAR_PATH = $(DOXYGEN_PLANTUML_JAR_PATH) -PLANTUML_INCLUDE_PATH = -DOT_GRAPH_MAX_NODES = 50 -MAX_DOT_GRAPH_DEPTH = 0 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES diff --git a/docs/HeapProfiling.md b/docs/HeapProfiling.md deleted file mode 100644 index c8de1eb26..000000000 --- a/docs/HeapProfiling.md +++ /dev/null @@ -1,63 +0,0 @@ -## Heap profiling of rippled with jemalloc - -The jemalloc library provides a good API for doing heap analysis, -including a mechanism to dump a description of the heap from within the -running application via a function call. Details on how to perform this -activity in general, as well as how to acquire the software, are available on -the jemalloc site: -[https://github.com/jemalloc/jemalloc/wiki/Use-Case:-Heap-Profiling](https://github.com/jemalloc/jemalloc/wiki/Use-Case:-Heap-Profiling) - -jemalloc is acquired separately from rippled, and is not affiliated -with Ripple Labs. If you compile and install jemalloc from the -source release with default options, it will install the library and header -under `/usr/local/lib` and `/usr/local/include`, respectively. Heap -profiling has been tested with rippled on a Linux platform. It should -work on platforms on which both rippled and jemalloc are available. - -To link rippled with jemalloc, the argument -`profile-jemalloc=` is provided after the optional target. -The `` argument should be the same as that of the -`--prefix` parameter passed to the jemalloc configure script when building. - -## Examples: - -Build rippled with jemalloc library under /usr/local/lib and -header under /usr/local/include: - - $ scons profile-jemalloc=/usr/local - -Build rippled using clang with the jemalloc library under /opt/local/lib -and header under /opt/local/include: - - $ scons clang profile-jemalloc=/opt/local - ----------------------- - -## Using the jemalloc library from within the code - -The `profile-jemalloc` parameter enables a macro definition called -`PROFILE_JEMALLOC`. Include the jemalloc header file as -well as the api call(s) that you wish to make within preprocessor -conditional groups, such as: - -In global scope: - - #ifdef PROFILE_JEMALLOC - #include - #endif - -And later, within a function scope: - - #ifdef PROFILE_JEMALLOC - mallctl("prof.dump", NULL, NULL, NULL, 0); - #endif - -Fuller descriptions of how to acquire and use jemalloc's api to do memory -analysis are available at the [jemalloc -site.](http://www.canonware.com/jemalloc/) - -Linking against the jemalloc library will override -the system's default `malloc()` and related functions with jemalloc's -implementation. This is the case even if the code is not instrumented -to use jemalloc's specific API. - diff --git a/docs/NodeStoreRefactoringCaseStudy.pdf b/docs/NodeStoreRefactoringCaseStudy.pdf deleted file mode 100644 index 6cde8a2eedd968662ee2b3c49598705be4321628..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393922 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�MI6-|wp1>+Wf*QHH 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

CH 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%0DG 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∾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�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 diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 55b9e30e0..000000000 --- a/docs/README.md +++ /dev/null @@ -1,63 +0,0 @@ -# Building documentation - -## Dependencies - -Install these dependencies: - -- [Doxygen](http://www.doxygen.nl): All major platforms have [official binary - distributions](http://www.doxygen.nl/download.html#srcbin), or you can - build from [source](http://www.doxygen.nl/download.html#srcbin). - - - MacOS: We recommend installing via Homebrew: `brew install doxygen`. - The executable will be installed in `/usr/local/bin` which is already - in the default `PATH`. - - If you use the official binary distribution, then you'll need to make - Doxygen available to your command line. You can do this by adding - a symbolic link from `/usr/local/bin` to the `doxygen` executable. For - example, - - ``` - $ ln -s /Applications/Doxygen.app/Contents/Resources/doxygen /usr/local/bin/doxygen - ``` - -- [PlantUML](http://plantuml.com): - - 1. Install a functioning Java runtime, if you don't already have one. - 2. Download [`plantuml.jar`](http://sourceforge.net/projects/plantuml/files/plantuml.jar/download). - -- [Graphviz](https://www.graphviz.org): - - - Linux: Install from your package manager. - - Windows: Use an [official installer](https://graphviz.gitlab.io/_pages/Download/Download_windows.html). - - MacOS: Install via Homebrew: `brew install graphviz`. - - -## Docker - -Instead of installing the above dependencies locally, you can use the official -build environment Docker image, which has all of them installed already. - -1. Install [Docker](https://docs.docker.com/engine/installation/) -2. Pull the image: - ``` - sudo docker pull rippleci/rippled-ci-builder:2944b78d22db - ``` -3. Run the image from the project folder: - ``` - sudo docker run -v $PWD:/opt/rippled --rm rippleci/rippled-ci-builder:2944b78d22db - ``` - - -## Build - -There is a `docs` target in the CMake configuration. - -``` -mkdir build -cd build -cmake .. -cmake --build . --target docs -``` - -The output will be in `build/docs/html`. diff --git a/docs/consensus.md b/docs/consensus.md deleted file mode 100644 index 1b0063663..000000000 --- a/docs/consensus.md +++ /dev/null @@ -1,683 +0,0 @@ -# Consensus and Validation - -**This section is a work in progress!!** - -Consensus is the task of reaching agreement within a distributed system in the -presence of faulty or even malicious participants. This document outlines the -[XRP Ledger Consensus Algorithm](https://arxiv.org/abs/1802.07242) -as implemented in [rippled](https://github.com/ripple/rippled), but -focuses on its utility as a generic consensus algorithm independent of the -detailed mechanics of the Ripple Consensus Ledger. Most notably, the algorithm -does not require fully synchronous communication between all nodes in the -network, or even a fixed network topology, but instead achieves consensus via -collectively trusted subnetworks. - -## Distributed Agreement - -A challenge for distributed systems is reaching agreement on changes in shared -state. For the Ripple network, the shared state is the current ledger--account -information, account balances, order books and other financial data. We will -refer to shared distributed state as a /ledger/ throughout the remainder of this -document. - -![Ledger Chain](images/consensus/ledger_chain.png "Ledger Chain") - -As shown above, new ledgers are made by applying a set of transactions to the -prior ledger. For the Ripple network, transactions include payments, -modification of account settings, updates to offers and more. - -In a centralized system, generating the next ledger is trivial since there is a -single unique arbiter of which transactions to include and how to apply them to -a ledger. For decentralized systems, participants must resolve disagreements on -the set of transactions to include, the order to apply those transactions, and -even the resulting ledger after applying the transactions. This is even more -difficult when some participants are faulty or malicious. - -The Ripple network is a decentralized and **trust-full** network. Anyone is free -to join and participants are free to choose a subset of peers that are -collectively trusted to not collude in an attempt to defraud the participant. -Leveraging this network of trust, the Ripple algorithm has two main components. - -* *Consensus* in which network participants agree on the transactions to apply - to a prior ledger, based on the positions of their chosen peers. -* *Validation* in which network participants agree on what ledger was - generated, based on the ledgers generated by chosen peers. - -These phases are continually repeated to process transactions submitted to the -network, generating successive ledgers and giving rise to the blockchain ledger -history depicted below. In this diagram, time is flowing to the right, but -links between ledgers point backward to the parent. Also note the alternate -Ledger 2 that was generated by some participants, but which failed validation -and was abandoned. - -![Block Chain](images/consensus/block_chain.png "Block Chain") - -The remainder of this section describes the Consensus and Validation algorithms -in more detail and is meant as a companion guide to understanding the generic -implementation in `rippled`. The document **does not** discuss correctness, -fault-tolerance or liveness properties of the algorithms or the full details of -how they integrate within `rippled` to support the Ripple Consensus Ledger. - -## Consensus Overview - -### Definitions - -* The *ledger* is the shared distributed state. Each ledger has a unique ID to - distinguish it from all other ledgers. During consensus, the *previous*, - *prior* or *last-closed* ledger is the most recent ledger seen by consensus - and is the basis upon which it will build the next ledger. -* A *transaction* is an instruction for an atomic change in the ledger state. A - unique ID distinguishes a transaction from other transactions. -* A *transaction set* is a set of transactions under consideration by consensus. - The goal of consensus is to reach agreement on this set. The generic - consensus algorithm does not rely on an ordering of transactions within the - set, nor does it specify how to apply a transaction set to a ledger to - generate a new ledger. A unique ID distinguishes a set of transactions from - all other sets of transactions. -* A *node* is one of the distributed actors running the consensus algorithm. It - has a unique ID to distinguish it from all other nodes. -* A *peer* of a node is another node that it has chosen to follow and which it - believes will not collude with other chosen peers. The choice of peers is not - symmetric, since participants can decide on their chosen sets independently. -* A /position/ is the current belief of the next ledger's transaction set and - close time. Position can refer to the node's own position or the position of a - peer. -* A *proposal* is one of a sequence of positions a node shares during consensus. - An initial proposal contains the starting position taken by a node before it - considers any peer positions. If a node subsequently updates its position in - response to its peers, it will issue an updated proposal. A proposal is - uniquely identified by the ID of the proposing node, the ID of the position - taken, the ID of the prior ledger the proposal is for, and the sequence number - of the proposal. -* A *dispute* is a transaction that is either not part of a node's position or - not in a peer's position. During consensus, the node will add or remove - disputed transactions from its position based on that transaction's support - amongst its peers. - -Note that most types have an ID as a lightweight identifier of instances of that -type. Consensus often operates on the IDs directly since the underlying type is -potentially expensive to share over the network. For example, proposal's only -contain the ID of the position of a peer. Since many peers likely have the same -position, this reduces the need to send the full transaction set multiple times. -Instead, a node can request the transaction set from the network if necessary. - -### Overview - -![Consensus Overview](images/consensus/consensus_overview.png "Consensus Overview") - -The diagram above is an overview of the consensus process from the perspective -of a single participant. Recall that during a single consensus round, a node is -trying to agree with its peers on which transactions to apply to its prior -ledger when generating the next ledger. It also attempts to agree on the -[network time when the ledger closed](#effective_close_time). There are -3 main phases to a consensus round: - -* A call to `startRound` places the node in the `Open` phase. In this phase, -the node is waiting for transactions to include in its open ledger. -* At some point, the node will `Close` the open ledger and transition to the -`Establish` phase. In this phase, the node shares/receives peer proposals on -which transactions should be accepted in the closed ledger. -* At some point, the node determines it has reached consensus with its peers on -which transactions to include. It transitions to the `Accept` phase. In this -phase, the node works on applying the transactions to the prior ledger to -generate a new closed ledger. Once the new ledger is completed, the node shares -the validated ledger hash with the network and makes a call to `startRound` to -start the cycle again for the next ledger. - -Throughout, a heartbeat timer calls `timerEntry` at a regular frequency to drive -the process forward. Although the `startRound` call occurs at arbitrary times -based on when the initial round began and the time it takes to apply -transactions, the transitions from `Open` to `Establish` and `Establish` to -`Accept` only occur during calls to `timerEntry`. Similarly, transactions can -arrive at arbitrary times, independent of the heartbeat timer. Transactions -received after the `Open` to `Close` transition and not part of peer proposals -won't be considered until the next consensus round. They are represented above -by the light green triangles. - -Peer proposals are issued by a node during a `timerEntry` call, but since peers -do not synchronize `timerEntry` calls, they are received by other peers at -arbitrary times. Peer proposals are only considered if received prior to the -`Establish` to `Accept` transition, and only if the peer is working on the same -prior ledger. Peer proposals received after consensus is reached will not be -meaningful and are represented above by the circle with the X in it. Only -proposals from chosen peers are considered. - -### Effective Close Time ### {#effective_close_time} - -In addition to agreeing on a transaction set, each consensus round tries to -agree on the time the ledger closed. Each node calculates its own close time -when it closes the open ledger. This exact close time is rounded to the nearest -multiple of the current *effective close time resolution*. It is this -*effective close time* that nodes seek to agree on. This allows servers to -derive a common time for a ledger without the need for perfectly synchronized -clocks. As depicted below, the 3 pink arrows represent exact close times from 3 -consensus nodes that round to the same effective close time given the current -resolution. The purple arrow represents a peer whose estimate rounds to a -different effective close time given the current resolution. - -![Effective Close Time](images/consensus/EffCloseTime.png "Effective Close Time") - -The effective close time is part of the node's position and is shared with peers -in its proposals. Just like the position on the consensus transaction set, a -node will update its close time position in response to its peers' effective -close time positions. Peers can agree to disagree on the close time, in which -case the effective close time is taken as 1 second past the prior close. - -The close time resolution is itself dynamic, decreasing (coarser) resolution in -subsequent consensus rounds if nodes are unable to reach consensus on an -effective close time and increasing (finer) resolution if nodes consistently -reach close time consensus. - -### Modes - -Internally, a node operates under one of the following consensus modes. Either -of the first two modes may be chosen when a consensus round starts. - -* *Proposing* indicates the node is a full-fledged consensus participant. It - takes on positions and sends proposals to its peers. -* *Observing* indicates the node is a passive consensus participant. It - maintains a position internally, but does not propose that position to its - peers. Instead, it receives peer proposals and updates its position - to track the majority of its peers. This may be preferred if the node is only - being used to track the state of the network or during a start-up phase while - it is still synchronizing with the network. - -The other two modes are set internally during the consensus round when the node -believes it is no longer working on the dominant ledger chain based on peer -validations. It checks this on every call to `timerEntry`. - -* *Wrong Ledger* indicates the node is not working on the correct prior ledger - and does not have it available. It requests that ledger from the network, but - continues to work towards consensus this round while waiting. If it had been - *proposing*, it will send a special "bowout" proposal to its peers to indicate - its change in mode for the rest of this round. For the duration of the round, - it defers to peer positions for determining the consensus outcome as if it - were just *observing*. -* *Switch Ledger* indicates that the node has acquired the correct prior ledger - from the network. Although it now has the correct prior ledger, the fact that - it had the wrong one at some point during this round means it is likely behind - and should defer to peer positions for determining the consensus outcome. - -![Consensus Modes](images/consensus/consensus_modes.png "Consensus Modes") - -Once either wrong ledger or switch ledger are reached, the node cannot -return to proposing or observing until the next consensus round. However, -the node could change its view of the correct prior ledger, so going from -switch ledger to wrong ledger and back again is possible. - -The distinction between the wrong and switched ledger modes arises because a -ledger's unique identifier may be known by a node before the ledger itself. This -reflects that fact that the data corresponding to a ledger may be large and take -time to share over the network, whereas the smaller ID could be shared in a peer -validation much more quickly. Distinguishing the two states allows the node to -decide how best to generate the next ledger once it declares consensus. - -### Phases - -As depicted in the overview diagram, consensus is best viewed as a progression -through 3 phases. There are 4 public methods of the generic consensus algorithm -that determine this progression - -* `startRound` begins a consensus round. -* `timerEntry` is called at a regular frequency (`LEDGER_MIN_CLOSE`) and is the - only call to consensus that can change the phase from `Open` to `Establish` - or `Accept`. -* `peerProposal` is called whenever a peer proposal is received and is what - allows a node to update its position in a subsequent `timerEntry` call. -* `gotTxSet` is called when a transaction set is received from the network. This - is typically in response to a prior request from the node to acquire the - transaction set corresponding to a disagreeing peer's position. - -The following subsections describe each consensus phase in more detail and what -actions are taken in response to these calls. - -#### Open - -The `Open` phase is a quiescent period to allow transactions to build up in the -node's open ledger. The duration is a trade-off between latency and throughput. -A shorter window reduces the latency to generating the next ledger, but also -reduces transaction throughput due to fewer transactions accepted into the -ledger. - -A call to `startRound` would forcibly begin the next consensus round, skipping -completion of the current round. This is not expected during normal operation. -Calls to `peerProposal` or `gotTxSet` simply store the proposal or transaction -set for use in the coming `Establish` phase. - -A call to `timerEntry` first checks that the node is working on the correct -prior ledger. If not, it will update the mode and request the correct ledger. -Otherwise, the node checks whether to switch to the `Establish` phase and close -the ledger. - -##### Ledger Close - -Under normal circumstances, the open ledger period ends when one of the following -is true - -* if there are transactions in the open ledger and more than `LEDGER_MIN_CLOSE` - have elapsed. This is the typical behavior. -* if there are no open transactions and a suitably longer idle interval has - elapsed. This increases the opportunity to get some transaction into - the next ledger and avoids doing useless work closing an empty ledger. -* if more than half the number of prior round peers have already closed or finished - this round. This indicates the node is falling behind and needs to catch up. - - -When closing the ledger, the node takes its initial position based on the -transactions in the open ledger and uses the current time as -its initial close time estimate. If in the proposing mode, the node shares its -initial position with peers. Now that the node has taken a position, it will -consider any peer positions for this round that arrived earlier. The node -generates disputed transactions for each transaction not in common with a peer's -position. The node also records the vote of each peer for each disputed -transaction. - -In the example below, we suppose our node has closed with transactions 1,2 and 3. It creates disputes -for transactions 2,3 and 4, since at least one peer position differs on each. - -##### disputes ##### {#disputes_image} - -![Disputes](images/consensus/disputes.png "Disputes") - -#### Establish - -The establish phase is the active period of consensus in which the node -exchanges proposals with peers in an attempt to reach agreement on the consensus -transactions and effective close time. - -A call to `startRound` would forcibly begin the next consensus round, skipping -completion of the current round. This is not expected during normal operation. -Calls to `peerProposal` or `gotTxSet` that reflect new positions will generate -disputed transactions for any new disagreements and will update the peer's vote -for all disputed transactions. - -A call to `timerEntry` first checks that the node is working from the correct -prior ledger. If not, the node will update the mode and request the correct -ledger. Otherwise, the node updates the node's position and considers whether -to switch to the `Accepted` phase and declare consensus reached. However, at -least `LEDGER_MIN_CONSENSUS` time must have elapsed before doing either. This -allows peers an opportunity to take an initial position and share it. - -##### Update Position - -In order to achieve consensus, the node is looking for a transaction set that is -supported by a super-majority of peers. The node works towards this set by -adding or removing disputed transactions from its position based on an -increasing threshold for inclusion. - -![Threshold](images/consensus/threshold.png "Threshold") - -By starting with a lower threshold, a node initially allows a wide set of -transactions into its position. If the establish round continues and the node is -"stuck", a higher threshold can focus on accepting transactions with the most -support. The constants that define the thresholds and durations at which the -thresholds change are given by `AV_XXX_CONSENSUS_PCT` and -`AV_XXX_CONSENSUS_TIME` respectively, where `XXX` is `INIT`,`MID`,`LATE` and -`STUCK`. The effective close time position is updated using the same -thresholds. - -Given the [example disputes above](#disputes_image) and an initial threshold -of 50%, our node would retain its position since transaction 1 was not in -dispute and transactions 2 and 3 have 75% support. Since its position did not -change, it would not need to send a new proposal to peers. Peer C would not -change either. Peer A would add transaction 3 to its position and Peer B would -remove transaction 4 from its position; both would then send an updated -position. - -Conversely, if the diagram reflected a later call to =timerEntry= that occurs in -the stuck region with a threshold of say 95%, our node would remove transactions -2 and 3 from its candidate set and send an updated position. Likewise, all the -other peers would end up with only transaction 1 in their position. - -Lastly, if our node were not in the proposing mode, it would not include its own -vote and just take the majority (>50%) position of its peers. In this example, -our node would maintain its position of transactions 1, 2 and 3. - -##### Checking Consensus - -After updating its position, the node checks for supermajority agreement with -its peers on its current position. This agreement is of the exact transaction -set, not just the support of individual transactions. That is, if our position -is a subset of a peer's position, that counts as a disagreement. Also recall -that effective close time agreement allows a supermajority of participants -agreeing to disagree. - -Consensus is declared when the following 3 clauses are true: - -* `LEDGER_MIN_CONSENSUS` time has elapsed in the establish phase -* At least 75% of the prior round proposers have proposed OR this establish - phase is `LEDGER_MIN_CONSENSUS` longer than the last round's establish phase -* `minimumConsensusPercentage` of ourself and our peers share the same position - -The middle condition ensures slower peers have a chance to share positions, but -prevents waiting too long on peers that have disconnected. Additionally, a node -can declare that consensus has moved on if `minimumConsensusPercentage` peers -have sent validations and moved on to the next ledger. This outcome indicates -the node has fallen behind its peers and needs to catch up. - -If a node is not proposing, it does not include its own position when -calculating the percent of agreeing participants but otherwise follows the above -logic. - -##### Accepting Consensus - -Once consensus is reached (or moved on), the node switches to the `Accept` phase -and signals to the implementing code that the round is complete. That code is -responsible for using the consensus transaction set to generate the next ledger -and calling `startRound` to begin the next round. The implementation has total -freedom on ordering transactions, deciding what to do if consensus moved on, -determining whether to retry or abandon local transactions that did not make the -consensus set and updating any internal state based on the consensus progress. - -#### Accept - -The `Accept` phase is the terminal phase of the consensus algorithm. Calls to -`timerEntry`, `peerProposal` and `gotTxSet` will not change the internal -consensus state while in the accept phase. The expectation is that the -application specific code is working to generate the new ledger based on the -consensus outcome. Once complete, that code should make a call to `startRound` -to kick off the next consensus round. The `startRound` call includes the new -prior ledger, prior ledger ID and whether the round should begin in the -proposing or observing mode. After setting some initial state, the phase -transitions to `Open`. The node will also check if the provided prior ledger -and ID are correct, updating the mode and requesting the proper ledger from the -network if necessary. - -## Consensus Type Requirements - -The consensus type requirements are given below as minimal implementation stubs. -Actual implementations would augment these stubs with members appropriate for -managing the details of transactions and ledgers within the larger application -framework. - -### Transaction - -The transaction type `Tx` encapsulates a single transaction under consideration -by consensus. - -```{.cpp} -struct Tx -{ - using ID = ...; - ID const & id() const; - - //... implementation specific -}; -``` - -### Transaction Set - -The transaction set type `TxSet` represents a set of `Tx`s that are collectively -under consideration by consensus. A `TxSet` can be compared against other `TxSet`s -(typically from peers) and can be modified to add or remove transactions via -the mutable subtype. - -```{.cpp} -struct TxSet -{ - using Tx = Tx; - using ID = ...; - - ID const & id() const; - - bool exists(Tx::ID const &) const; - Tx const * find(Tx::ID const &) const ; - - // Return set of transactions that are not common with another set - // Bool in map is true if in our set, false if in other - std::map compare(TxSet const & other) const; - - // A mutable view that allows changing transactions in the set - struct MutableTxSet - { - MutableTxSet(TxSet const &); - bool insert(Tx const &); - bool erase(Tx::ID const &); - }; - - // Construct from a mutable view. - TxSet(MutableTxSet const &); - - // Alternatively, if the TxSet is itself mutable - // just alias MutableTxSet = TxSet - - //... implementation specific -}; -``` - -### Ledger - -The `Ledger` type represents the state shared amongst the -distributed participants. Notice that the details of how the next ledger is -generated from the prior ledger and the consensus accepted transaction set is -not part of the interface. Within the generic code, this type is primarily used -to know that peers are working on the same tip of the ledger chain and to -provide some basic timing data for consensus. - -```{.cpp} -struct Ledger -{ - using ID = ...; - - using Seq = //std::uint32_t?...; - - ID const & id() const; - - // Sequence number that is 1 more than the parent ledger's seq() - Seq seq() const; - - // Whether the ledger's close time was a non-trivial consensus result - bool closeAgree() const; - - // The close time resolution used in determining the close time - NetClock::duration closeTimeResolution() const; - - // The (effective) close time, based on the closeTimeResolution - NetClock::time_point closeTime() const; - - // The parent ledger's close time - NetClock::time_point parentCloseTime() const; - - Json::Value getJson() const; - - //... implementation specific -}; -``` - -### PeerProposal - -The `PeerProposal` type represents the signed position taken -by a peer during consensus. The only type requirement is owning an instance of a -generic `ConsensusProposal`. - -```{.cpp} -// Represents our proposed position or a peer's proposed position -// and is provided with the generic code -template class ConsensusProposal; - -struct PeerPosition -{ - ConsensusProposal< - NodeID_t, - typename Ledger::ID, - typename TxSet::ID> const & - proposal() const; - - // ... implementation specific -}; -``` - -### Generic Consensus Interface - -The generic `Consensus` relies on `Adaptor` template class to implement a set -of helper functions that plug the consensus algorithm into a specific application. -The `Adaptor` class also defines the types above needed by the algorithm. Below -are excerpts of the generic consensus implementation and of helper types that will -interact with the concrete implementing class. - -```{.cpp} -// Represents a transction under dispute this round -template class DisputedTx; - -// Represents how the node participates in Consensus this round -enum class ConsensusMode { proposing, observing, wrongLedger, switchedLedger}; - -// Measure duration of phases of consensus -class ConsensusTimer -{ -public: - std::chrono::milliseconds read() const; - // details omitted ... -}; - -// Initial ledger close times, not rounded by closeTimeResolution -// Used to gauge degree of synchronization between a node and its peers -struct ConsensusCloseTimes -{ - std::map peers; - NetClock::time_point self; -}; - -// Encapsulates the result of consensus. -template -struct ConsensusResult -{ - //! The set of transactions consensus agrees go in the ledger - Adaptor::TxSet_t set; - - //! Our proposed position on transactions/close time - ConsensusProposal<...> position; - - //! Transactions which are under dispute with our peers - hash_map> disputes; - - // Set of TxSet ids we have already compared/created disputes - hash_set compares; - - // Measures the duration of the establish phase for this consensus round - ConsensusTimer roundTime; - - // Indicates state in which consensus ended. Once in the accept phase - // will be either Yes or MovedOn - ConsensusState state = ConsensusState::No; -}; - -template -class Consensus -{ -public: - Consensus(clock_type, Adaptor &, beast::journal); - - // Kick-off the next round of consensus. - void startRound( - NetClock::time_point const& now, - typename Ledger_t::ID const& prevLedgerID, - Ledger_t const& prevLedger, - bool proposing); - - // Call periodically to drive consensus forward. - void timerEntry(NetClock::time_point const& now); - - // A peer has proposed a new position, adjust our tracking. Return true if the proposal - // was used. - bool peerProposal(NetClock::time_point const& now, Proposal_t const& newProposal); - - // Process a transaction set acquired from the network - void gotTxSet(NetClock::time_point const& now, TxSet_t const& txSet); - - // ... details -}; -``` - -### Adapting Generic Consensus - -The stub below shows the set of callback/helper functions required in the implementing class. - -```{.cpp} -struct Adaptor -{ - using Ledger_t = Ledger; - using TxSet_t = TxSet; - using PeerProposal_t = PeerProposal; - using NodeID_t = ...; // Integer-like std::uint32_t to uniquely identify a node - - - // Attempt to acquire a specific ledger from the network. - boost::optional acquireLedger(Ledger::ID const & ledgerID); - - // Acquire the transaction set associated with a proposed position. - boost::optional acquireTxSet(TxSet::ID const & setID); - - // Whether any transactions are in the open ledger - bool hasOpenTransactions() const; - - // Number of proposers that have validated the given ledger - std::size_t proposersValidated(Ledger::ID const & prevLedger) const; - - // Number of proposers that have validated a ledger descended from the - // given ledger - std::size_t proposersFinished(Ledger::ID const & prevLedger) const; - - // Return the ID of the last closed (and validated) ledger that the - // application thinks consensus should use as the prior ledger. - Ledger::ID getPrevLedger(Ledger::ID const & prevLedgerID, - Ledger const & prevLedger, - ConsensusMode mode); - - // Called when consensus operating mode changes - void onModeChange(ConsensuMode before, ConsensusMode after); - - // Called when ledger closes. Implementation should generate an initial Result - // with position based on the current open ledger's transactions. - ConsensusResult onClose(Ledger const &, Ledger const & prev, ConsensusMode mode); - - // Called when ledger is accepted by consensus - void onAccept(ConsensusResult const & result, - RCLCxLedger const & prevLedger, - NetClock::duration closeResolution, - ConsensusCloseTimes const & rawCloseTimes, - ConsensusMode const & mode); - - // Propose the position to peers. - void propose(ConsensusProposal<...> const & pos); - - // Share a received peer proposal with other peers. - void share(PeerPosition_t const & pos); - - // Share a disputed transaction with peers - void share(TxSet::Tx const & tx); - - // Share given transaction set with peers - void share(TxSet const &s); - - //... implementation specific -}; -``` - -The implementing class hides many details of the peer communication -model from the generic code. - -* The `share` member functions are responsible for sharing the given type with a - node's peers, but are agnostic to the mechanism. Ideally, messages are delivered - faster than `LEDGER_GRANULARITY`. -* The generic code does not specify how transactions are submitted by clients, - propagated through the network or stored in the open ledger. Indeed, the open - ledger is only conceptual from the perspective of the generic code---the - initial position and transaction set are opaquely generated in a - `Consensus::Result` instance returned from the `onClose` callback. -* The calls to `acquireLedger` and `acquireTxSet` only have non-trivial return - if the ledger or transaction set of interest is available. The implementing - class is free to block while acquiring, or return the empty option while - servicing the request asynchronously. Due to legacy reasons, the two calls - are not symmetric. `acquireTxSet` requires the host application to call - `gotTxSet` when an asynchronous `acquire` completes. Conversely, - `acquireLedger` will be called again later by the consensus code if it still - desires the ledger with the hope that the asynchronous acquisition is - complete. - - -## Validation - -Coming Soon! - - diff --git a/docs/images/consensus/EffCloseTime.png b/docs/images/consensus/EffCloseTime.png deleted file mode 100644 index 922320de50b71d9ab5b487775301f69d85b29899..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1975 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 Hy2t(}nf7(l diff --git a/docs/images/consensus/consensus_modes.png b/docs/images/consensus/consensus_modes.png deleted file mode 100644 index e575631dacbab2110b3d273b7f01d692510ecae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14411 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 diff --git a/docs/images/consensus/consensus_overview.png b/docs/images/consensus/consensus_overview.png deleted file mode 100644 index a5b4a004968512b24befded6fc0f603d12635efb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34251 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 Ky)2e6c>h1``9~-K diff --git a/docs/images/consensus/threshold.png b/docs/images/consensus/threshold.png deleted file mode 100644 index 7a2ff12e5738fb1238a95545d542f1707da077e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13245 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 NB}G4o6bpUw`Cmmi$sqs$ diff --git a/docs/images/xrp-text-mark-black-small@2x.png b/docs/images/xrp-text-mark-black-small@2x.png deleted file mode 100644 index f16a20a15ba5a25b01c49db460f66f83ef93b477..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1462 zcmV;n1xfmeP)_nC)G!S`;aDh`l>KXE6>ev%|713;iW*#LTSD&Np*r<{!MXViW|59T-$g zyTa`0scAw4T232=1L6n-B)w&bxO-ML3x4fv5M>l#KnMu{ieLQV2(4t*O$$a;CX)f{ zuU0C7;vB}42}qwSJZ$`7KKB+P|Cuz5un<^_tLse)Qimvnux~rKI|`5pLG-F=3(WP# zq4A%yx>-PhyOIV;XHFa~FB_poBWr18?U5tI?_nUgb)tg660k`f`eK~-iAW6gx23zr z!|o4S_scLCy^Vs3Ay9Ac%gTa4n2=KRKC=L00TSYAHxBfcD$*2xLas30t@ zu8Y19DA&?@5iC_AB&ojPGpm~R1%6>!W=r)5MQSo3XdJ*@2N|C@jvBR-+?@AUo*4uK zq%ctIFHzYr7!#cdLL4^guL?n{-+AzWR=W1K(8Lo@k*>`hFvuYoth1T^NtRM=A(J_i^0m=%{T# zG0fe<=ZKz^MrmtK)sSJ(=(nij%ic1AR9H%{=Q&SO9!??(ojN-yeb5vkbagfFfb&ND zsbSx;n1q-mG!1OWKA|{z2Z62)Yv^_$b)@{M?u+muWXQIsojTKpz_KqdfnNSLOj&+$ z38cfkctf7?!ROkeIZ&o1i78KsK z2eyys#0$cpBZKqqVn-H7U=S=mlAqU3QnWr~skeCxTVXKQA6hHK9+x%hC)qH*&ZNYP z^(VLB$g}yNfrvjr3@Q`~?q=q7+bPoa-Fqx><3N~kc@K2ZnUR)H^%f0=3K@KdvVo9J ze~E4JrbuJ(JDRm+8ZcWhM2Z8Q1wpa{xQ9^M%+M^5t)tg*%)$RpIw<@n8eI>m(@M0X z8!-5))nCQk`}eo)e=l#_Z?*4Xf^qc61TGDUnl|8%H+4o8p9CGv`HH5xalP=gkVm5+ zyBW0oDAST;MvS5+xyRp(;~r1QeP#7Iup@!cR}4MTIa6em6+_s~ei{=5>mP!V3kzd1 zAh2X#z;3V46*x7i?i2>pv70mGEN(<~vGo4YV4);8yLniCQeGgp^%)JKT$D4_FAjxh z{lbcK0S7XpF%Ss%P60$I5QO*AukSLlk-`w-KxO**xW_3C35HHEhPbU!#WAXeZeMRq zJRb<%?W<4o(03VO#kP#>@JXZhUSeK6g&CC+gwja`+#^4KfzK8E;lmzb*^^XE(gn!R zD#tcz@j=qZu-sVueC-L$prjz!J0}R6syl^7&CK^sbI!kw+N*q6`#fs7Gea^k(80Xd zIi3X#faqLc{LK)`vIewI-&WlzjB}R}wRm8_p!H2gG48|}M-cUaU@t@k!M)h2nL}^1 zW(kJ<5pGDCZRE7!PSD7LlPX>V))1H(xMY>Rss Ql>h($07*qoM6N<$f_Uwr`Tzg` diff --git a/docs/sample_chart.doc b/docs/sample_chart.doc deleted file mode 100644 index 631c0554b..000000000 --- a/docs/sample_chart.doc +++ /dev/null @@ -1,24 +0,0 @@ -/*! - \page somestatechart Example state diagram - - \startuml SomeState "my state diagram" - scale 600 width - - [*] -> State1 - State1 --> State2 : Succeeded - State1 --> [*] : Aborted - State2 --> State3 : Succeeded - State2 --> [*] : Aborted - state State3 { - state "Accumulate Enough Data\nLong State Name" as long1 - long1 : Just a test - [*] --> long1 - long1 --> long1 : New Data - long1 --> ProcessData : Enough Data - } - State3 --> State3 : Failed - State3 --> [*] : Succeeded / Save Result - State3 --> [*] : Aborted - - \enduml -*/ diff --git a/external/snappy/conandata.yml b/external/snappy/conandata.yml deleted file mode 100644 index 6c12aed54..000000000 --- a/external/snappy/conandata.yml +++ /dev/null @@ -1,16 +0,0 @@ -sources: - "1.1.9": - url: "https://github.com/google/snappy/archive/1.1.9.tar.gz" - sha256: "75c1fbb3d618dd3a0483bff0e26d0a92b495bbe5059c8b4f1c962b478b6e06e7" - "1.1.8": - url: "https://github.com/google/snappy/archive/1.1.8.tar.gz" - sha256: "16b677f07832a612b0836178db7f374e414f94657c138e6993cbfc5dcc58651f" - "1.1.7": - url: "https://github.com/google/snappy/archive/1.1.7.tar.gz" - sha256: "3dfa02e873ff51a11ee02b9ca391807f0c8ea0529a4924afa645fbf97163f9d4" -patches: - "1.1.9": - - patch_file: "patches/1.1.9-0001-fix-inlining-failure.patch" - - patch_file: "patches/1.1.9-0002-no-Werror.patch" - - patch_file: "patches/1.1.9-0003-fix-clobber-list-older-llvm.patch" - - patch_file: "patches/1.1.9-0004-rtti-by-default.patch" diff --git a/external/snappy/conanfile.py b/external/snappy/conanfile.py deleted file mode 100644 index 23558639f..000000000 --- a/external/snappy/conanfile.py +++ /dev/null @@ -1,89 +0,0 @@ -from conan import ConanFile -from conan.tools.build import check_min_cppstd -from conan.tools.cmake import CMake, CMakeToolchain, cmake_layout -from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rmdir -from conan.tools.scm import Version -import os - -required_conan_version = ">=1.54.0" - - -class SnappyConan(ConanFile): - name = "snappy" - description = "A fast compressor/decompressor" - topics = ("google", "compressor", "decompressor") - url = "https://github.com/conan-io/conan-center-index" - homepage = "https://github.com/google/snappy" - license = "BSD-3-Clause" - - package_type = "library" - settings = "os", "arch", "compiler", "build_type" - options = { - "shared": [True, False], - "fPIC": [True, False], - } - default_options = { - "shared": False, - "fPIC": True, - } - - def export_sources(self): - export_conandata_patches(self) - - def config_options(self): - if self.settings.os == 'Windows': - del self.options.fPIC - - def configure(self): - if self.options.shared: - self.options.rm_safe("fPIC") - - def layout(self): - cmake_layout(self, src_folder="src") - - def validate(self): - if self.settings.compiler.get_safe("cppstd"): - check_min_cppstd(self, 11) - - def source(self): - get(self, **self.conan_data["sources"][self.version], strip_root=True) - - def generate(self): - tc = CMakeToolchain(self) - tc.variables["SNAPPY_BUILD_TESTS"] = False - if Version(self.version) >= "1.1.8": - tc.variables["SNAPPY_FUZZING_BUILD"] = False - tc.variables["SNAPPY_REQUIRE_AVX"] = False - tc.variables["SNAPPY_REQUIRE_AVX2"] = False - tc.variables["SNAPPY_INSTALL"] = True - if Version(self.version) >= "1.1.9": - tc.variables["SNAPPY_BUILD_BENCHMARKS"] = False - tc.generate() - - def build(self): - apply_conandata_patches(self) - cmake = CMake(self) - cmake.configure() - cmake.build() - - def package(self): - copy(self, "COPYING", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses")) - cmake = CMake(self) - cmake.install() - rmdir(self, os.path.join(self.package_folder, "lib", "cmake")) - - def package_info(self): - self.cpp_info.set_property("cmake_file_name", "Snappy") - self.cpp_info.set_property("cmake_target_name", "Snappy::snappy") - # TODO: back to global scope in conan v2 once cmake_find_package* generators removed - self.cpp_info.components["snappylib"].libs = ["snappy"] - if not self.options.shared: - if self.settings.os in ["Linux", "FreeBSD"]: - self.cpp_info.components["snappylib"].system_libs.append("m") - - # TODO: to remove in conan v2 once cmake_find_package* generators removed - self.cpp_info.names["cmake_find_package"] = "Snappy" - self.cpp_info.names["cmake_find_package_multi"] = "Snappy" - self.cpp_info.components["snappylib"].names["cmake_find_package"] = "snappy" - self.cpp_info.components["snappylib"].names["cmake_find_package_multi"] = "snappy" - self.cpp_info.components["snappylib"].set_property("cmake_target_name", "Snappy::snappy") diff --git a/external/snappy/patches/1.1.9-0001-fix-inlining-failure.patch b/external/snappy/patches/1.1.9-0001-fix-inlining-failure.patch deleted file mode 100644 index cdc119c0d..000000000 --- a/external/snappy/patches/1.1.9-0001-fix-inlining-failure.patch +++ /dev/null @@ -1,14 +0,0 @@ -Fixes the following error: -error: inlining failed in call to ‘always_inline’ ‘size_t snappy::AdvanceToNextTag(const uint8_t**, size_t*)’: function body can be overwritten at link time - ---- snappy-stubs-internal.h -+++ snappy-stubs-internal.h -@@ -100,7 +100,7 @@ - - // Inlining hints. - #ifdef HAVE_ATTRIBUTE_ALWAYS_INLINE --#define SNAPPY_ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline)) -+#define SNAPPY_ATTRIBUTE_ALWAYS_INLINE - #else - #define SNAPPY_ATTRIBUTE_ALWAYS_INLINE - #endif diff --git a/external/snappy/patches/1.1.9-0002-no-Werror.patch b/external/snappy/patches/1.1.9-0002-no-Werror.patch deleted file mode 100644 index d86e4e0a9..000000000 --- a/external/snappy/patches/1.1.9-0002-no-Werror.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- CMakeLists.txt -+++ CMakeLists.txt -@@ -69,7 +69,7 @@ -- # Use -Werror for clang only. -+if(0) - if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - if(NOT CMAKE_CXX_FLAGS MATCHES "-Werror") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") - endif(NOT CMAKE_CXX_FLAGS MATCHES "-Werror") - endif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") -- -+endif() diff --git a/external/snappy/patches/1.1.9-0003-fix-clobber-list-older-llvm.patch b/external/snappy/patches/1.1.9-0003-fix-clobber-list-older-llvm.patch deleted file mode 100644 index 84bc674fd..000000000 --- a/external/snappy/patches/1.1.9-0003-fix-clobber-list-older-llvm.patch +++ /dev/null @@ -1,12 +0,0 @@ -asm clobbers do not work for clang < 9 and apple-clang < 11 (found by SpaceIm) ---- snappy.cc -+++ snappy.cc -@@ -1026,7 +1026,7 @@ - size_t literal_len = *tag >> 2; - size_t tag_type = *tag; - bool is_literal; --#if defined(__GNUC__) && defined(__x86_64__) -+#if defined(__GNUC__) && defined(__x86_64__) && ( (!defined(__clang__) && !defined(__APPLE__)) || (!defined(__APPLE__) && defined(__clang__) && (__clang_major__ >= 9)) || (defined(__APPLE__) && defined(__clang__) && (__clang_major__ > 11)) ) - // TODO clang misses the fact that the (c & 3) already correctly - // sets the zero flag. - asm("and $3, %k[tag_type]\n\t" diff --git a/external/snappy/patches/1.1.9-0004-rtti-by-default.patch b/external/snappy/patches/1.1.9-0004-rtti-by-default.patch deleted file mode 100644 index c353a489d..000000000 --- a/external/snappy/patches/1.1.9-0004-rtti-by-default.patch +++ /dev/null @@ -1,20 +0,0 @@ ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -53,8 +53,6 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - add_definitions(-D_HAS_EXCEPTIONS=0) - - # Disable RTTI. -- string(REGEX REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") -- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-") - else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - # Use -Wall for clang and gcc. - if(NOT CMAKE_CXX_FLAGS MATCHES "-Wall") -@@ -78,8 +76,6 @@ endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions") - - # Disable RTTI. -- string(REGEX REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") -- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti") - endif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") - - # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make diff --git a/hook/LaunchHooks.md b/hook/LaunchHooks.md deleted file mode 100644 index 0df9a5544..000000000 --- a/hook/LaunchHooks.md +++ /dev/null @@ -1,68 +0,0 @@ -# Xahau Launch Hooks - -## Savings Hook -When it comes to managing money, it is a common practice to maintain separate spending and savings accounts. -Suppose you receive an income or salary to your on-ledger account several times a month. Each time you receive funds above a certain threshold you may wish to move a predefined percentage to a savings account where you will not accidentally spend them. The savings hook does exactly this. -### Hook Parameters - 1. Account to install on - 2. Account to send savings to - 3. The percentage to send - 4. The threshold at which it is activated - 5. Whether it applies to incoming payments only, outgoing payments only or both. -### xApp Features - 1. Display the send-to account - 2. Display the percentage - 3. Display the total amount sent - 4. Display the conditions of sending (threshold + incoming/outgoing payments) - 5. Allow the hook to be uninstalled - -## Firewall Hook -The ledger is a messy place full of unwanted transactions and spam. To avoid being spammed with low value transactions containing unsolicitied memos you may install a Firewall hook on your account. -### Hook Parameters - 1. Types of transactions to allow into and out of your account (Payment, Escrow, PayChannel) etc. - 2. Allow a minimum number of drops for an incoming txn to be allowed. - 3. Allow a minimum amount to be specified for each of the trustline assets on the account as well. - 4. Allow any txn with a memo larger than X bytes to be blocked regardless of other rules. -### xApp Features - 1. Display the current settings of the hook. Allow the settings to be changed. - 2. Allow the hook to be uninstalled. - -## Blocklist Hook -Filter outgoing and incoming payments against a known list of scam accounts maintained by a third party. This acts as a guard against accidentally sending to a scam, or being sent tainted funds by a scammer. -### Hook Parameters - 1. The blocklist (account) to listen to. -### xApp Features - 1. Number of times a transaction was blocked. - 2. The current blocklist (account) being listened to. - 3. Allow the hook to be uninstalled. - -## Direct Debit Hook -Allow trusted third parties to pull funds from your account up to a limit you set. For example your power company can bill you and your account can automatically pay that bill. -### Hook Parameters - 1. One or more accounts to provide direct deposit authorization to. - 2. A currency and a limit for each of these. -## xApp Features - 1. See who you've authorized. - 2. See how much they're authorized for. - 3. See how much they've drawn down this month. - 4. Allow authorization to be removed. - 5. Allow authorization limit to be changed. - 6. Allow additional authorizations to be created. - 7. Allow the hook to be uninstalled. - 8. Show a list of recent direct debit transactions. - - -## High-Value Payment Hook -When sending high value transactions out of your account, require first a notification that a high valued payment will be made, followed by a time delay, followed by the high value transaction itself. This prevents accidental high value sends, adding an additional layer of security to your account. -### Hook Parameters - 1. Select currencies for which the hook will act. - 2. Select the thresholds for which the hook will be triggered. -### xApp Features - 1. See current pending outgoing high value transactions. - 2. State that the hook is active and for which currencies and thresholds. - 3. Allow the hook to be uninstalled. - 4. If installed, and a high value transaction is made from Xumm, it is redirected into the xApp. - 5. The xApp then generates a notification transaction (ttInvoke) which is sent to the hook. - 6. The xApp will then remind the user with an event at a later time that the transaction proper still needs to be sent. - 7. Sending the transaction proper again will result in successful send. - diff --git a/hook/definitions.json b/hook/definitions.json deleted file mode 100644 index 64e294019..000000000 --- a/hook/definitions.json +++ /dev/null @@ -1,2473 +0,0 @@ -{ - "TYPES": { - "Done": -1, - "Unknown": -2, - "NotPresent": 0, - "UInt16": 1, - "UInt32": 2, - "UInt64": 3, - "Hash128": 4, - "Hash256": 5, - "Amount": 6, - "Blob": 7, - "AccountID": 8, - "STObject": 14, - "STArray": 15, - "UInt8": 16, - "Hash160": 17, - "PathSet": 18, - "Vector256": 19, - "UInt96": 20, - "UInt192": 21, - "UInt384": 22, - "UInt512": 23, - "Transaction": 10001, - "LedgerEntry": 10002, - "Validation": 10003, - "Metadata": 10004 - }, - "LEDGER_ENTRY_TYPES": { - "Invalid": -1, - "AccountRoot": 97, - "DirectoryNode": 100, - "RippleState": 114, - "Ticket": 84, - "SignerList": 83, - "Offer": 111, - "LedgerHashes": 104, - "Amendments": 102, - "FeeSettings": 115, - "Escrow": 117, - "PayChannel": 120, - "Check": 67, - "DepositPreauth": 112, - "NegativeUNL": 78, - "NFTokenPage": 80, - "NFTokenOffer": 55, - "Any": -3, - "Child": -2, - "Nickname": 110, - "Contract": 99, - "GeneratorMap": 103, - "Hook": 72, - "HookState": 118, - "HookDefinition": 68, - "EmittedTxn": 69 - }, - "FIELDS": [ - [ - "Generic", - { - "nth": 0, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": false, - "type": "Unknown" - } - ], - [ - "Invalid", - { - "nth": -1, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": false, - "type": "Unknown" - } - ], - [ - "ObjectEndMarker", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "ArrayEndMarker", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "hash", - { - "nth": 257, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": false, - "type": "Hash256" - } - ], - [ - "index", - { - "nth": 258, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": false, - "type": "Hash256" - } - ], - [ - "taker_gets_funded", - { - "nth": 258, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": false, - "type": "Amount" - } - ], - [ - "taker_pays_funded", - { - "nth": 259, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": false, - "type": "Amount" - } - ], - [ - "LedgerEntry", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": true, - "type": "LedgerEntry" - } - ], - [ - "Transaction", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": true, - "type": "Transaction" - } - ], - [ - "Validation", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": false, - "isSigningField": true, - "type": "Validation" - } - ], - [ - "Metadata", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Metadata" - } - ], - [ - "CloseResolution", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt8" - } - ], - [ - "Method", - { - "nth": 2, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt8" - } - ], - [ - "TransactionResult", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt8" - } - ], - [ - "TickSize", - { - "nth": 16, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt8" - } - ], - [ - "UNLModifyDisabling", - { - "nth": 17, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt8" - } - ], - [ - "HookResult", - { - "nth": 18, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt8" - } - ], - [ - "LedgerEntryType", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "TransactionType", - { - "nth": 2, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "SignerWeight", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "TransferFee", - { - "nth": 4, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "Version", - { - "nth": 16, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "HookStateChangeCount", - { - "nth": 17, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "HookEmitCount", - { - "nth": 18, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "HookExecutionIndex", - { - "nth": 19, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "HookApiVersion", - { - "nth": 20, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt16" - } - ], - [ - "NetworkID", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "Flags", - { - "nth": 2, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "SourceTag", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "Sequence", - { - "nth": 4, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "PreviousTxnLgrSeq", - { - "nth": 5, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "LedgerSequence", - { - "nth": 6, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "CloseTime", - { - "nth": 7, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "ParentCloseTime", - { - "nth": 8, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "SigningTime", - { - "nth": 9, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "Expiration", - { - "nth": 10, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "TransferRate", - { - "nth": 11, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "WalletSize", - { - "nth": 12, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "OwnerCount", - { - "nth": 13, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "DestinationTag", - { - "nth": 14, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "HighQualityIn", - { - "nth": 16, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "HighQualityOut", - { - "nth": 17, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "LowQualityIn", - { - "nth": 18, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "LowQualityOut", - { - "nth": 19, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "QualityIn", - { - "nth": 20, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "QualityOut", - { - "nth": 21, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "StampEscrow", - { - "nth": 22, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "BondAmount", - { - "nth": 23, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "LoadFee", - { - "nth": 24, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "OfferSequence", - { - "nth": 25, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "FirstLedgerSequence", - { - "nth": 26, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "LastLedgerSequence", - { - "nth": 27, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "TransactionIndex", - { - "nth": 28, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "OperationLimit", - { - "nth": 29, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "ReferenceFeeUnits", - { - "nth": 30, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "ReserveBase", - { - "nth": 31, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "ReserveIncrement", - { - "nth": 32, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "SetFlag", - { - "nth": 33, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "ClearFlag", - { - "nth": 34, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "SignerQuorum", - { - "nth": 35, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "CancelAfter", - { - "nth": 36, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "FinishAfter", - { - "nth": 37, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "SignerListID", - { - "nth": 38, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "SettleDelay", - { - "nth": 39, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "TicketCount", - { - "nth": 40, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "TicketSequence", - { - "nth": 41, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "NFTokenTaxon", - { - "nth": 42, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "MintedNFTokens", - { - "nth": 43, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "BurnedNFTokens", - { - "nth": 44, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "HookStateCount", - { - "nth": 45, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "EmitGeneration", - { - "nth": 46, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "LockCount", - { - "nth": 47, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "RewardTime", - { - "nth": 98, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "RewardLgrFirst", - { - "nth": 99, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "RewardLgrLast", - { - "nth": 100, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt32" - } - ], - [ - "IndexNext", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "IndexPrevious", - { - "nth": 2, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "BookNode", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "OwnerNode", - { - "nth": 4, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "BaseFee", - { - "nth": 5, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "ExchangeRate", - { - "nth": 6, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "LowNode", - { - "nth": 7, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "HighNode", - { - "nth": 8, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "DestinationNode", - { - "nth": 9, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "Cookie", - { - "nth": 10, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "ServerVersion", - { - "nth": 11, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "NFTokenOfferNode", - { - "nth": 12, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "EmitBurden", - { - "nth": 13, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "HookInstructionCount", - { - "nth": 17, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "HookReturnCode", - { - "nth": 18, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "ReferenceCount", - { - "nth": 19, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "RewardAccumulator", - { - "nth": 100, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "UInt64" - } - ], - [ - "EmailHash", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash128" - } - ], - [ - "TakerPaysCurrency", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash160" - } - ], - [ - "TakerPaysIssuer", - { - "nth": 2, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash160" - } - ], - [ - "TakerGetsCurrency", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash160" - } - ], - [ - "TakerGetsIssuer", - { - "nth": 4, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash160" - } - ], - [ - "LedgerHash", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "ParentHash", - { - "nth": 2, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "TransactionHash", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "AccountHash", - { - "nth": 4, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "PreviousTxnID", - { - "nth": 5, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "LedgerIndex", - { - "nth": 6, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "WalletLocator", - { - "nth": 7, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "RootIndex", - { - "nth": 8, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "AccountTxnID", - { - "nth": 9, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "NFTokenID", - { - "nth": 10, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "EmitParentTxnID", - { - "nth": 11, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "EmitNonce", - { - "nth": 12, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "EmitHookHash", - { - "nth": 13, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "BookDirectory", - { - "nth": 16, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "InvoiceID", - { - "nth": 17, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "Nickname", - { - "nth": 18, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "Amendment", - { - "nth": 19, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "HookOn", - { - "nth": 20, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "Digest", - { - "nth": 21, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "Channel", - { - "nth": 22, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "ConsensusHash", - { - "nth": 23, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "CheckID", - { - "nth": 24, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "ValidatedHash", - { - "nth": 25, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "PreviousPageMin", - { - "nth": 26, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "NextPageMin", - { - "nth": 27, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "NFTokenBuyOffer", - { - "nth": 28, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "NFTokenSellOffer", - { - "nth": 29, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "HookStateKey", - { - "nth": 30, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "HookHash", - { - "nth": 31, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "HookNamespace", - { - "nth": 32, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "HookSetTxnID", - { - "nth": 33, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "OfferID", - { - "nth": 34, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "EscrowID", - { - "nth": 35, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Hash256" - } - ], - [ - "Amount", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "Balance", - { - "nth": 2, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "LimitAmount", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "TakerPays", - { - "nth": 4, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "TakerGets", - { - "nth": 5, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "LowLimit", - { - "nth": 6, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "HighLimit", - { - "nth": 7, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "Fee", - { - "nth": 8, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "SendMax", - { - "nth": 9, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "DeliverMin", - { - "nth": 10, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "MinimumOffer", - { - "nth": 16, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "RippleEscrow", - { - "nth": 17, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "DeliveredAmount", - { - "nth": 18, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "NFTokenBrokerFee", - { - "nth": 19, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "HookCallbackFee", - { - "nth": 20, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "LockedBalance", - { - "nth": 21, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "Amount" - } - ], - [ - "PublicKey", - { - "nth": 1, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "MessageKey", - { - "nth": 2, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "SigningPubKey", - { - "nth": 3, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "TxnSignature", - { - "nth": 4, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": false, - "type": "Blob" - } - ], - [ - "URI", - { - "nth": 5, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "Signature", - { - "nth": 6, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": false, - "type": "Blob" - } - ], - [ - "Domain", - { - "nth": 7, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "FundCode", - { - "nth": 8, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "RemoveCode", - { - "nth": 9, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "ExpireCode", - { - "nth": 10, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "CreateCode", - { - "nth": 11, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "MemoType", - { - "nth": 12, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "MemoData", - { - "nth": 13, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "MemoFormat", - { - "nth": 14, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "Fulfillment", - { - "nth": 16, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "Condition", - { - "nth": 17, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "MasterSignature", - { - "nth": 18, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": false, - "type": "Blob" - } - ], - [ - "UNLModifyValidator", - { - "nth": 19, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "ValidatorToDisable", - { - "nth": 20, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "ValidatorToReEnable", - { - "nth": 21, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "HookStateData", - { - "nth": 22, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "HookReturnString", - { - "nth": 23, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "HookParameterName", - { - "nth": 24, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "HookParameterValue", - { - "nth": 25, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "Blob", - { - "nth": 26, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Blob" - } - ], - [ - "Account", - { - "nth": 1, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "Owner", - { - "nth": 2, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "Destination", - { - "nth": 3, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "Issuer", - { - "nth": 4, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "Authorize", - { - "nth": 5, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "Unauthorize", - { - "nth": 6, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "RegularKey", - { - "nth": 8, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "NFTokenMinter", - { - "nth": 9, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "EmitCallback", - { - "nth": 10, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "HookAccount", - { - "nth": 16, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "AccountID" - } - ], - [ - "Indexes", - { - "nth": 1, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Vector256" - } - ], - [ - "Hashes", - { - "nth": 2, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Vector256" - } - ], - [ - "Amendments", - { - "nth": 3, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Vector256" - } - ], - [ - "NFTokenOffers", - { - "nth": 4, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Vector256" - } - ], - [ - "HookNamespaces", - { - "nth": 5, - "isVLEncoded": true, - "isSerialized": true, - "isSigningField": true, - "type": "Vector256" - } - ], - [ - "Paths", - { - "nth": 1, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "PathSet" - } - ], - [ - "TransactionMetaData", - { - "nth": 2, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "CreatedNode", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "DeletedNode", - { - "nth": 4, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "ModifiedNode", - { - "nth": 5, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "PreviousFields", - { - "nth": 6, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "FinalFields", - { - "nth": 7, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "NewFields", - { - "nth": 8, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "TemplateEntry", - { - "nth": 9, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "Memo", - { - "nth": 10, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "SignerEntry", - { - "nth": 11, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "NFToken", - { - "nth": 12, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "EmitDetails", - { - "nth": 13, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "Hook", - { - "nth": 14, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "Signer", - { - "nth": 16, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "Majority", - { - "nth": 18, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "DisabledValidator", - { - "nth": 19, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "EmittedTxn", - { - "nth": 20, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "HookExecution", - { - "nth": 21, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "HookDefinition", - { - "nth": 22, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "HookParameter", - { - "nth": 23, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "HookGrant", - { - "nth": 24, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STObject" - } - ], - [ - "Signers", - { - "nth": 3, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": false, - "type": "STArray" - } - ], - [ - "SignerEntries", - { - "nth": 4, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "Template", - { - "nth": 5, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "Necessary", - { - "nth": 6, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "Sufficient", - { - "nth": 7, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "AffectedNodes", - { - "nth": 8, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "Memos", - { - "nth": 9, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "NFTokens", - { - "nth": 10, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "Hooks", - { - "nth": 11, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "Majorities", - { - "nth": 16, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "DisabledValidators", - { - "nth": 17, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "HookExecutions", - { - "nth": 18, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "HookParameters", - { - "nth": 19, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ], - [ - "HookGrants", - { - "nth": 20, - "isVLEncoded": false, - "isSerialized": true, - "isSigningField": true, - "type": "STArray" - } - ] - ], - "TRANSACTION_RESULTS": { - "telLOCAL_ERROR": -399, - "telBAD_DOMAIN": -398, - "telBAD_PATH_COUNT": -397, - "telBAD_PUBLIC_KEY": -396, - "telFAILED_PROCESSING": -395, - "telINSUF_FEE_P": -394, - "telNO_DST_PARTIAL": -393, - "telCAN_NOT_QUEUE": -392, - "telCAN_NOT_QUEUE_BALANCE": -391, - "telCAN_NOT_QUEUE_BLOCKS": -390, - "telCAN_NOT_QUEUE_BLOCKED": -389, - "telCAN_NOT_QUEUE_FEE": -388, - "telCAN_NOT_QUEUE_FULL": -387, - "telWRONG_NETWORK": -386, - "telREQUIRES_NETWORK_ID": -385, - "telNETWORK_ID_MAKES_TX_NON_CANONICAL": -384, - - "temMALFORMED": -299, - "temBAD_AMOUNT": -298, - "temBAD_CURRENCY": -297, - "temBAD_EXPIRATION": -296, - "temBAD_FEE": -295, - "temBAD_ISSUER": -294, - "temBAD_LIMIT": -293, - "temBAD_OFFER": -292, - "temBAD_PATH": -291, - "temBAD_PATH_LOOP": -290, - "temBAD_REGKEY": -289, - "temBAD_SEND_XRP_LIMIT": -288, - "temBAD_SEND_XRP_MAX": -287, - "temBAD_SEND_XRP_NO_DIRECT": -286, - "temBAD_SEND_XRP_PARTIAL": -285, - "temBAD_SEND_XRP_PATHS": -284, - "temBAD_SEQUENCE": -283, - "temBAD_SIGNATURE": -282, - "temBAD_SRC_ACCOUNT": -281, - "temBAD_TRANSFER_RATE": -280, - "temDST_IS_SRC": -279, - "temDST_NEEDED": -278, - "temINVALID": -277, - "temINVALID_FLAG": -276, - "temREDUNDANT": -275, - "temRIPPLE_EMPTY": -274, - "temDISABLED": -273, - "temBAD_SIGNER": -272, - "temBAD_QUORUM": -271, - "temBAD_WEIGHT": -270, - "temBAD_TICK_SIZE": -269, - "temINVALID_ACCOUNT_ID": -268, - "temCANNOT_PREAUTH_SELF": -267, - "temINVALID_COUNT": -266, - "temHOOK_DATA_TOO_LARGE": -265, - "temHOOK_REJECTED": -264, - "temUNCERTAIN": -263, - "temUNKNOWN": -262, - "temSEQ_AND_TICKET": -261, - "temBAD_NFTOKEN_TRANSFER_FEE": -260, - - "tefFAILURE": -199, - "tefALREADY": -198, - "tefBAD_ADD_AUTH": -197, - "tefBAD_AUTH": -196, - "tefBAD_LEDGER": -195, - "tefCREATED": -194, - "tefEXCEPTION": -193, - "tefINTERNAL": -192, - "tefNO_AUTH_REQUIRED": -191, - "tefPAST_SEQ": -190, - "tefWRONG_PRIOR": -189, - "tefMASTER_DISABLED": -188, - "tefMAX_LEDGER": -187, - "tefBAD_SIGNATURE": -186, - "tefBAD_QUORUM": -185, - "tefNOT_MULTI_SIGNING": -184, - "tefBAD_AUTH_MASTER": -183, - "tefINVARIANT_FAILED": -182, - "tefTOO_BIG": -181, - "tefNO_TICKET": -180, - "tefNFTOKEN_IS_NOT_TRANSFERABLE": -179, - - "terRETRY": -99, - "terFUNDS_SPENT": -98, - "terINSUF_FEE_B": -97, - "terNO_ACCOUNT": -96, - "terNO_AUTH": -95, - "terNO_LINE": -94, - "terOWNERS": -93, - "terPRE_SEQ": -92, - "terLAST": -91, - "terNO_RIPPLE": -90, - "terQUEUED": -89, - "terPRE_TICKET": -88, - "terNO_HOOK": -87, - - "tesSUCCESS": 0, - - "tecCLAIM": 100, - "tecPATH_PARTIAL": 101, - "tecUNFUNDED_ADD": 102, - "tecUNFUNDED_OFFER": 103, - "tecUNFUNDED_PAYMENT": 104, - "tecFAILED_PROCESSING": 105, - "tecDIR_FULL": 121, - "tecINSUF_RESERVE_LINE": 122, - "tecINSUF_RESERVE_OFFER": 123, - "tecNO_DST": 124, - "tecNO_DST_INSUF_XRP": 125, - "tecNO_LINE_INSUF_RESERVE": 126, - "tecNO_LINE_REDUNDANT": 127, - "tecPATH_DRY": 128, - "tecUNFUNDED": 129, - "tecNO_ALTERNATIVE_KEY": 130, - "tecNO_REGULAR_KEY": 131, - "tecOWNERS": 132, - "tecNO_ISSUER": 133, - "tecNO_AUTH": 134, - "tecNO_LINE": 135, - "tecINSUFF_FEE": 136, - "tecFROZEN": 137, - "tecNO_TARGET": 138, - "tecNO_PERMISSION": 139, - "tecNO_ENTRY": 140, - "tecINSUFFICIENT_RESERVE": 141, - "tecNEED_MASTER_KEY": 142, - "tecDST_TAG_NEEDED": 143, - "tecINTERNAL": 144, - "tecOVERSIZE": 145, - "tecCRYPTOCONDITION_ERROR": 146, - "tecINVARIANT_FAILED": 147, - "tecEXPIRED": 148, - "tecDUPLICATE": 149, - "tecKILLED": 150, - "tecHAS_OBLIGATIONS": 151, - "tecTOO_SOON": 152, - "tecHOOK_REJECTED": 153, - "tecMAX_SEQUENCE_REACHED": 154, - "tecNO_SUITABLE_NFTOKEN_PAGE": 155, - "tecNFTOKEN_BUY_SELL_MISMATCH": 156, - "tecNFTOKEN_OFFER_TYPE_MISMATCH": 157, - "tecCANT_ACCEPT_OWN_NFTOKEN_OFFER": 158, - "tecINSUFFICIENT_FUNDS": 159, - "tecOBJECT_NOT_FOUND": 160, - "tecINSUFFICIENT_PAYMENT": 161, - "tecREQUIRES_FLAG": 162, - "tecPRECISION_LOSS": 163 - }, - "TRANSACTION_TYPES": { - "Invalid": -1, - "Payment": 0, - "EscrowCreate": 1, - "EscrowFinish": 2, - "AccountSet": 3, - "EscrowCancel": 4, - "SetRegularKey": 5, - "NickNameSet": 6, - "OfferCreate": 7, - "OfferCancel": 8, - "Contract": 9, - "TicketCreate": 10, - "TicketCancel": 11, - "SignerListSet": 12, - "PaymentChannelCreate": 13, - "PaymentChannelFund": 14, - "PaymentChannelClaim": 15, - "CheckCreate": 16, - "CheckCash": 17, - "CheckCancel": 18, - "DepositPreauth": 19, - "TrustSet": 20, - "AccountDelete": 21, - "SetHook": 22, - "NFTokenMint": 25, - "NFTokenBurn": 26, - "NFTokenCreateOffer": 27, - "NFTokenCancelOffer": 28, - "NFTokenAcceptOffer": 29, - "ClaimReward": 98, - "Invoke": 99, - "EnableAmendment": 100, - "SetFee": 101, - "UNLModify": 102, - "EmitFailure": 103 - } -} diff --git a/hook/govern.c b/hook/genesis/govern.c similarity index 100% rename from hook/govern.c rename to hook/genesis/govern.c diff --git a/hook/makefile b/hook/genesis/makefile similarity index 100% rename from hook/makefile rename to hook/genesis/makefile diff --git a/hook/mint.c b/hook/genesis/mint.c similarity index 100% rename from hook/mint.c rename to hook/genesis/mint.c diff --git a/hook/nftoken.c b/hook/genesis/nftoken.c similarity index 100% rename from hook/nftoken.c rename to hook/genesis/nftoken.c diff --git a/hook/rekey-validator.js b/hook/genesis/rekey-validator.js similarity index 100% rename from hook/rekey-validator.js rename to hook/genesis/rekey-validator.js diff --git a/hook/reward.c b/hook/genesis/reward.c similarity index 100% rename from hook/reward.c rename to hook/genesis/reward.c diff --git a/hook/utils-tests.js b/hook/utils-tests.js deleted file mode 100644 index 376161aa4..000000000 --- a/hook/utils-tests.js +++ /dev/null @@ -1,637 +0,0 @@ -const fs = require('fs') -const xrpljs = require('xrpl-hooks'); -const kp = require('ripple-keypairs'); -const crypto = require('crypto') - -const rbc = require('xrpl-binary-codec') -const rac = require('ripple-address-codec'); - -const err = (x) => -{ - console.log(x); process.exit(1); -} -// Fails via process.exit -module.exports = { - TestRig: (endpoint)=> - { - return new Promise((resolve, reject)=> - { - const api = new xrpljs.Client(endpoint); - - const nftid = (acc, flags, fee, taxon, mintseq) => - { - if (typeof(acc.classicAddress) != "undefined") - acc = acc.classicAddress; - - acc = rac.decodeAccountID(acc); - const ts = mintseq; - const tax =(taxon ^ ((384160001 * ts) + 2459)); - const id = Buffer.from([ - (flags >> 8) & 0xFF, - flags & 0xFF, - (fee >> 8) & 0xFF, - fee & 0xFF, - acc[0], - acc[1], - acc[2], - acc[3], - acc[4], - acc[5], - acc[6], - acc[7], - acc[8], - acc[9], - acc[10], - acc[11], - acc[12], - acc[13], - acc[14], - acc[15], - acc[16], - acc[17], - acc[18], - acc[19], - (tax >> 24) & 0xFF, - (tax >> 16) & 0xFF, - (tax >> 8) & 0xFF, - tax & 0xFF, - (ts >> 24) & 0xFF, - (ts >> 16) & 0xFF, - (ts >> 8) & 0xFF, - ts & 0xFF - ], 'binary').toString('hex').toUpperCase() - return id; - - }; - - - - const fee = (tx_blob) => - { - return new Promise((resolve, reject) => - { - let req = {command: 'fee'}; - if (tx_blob) - req['tx_blob'] = tx_blob; - - console.log(req); - - api.request(req).then(resp => - { - resolve(resp.result.drops); - }).catch(e => - { - reject(e); - }); - }); - }; - - const ledgerAccept = (n) => - { - return new Promise((resolve, reject) => - { - const la = (remaining) => - { - let req = {command: 'ledger_accept'}; - api.request(req).then(resp => - { - if (remaining <= 0) - resolve(resp); - la(remaining - 1); - }).catch(e=>reject(e)); - }; - - la(typeof(n) == 'undefined' ? 1 : n); - }); - }; - - const assertTxnSuccess = x => - { - if (!x || !x.result || x.result.engine_result_code != 0) - { - console.log("Transaction failed:", x) - process.exit(1); - } - }; - - const assert = (x, m) => - { - if (!(x)) - { - console.log("Assertion failed: ", m); - console.log(new Error().stack); - process.exit(1); - } - }; - - const fetchMeta = (hash) => - { - if (typeof(hash) != 'string') - hash = hash.result.tx_json.hash - - return new Promise((resolve, reject) => - { - api.request( - { - command:"tx", - transaction: hash - }).then(e=>{ - resolve(e.result.meta) - }).catch(e=>reject(e)); - }); - }; - - - const fetchMetaHookExecutions = (hash, hookhash) => - { - return new Promise((resolve, reject) => - { - fetchMeta(hash).then(m=> - { - if (typeof(m) == 'undefined' || - typeof(m.HookExecutions) == 'undefined' || - typeof(m.HookExecutions.length) == 'undefined') - { - return resolve([]) - } - - let ret = []; - - for (let i = 0; i < m.HookExecutions.length; ++i) - { - if (typeof(hookhash) == 'undefined' || - m.HookExecutions[i].HookExecution.HookHash == hookhash) - m.HookExecutions[i].HookExecution.HookReturnCode = - parseInt(m.HookExecutions[i].HookExecution.HookReturnCode, 16); - m.HookExecutions[i].HookExecution.HookInstructionCount = - parseInt(m.HookExecutions[i].HookExecution.HookInstructionCount, 16); - - let s = m.HookExecutions[i].HookExecution.HookReturnString; - if (s != '') - m.HookExecutions[i].HookExecution.HookReturnString = - Buffer.from(s, 'hex').toString('utf-8') - - ret.push(m.HookExecutions[i].HookExecution); - } - - resolve(ret); - }).catch(e=>reject(e)); - }); - }; - - - - const assertTxnFailure = x => - { - if (!x || !x.result || x.result.engine_result_code == 0) - { - console.log("Transaction failed:", x) - process.exit(1); - } - }; - - - const wasm = (x) => - { - console.log('wasm(' + x + ')'); - try - { - return fs.readFileSync(x).toString('hex').toUpperCase(); - } - catch (e) {} - - try - { - return fs.readFileSync('' + x).toString('hex').toUpperCase(); - } - catch (e) {} - - console.log("Could not find " + x) - process.exit(1); - }; - - - const wasmHash = (x)=> - { - const blob = wasm(x); - return crypto.createHash('SHA512'). - update(Buffer.from(blob, 'hex')). - digest().slice(0,32).toString('hex').toUpperCase(); - } - - const feeCompute = (account_seed, txn_org) => - { - return new Promise((resolve, reject) => - { - txn_to_send = { ... txn_org }; - txn_to_send['SigningPubKey'] = ''; - - let wal = xrpljs.Wallet.fromSeed(account_seed); - api.prepareTransaction(txn_to_send, {wallet: wal}).then(txn => - { - let ser = rbc.encode(txn); - fee(ser).then(fees => - { - let base_drops = fees.base_fee - - delete txn_to_send['SigningPubKey'] - if (txn_to_send['Fee'] === undefined) - txn_to_send['Fee'] = base_drops + ''; - - - api.request( - { - command: "account_info", - account: txn.Account - }).then(y=> - { - let seq = (y.result.account_data.Sequence); - txn_to_send.Sequence = seq; - api.prepareTransaction(txn_to_send, {wallet: wal}).then(txn => - { - resolve(txn); - }).catch(e=>{reject(e);}); - }).catch(e=>{reject(e);}); - }).catch(e=>{reject(e);}); - }).catch(e=>{reject(e);}); - }); - } - - const feeSubmitAccept = (seed, txn) => - { - return new Promise((resolve, reject) => - { - feeSubmit(seed, txn).then(x=> - { - ledgerAccept().then(()=> - { - resolve(x); - }).catch(e=> - { - reject(e); - }); - }).catch(e => - { - reject(e); - }); - }); - } - - const submit = (seed, txn) => - { - return new Promise((resolve, reject) => - { - api.submit(txn, - {wallet: xrpljs.Wallet.fromSeed(seed)}).then(s=> - { - resolve(s); - }).catch(e=>{reject(e);}); - }); - } - - const feeSubmit = (seed, txn) => - { - return new Promise((resolve, reject) => - { - feeCompute(seed, txn).then(txn=> - { - api.submit(txn, - {wallet: xrpljs.Wallet.fromSeed(seed)}).then(s=> - { - resolve(s); - }).catch(e=>{reject(e);}); - }).catch(e=>{reject(e);}); - }); - } - - const genesisseed = 'snoPBrXtMeMyMHUVTgbuqAfg1SUTb'; - const genesisaddr = 'rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh'; - - - const genesis = xrpljs.Wallet.fromSeed(genesisseed); - - const randomAccount = ()=> - { - const acc = xrpljs.Wallet.fromSeed(kp.generateSeed()); - return acc - }; - - const fromSeed = (x)=> - { - const acc = xrpljs.Wallet.fromSeed(x); - return acc - }; - - const pay_mock = (seed, amt, dest) => - { - if (dest.classicAddress != undefined) - dest = dest.classicAddress; - - return new Promise((resolve, reject) => - { - - let wal = xrpljs.Wallet.fromSeed(seed); - api.prepareTransaction({ - Account: wal.classicAddress, - TransactionType: "Payment", - Amount: ''+amt, - Destination: dest, - SigningPubKey: '' - }, {wallet: wal}).then(txn => - { - resolve(rbc.encode(txn)); - }).catch(e=> - { - reject(e); - }); - }); - - } - - const pay = (seed, amt, dest) => - { - if (dest.classicAddress != undefined) - dest = dest.classicAddress; - - return new Promise((resolve, reject) => - { - let wal = xrpljs.Wallet.fromSeed(seed); - - feeSubmit(seed, { - Account: wal.classicAddress, - TransactionType: "Payment", - Amount: ''+amt, - Destination: dest - }).then(x=> - { - assertTxnSuccess(x); - resolve(x); - }).catch(err); - }); - }; - - const hookHash = fn => - { - let b = fs.readFileSync('' + fn); - return crypto.createHash('SHA512').update(b).digest().slice(0,32).toString('hex').toUpperCase() - } - - const fundFromGenesis = (acc) => - { - return new Promise((resolve, reject) => - { - const ffg = (acc, after) => - { - if (typeof(acc) != 'string') - acc = acc.classicAddress; - - console.log('ffg: ' + acc); - feeSubmitAccept(genesis.seed, { - Account: genesis.classicAddress, // fund account from genesis - TransactionType: "Payment", - Amount: "100000000000", - Destination: acc, - }).then(x=> - { - assertTxnSuccess(x); - if (after) - return after(); - else - resolve(); - }).catch(err); - }; - - const doFfg = (acc) => - { - - if (typeof(acc.length) == 'undefined') - return ffg(acc); - else if (acc.length == 1) - return ffg(acc[0]); - else - { - return ffg(acc[0], - ((acc)=>{ - return ()=>{ - acc.shift(); - return doFfg(acc); - }; - })(acc)); - } - } - - return doFfg(acc); - - }); - }; - - - - const trustSet = (issuer, currency, limit, holders) => - { - if (typeof(issuer.classicAddress) != 'undefined') - issuer = issuer.classicAddress; - - return new Promise((resolve, reject)=> - { - const doTs = (holder) => - { - if (holder.length == 0) - return resolve(); - let h = holder.shift(); - feeSubmitAccept(h.seed, - { - Account: h.classicAddress, - TransactionType: "TrustSet", - LimitAmount: { - "currency": currency + "", - "issuer": issuer, - "value": limit + "" - } - }).then(x=> - { - console.log(x) - assertTxnSuccess(x); - return doTs(holder); - }).catch(e=>reject(e)); - }; - - doTs(holders); - }); - }; - - const issueTokens = (issuer, currency, toWhom) => - { - return new Promise((resolve, reject) => - { - const itf = (issuer, currency, toWhom) => - { - let c = 0; - for (let next in toWhom) - { - c++; - - let addr = next; - let amt = toWhom[addr]; - delete toWhom[addr]; - let txn = - { - Account: issuer.classicAddress, - TransactionType: "Payment", - Amount: { - "currency": currency, - "value": amt + "", - "issuer": issuer.classicAddress - }, - Destination: addr - }; - - feeSubmitAccept(issuer.seed, txn).then(x=> - { - console.log(x); - assertTxnSuccess(x); - return itf(issuer, currency, toWhom); - }).catch(e=>reject(e)); - break; - } - if (c == 0) - resolve(); - }; - return itf(issuer, currency, toWhom); - }); - }; - - const setTshCollect = (accounts) => - { - return new Promise((resolve, reject) => - { - const stc = (accounts) => - { - if (accounts.length == 0) - return resolve(); - let acc = accounts.shift(); - - feeSubmitAccept(acc.seed, - { - Account: acc.classicAddress, - TransactionType: "AccountSet", - SetFlag: 11 - }).then(x=> - { - console.log(x); - assertTxnSuccess(x); - return stc(accounts); - }).catch(e=>reject(e)); - }; - stc(accounts); - }); - } - - const feeSubmitAcceptMultiple = (txn, accounts) => - { - return new Promise((resolve, reject) => - { - const stc = (accounts) => - { - if (accounts.length == 0) - return resolve(); - let acc = accounts.shift(); - - let txn_to_submit = { ... txn }; - - txn_to_submit['Account'] = acc.classicAddress; - feeSubmitAccept(acc.seed, txn_to_submit).then(x=> - { - console.log(x); - assertTxnSuccess(x); - return stc(accounts); - }).catch(e=>reject(e)); - }; - stc(accounts); - }); - } - - const log = m => - { -// console.log(JSON.stringify(m, null, 4)); - console.dir(m, {depth:null}); - } - - - const hex_memos = (x) => - { - if (!("Memos" in x)) - return; - - for (y in x["Memos"]) - { - for (a in x["Memos"][y]) - { - let Fields = ["MemoFormat", "MemoType", "MemoData"]; - for (z in Fields) - { - if (Fields[z] in x["Memos"][y][a]) - { - let u = x["Memos"][y][a][Fields[z]].toUpperCase() - if (u.match(/^[0-9A-F]+$/)) - { - x["Memos"][y][a][Fields[z]] = u; - continue; - } - - x["Memos"][y][a][Fields[z]] = - ""+Buffer.from(x["Memos"][y][a][Fields[z]]).toString('hex').toUpperCase(); - } - } - } - } - } - - api.connect().then(()=> - { - resolve({ - hex_memos: hex_memos, - rbc: rbc, - rac: rac, - api: api, - xrpljs: xrpljs, - assertTxnSuccess: assertTxnSuccess, - assertTxnFailure: assertTxnFailure, - wasm: wasm, - kp: kp, - genesis: genesis, - randomAccount: randomAccount, - fromSeed: fromSeed, - fundFromGenesis: fundFromGenesis, - err: err, - hsfOVERRIDE: 1, - hsfNSDELETE: 2, - hsfCOLLECT: 4, - asfTshCollect: 11, - hookHash: hookHash, - pay: pay, - pay_mock: pay_mock, - fee: fee, - genesisseed: genesisseed, - genesisaddr: genesisaddr, - feeCompute: feeCompute, - feeSubmit: feeSubmit, - feeSubmitAccept: feeSubmitAccept, - ledgerAccept: ledgerAccept, - fetchMeta: fetchMeta, - fetchMetaHookExecutions: fetchMetaHookExecutions, - wasmHash: wasmHash, - assert: assert, - trustSet: trustSet, - issueTokens: issueTokens, - log: log, - submit: submit, - setTshCollect: setTshCollect, - feeSubmitAcceptMultiple: feeSubmitAcceptMultiple, - nftid: nftid - - }); - }).catch(err); - }); - } -}; diff --git a/hook/v3l1s b/hook/v3l1s deleted file mode 100644 index 503b8c69d..000000000 --- a/hook/v3l1s +++ /dev/null @@ -1,13 +0,0 @@ -nHDs6fHVnhb4ZbSFWF2dTTPHoZ6Rr39i2UfLotzgf8FKUi7iZdxx #tn4 -nHUvgFxT8EGrXqQZ1rqMw67UtduefbaCHiVtVahk9RXDJP1g1mB4 #tn5 -nHU7Vn6co7xEFMBesV7qw7FXE8ucKrhVWQiYZB5oGyMhvqrnZrnJ #tn6 table with 2 members -nHBoJCE3wPgkTcrNPMHyTJFQ2t77EyCAqcBRspFCpL6JhwCm94VZ #tn7 table with 3 members -nHUVv4g47bFMySAZFUKVaXUYEmfiUExSoY4FzwXULNwJRzju4XnQ #tn8 table with 5 members -nHBvr8avSFTz4TFxZvvi4rEJZZtyqE3J6KAAcVWVtifsE7edPM7q #tn9 tbale with 20 members -nHUH3Z8TRU57zetHbEPr1ynyrJhxQCwrJvNjr4j1SMjYADyW1WWe #tn10 -nHBdSXv3DhYJVXUppMLpCwJWDFVQyFdZrbMxeh8CFiBEvfTCy3Uh #tn11 - -+sn4KDPD8Voo8izLJmZ3YouPWupc6t - rh93ixpFBnSmgnytLe2qkC5YNCqykvcKH5 # tn4 -+snggivhEEkSuTWuznHCiezKkd16aF - rHWQWs7Ci1N6USkJRcCQgmDQB4RjrKg9MT # tn5 -+sn6QG65zVPwBdAiWiMV9gYUpTSs12 - rswfmipoy321YysJo145LaD3q3b7aqiC3t # tn10 -+shvun4yCBEkvDmTjKek6jERHjrHDM - rwLnvKrNK1YvdnbrLoeFLUfZwSTWg3iuLx # tn11 diff --git a/hook/v3l2s b/hook/v3l2s deleted file mode 100644 index df729e3a5..000000000 --- a/hook/v3l2s +++ /dev/null @@ -1,150 +0,0 @@ -V6 Seat 0: -{ - r: 'rN4HyiKpUuQM68pohiMPinQnyPdY8tBcWa', - s: 'shF4XCzYHfe3pSvKY6Yc526wFZmMA' -} -V6 Seat 1: -{ - r: 'rnsVxwrctvfiPX6wtX5tjYLPMidXFTqWc8', - s: 'sssxXie97ndAUgkrEsWasPYm7SgZx' -} -V7 Seat 0: -{ - r: 'rLjrBkBUSRtZJnFfZAbX4SFQSpkk2HcpX8', - s: 'shhohoyMjYKrJWDE4vUpS2SRNwB6G' -} -V7 Seat 1: -{ - r: 'rKUt5c9zqGCsZTVhUqrTUNnAbHHo19vtoM', - s: 'ssbEWV1w8gVdL8nFZncCmXVjnM8BW' -} -V7 Seat 2: -{ - r: 'rJY9NAbesWDGupunxyTvvtL3yWUDrbuCRF', - s: 'sp8vt3bSN28JWKhYB9ifcXcy76jT8' -} -V8 Seat 0: -{ - r: 'r38XdJQ2TKdLRAENjLoft8eDvFsUee5wbr', - s: 'saE4QyTBzDSNsmADzGE7hfywxxVzR' -} -V8 Seat 1: -{ - r: 'rnVtyAEp4TGyje7ccS1SjWHVwxqqQBeft3', - s: 'shngKoSPmo2vTq5ZEQ48MSsEkpRX7' -} -V8 Seat 2: -{ - r: 'rpzQniG7qsVi6qaS5X2QuscfpWY31j5bks', - s: 'spqgANJeTx9B8KdkWde46tNMtpD7Q' -} -V8 Seat 3: -{ - r: 'rsb7Y9qE7uvftjHZPW1qBVbLdCxjGe5G8X', - s: 'shaTpXZPvxiZu4LFTYHm6iqJNAQ4b' -} -V8 Seat 4: -{ - r: 'rJeoxs1fZW78sMeamwJ27CVcXZNpQZR3t', - s: 'sh2St95HdoahwkTKvQZPia3yquzER' -} -V9 Seat 0: -{ - r: 'rh8svn1EFs3TKEYVBZfWpNdqNr2R1uyM7y', - s: 'snPYNXdWmiXCKYai56JVqmHxCpQoU' -} -V9 Seat 1: -{ - r: 'rMn7PRAiT22hytTpLBHHZ34jPe2RCi2svT', - s: 'ssGAQLWSp3f48NgA1MuesSZePu4xH' -} -V9 Seat 2: -{ - r: 'rLSCctV2Q5rsduFuZk7N65mbSrf3BFknPc', - s: 'sn4kAb9ZvbExZSGgkrnefSxM9NdWo' -} -V9 Seat 3: -{ - r: 'rn8b9tjZbKmPSoMKV8QwgcU8wq2DVCdfQN', - s: 'snoo6dLLZkrriMrRqojLtcdjzSMH7' -} -V9 Seat 4: -{ - r: 'rEAeU9EDmdcJ3xPLW714bm9fygDV8XoNrj', - s: 'shw3jMCqPKSTQStGXG1vneYPDdG2e' -} -V9 Seat 5: -{ - r: 'rpCLrZYhfaN7ysBNpfAZuNj49Fyg4SHFGv', - s: 'snLsZJ32spovJXHq46DUZbiYU7DVn' -} -V9 Seat 6: -{ - r: 'rafa8E9RPa5vxZ4rN8s571aWUdbE4oqv7i', - s: 'sp8AzxGA9wreHT6GtjEKRxKqqXHbe' -} -V9 Seat 7: -{ - r: 'r37Qu8nTfdJFkE14ERAB3LH3wSdz1LbyzU', - s: 'shb2eB57gjwJQghkywSJB7dFzs2Gf' -} -V9 Seat 8: -{ - r: 'rnqXJXh1mGf9BGt3aB74RscNsJiDMV1YPK', - s: 'spxN1dbqj2eCR9GavBkZdk5vbHwgV' -} -V9 Seat 9: -{ - r: 'rLhHTgwBbq7aVsrSPp2CDeyX3RRuXihGVv', - s: 'shFpc2PJJKoacdPjgp4wio7rpZnyq' -} -V9 Seat 10: -{ - r: 'rJt6kBV8EjhN9v7U4KnYtydfFu3DaQVCvF', - s: 'shBVfbpYYrUKjBzwgzCDz1ZkeGEeU' -} -V9 Seat 11: -{ - r: 'r4YGLYBzvWTZGLKwbByfVxc8ZjCgBUUwBn', - s: 'sseqqUjoNptmRiNNpduE67vAiKKur' -} -V9 Seat 12: -{ - r: 'rEw7zrMdCXFs3CzxtC3NFpjmM2HBLTigVL', - s: 'shXdBhi8GyyPtmrRXwoVSRNDxpabc' -} -V9 Seat 13: -{ - r: 'rwrqQBN88MeT3QDipCfJSeJ9sZMZA54xkD', - s: 'sahvves9GbwcMPto383CBio5mq1uy' -} -V9 Seat 14: -{ - r: 'rpmAcuJAWVgS1zL3R1ob8F5ZSJ9d4jEAoj', - s: 'ssnPapLdvquGWyMqNj7nSgsRosjKa' -} -V9 Seat 15: -{ - r: 'rwGMc2FXtvPitSppNwJaSxqSfEfrLVRtMm', - s: 'shzZZot7Q4kEuWqW4j6SmCe9ptuc1' -} -V9 Seat 16: -{ - r: 'rUrAvfQTv16EETc3Q2sgCTAoKS9C49crx2', - s: 'snxdfhfLTkHM5ZYUTrTCPicxRt5Xh' -} -V9 Seat 17: -{ - r: 'rBDsW6p9Xak9b2ye2eAgh9JjpubTzeV1ti', - s: 'snb9xGH9M4WrtK4M15u4ZppzP84Rb' -} -V9 Seat 18: -{ - r: 'rhGbC5n1qK3Cq3sBbdtKGV5AR3kboXi41K', - s: 'shM2R6t3bM1cWrLKb7cMALgkL6mHS' -} -V9 Seat 19: -{ - r: 'rNu4sdVz6d2H37okUeH47ASMwckhzSx3k5', - s: 'ssBG6mp4rSAfK7FuwxCa4biY8Lqsu' -}

    AaLi9S$CuuB?2~`qvfQM&JShVuX|H+j{%OMA}w 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

}ku;=$~rH0d$c}Tu=i0qPihxjlNJ(Gm%B@!ckLH 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