Compare commits

..

4 Commits

Author SHA1 Message Date
Bronek Kozicki
d3f4720091 Merge branch 'develop' into Bronek/fortify_pseudo_account 2025-03-27 21:57:02 +00:00
Bronek Kozicki
0dc4c452f1 Add fixPseudoAccount 2025-03-27 21:42:31 +00:00
Bronek Kozicki
b96abfc230 Minor 2025-03-27 19:59:22 +00:00
Bronek Kozicki
f7720b08ec Factor out createPseudoAccount away from AMM 2025-03-27 15:13:13 +00:00
312 changed files with 4359 additions and 8526 deletions

View File

@@ -94,4 +94,3 @@ SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 8
UseTab: Never
QualifierAlignment: Right

View File

@@ -7,13 +7,13 @@ comment:
show_carryforward_flags: false
coverage:
range: "70..85"
range: "60..80"
precision: 1
round: nearest
status:
project:
default:
target: 75%
target: 60%
threshold: 2%
patch:
default:

8
.github/CODEOWNERS vendored
View File

@@ -1,8 +0,0 @@
# Allow anyone to review any change by default.
*
# Require the rpc-reviewers team to review changes to the rpc code.
include/libxrpl/protocol/ @xrplf/rpc-reviewers
src/libxrpl/protocol/ @xrplf/rpc-reviewers
src/xrpld/rpc/ @xrplf/rpc-reviewers
src/xrpld/app/misc/ @xrplf/rpc-reviewers

View File

@@ -1,13 +1,9 @@
name: clang-format
on:
push:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
on: [push, pull_request]
jobs:
check:
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
runs-on: ubuntu-24.04
env:
CLANG_VERSION: 18

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
permissions:
contents: write
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
container: rippleci/rippled-build-ubuntu:aaf5e3e
steps:
- name: checkout
uses: actions/checkout@v4

View File

@@ -1,13 +1,9 @@
name: levelization
on:
push:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
on: [push, pull_request]
jobs:
check:
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
runs-on: ubuntu-latest
env:
CLANG_VERSION: 10

View File

@@ -8,21 +8,19 @@ on:
paths:
- 'src/libxrpl/protocol/BuildInfo.cpp'
- '.github/workflows/libxrpl.yml'
types: [opened, reopened, synchronize, ready_for_review]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
publish:
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
name: Publish libXRPL
outputs:
outcome: ${{ steps.upload.outputs.outcome }}
version: ${{ steps.version.outputs.version }}
channel: ${{ steps.channel.outputs.channel }}
runs-on: [self-hosted, heavy]
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
container: rippleci/rippled-build-ubuntu:aaf5e3e
steps:
- name: Wait for essential checks to succeed
uses: lewagon/wait-on-check-action@v1.3.4

View File

@@ -1,7 +1,6 @@
name: macos
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
push:
# If the branches list is ever changed, be sure to change it on all
# build/test jobs (nix, macos, windows, instrumentation)
@@ -19,7 +18,6 @@ concurrency:
jobs:
test:
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
strategy:
matrix:
platform:
@@ -71,9 +69,6 @@ jobs:
nproc --version
echo -n "nproc returns: "
nproc
system_profiler SPHardwareDataType
sysctl -n hw.logicalcpu
clang --version
- name: configure Conan
run : |
conan profile new default --detect || true

View File

@@ -1,7 +1,6 @@
name: nix
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
push:
# If the branches list is ever changed, be sure to change it on all
# build/test jobs (nix, macos, windows)
@@ -40,7 +39,6 @@ concurrency:
jobs:
dependencies:
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
strategy:
fail-fast: false
matrix:
@@ -64,7 +62,7 @@ jobs:
cc: /usr/bin/clang-14
cxx: /usr/bin/clang++-14
runs-on: [self-hosted, heavy]
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
container: rippleci/rippled-build-ubuntu:aaf5e3e
env:
build_dir: .build
steps:
@@ -126,61 +124,7 @@ jobs:
- "-Dunity=ON"
needs: dependencies
runs-on: [self-hosted, heavy]
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
env:
build_dir: .build
steps:
- name: upgrade conan
run: |
pip install --upgrade "conan<2"
- name: download cache
uses: actions/download-artifact@v4
with:
name: ${{ matrix.platform }}-${{ matrix.compiler }}-${{ matrix.configuration }}
- name: extract cache
run: |
mkdir -p ~/.conan
tar -xzf conan.tar -C ~/.conan
- name: check environment
run: |
env | sort
echo ${PATH} | tr ':' '\n'
conan --version
cmake --version
- name: checkout
uses: actions/checkout@v4
- name: dependencies
uses: ./.github/actions/dependencies
env:
CONAN_URL: http://18.143.149.228:8081/artifactory/api/conan/conan-non-prod
with:
configuration: ${{ matrix.configuration }}
- name: build
uses: ./.github/actions/build
with:
generator: Ninja
configuration: ${{ matrix.configuration }}
cmake-args: "-Dassert=TRUE -Dwerr=TRUE ${{ matrix.cmake-args }}"
- name: test
run: |
${build_dir}/rippled --unittest --unittest-jobs $(nproc)
reference-fee-test:
strategy:
fail-fast: false
matrix:
platform:
- linux
compiler:
- gcc
configuration:
- Debug
cmake-args:
- "-DUNIT_TEST_REFERENCE_FEE=200"
- "-DUNIT_TEST_REFERENCE_FEE=1000"
needs: dependencies
runs-on: [self-hosted, heavy]
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
container: rippleci/rippled-build-ubuntu:aaf5e3e
env:
build_dir: .build
steps:
@@ -231,7 +175,7 @@ jobs:
- Debug
needs: dependencies
runs-on: [self-hosted, heavy]
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
container: rippleci/rippled-build-ubuntu:aaf5e3e
env:
build_dir: .build
steps:
@@ -247,7 +191,7 @@ jobs:
mkdir -p ~/.conan
tar -xzf conan.tar -C ~/.conan
- name: install gcovr
run: pip install "gcovr>=7,<9"
run: pip install "gcovr>=7,<8"
- name: check environment
run: |
echo ${PATH} | tr ':' '\n'
@@ -305,7 +249,7 @@ jobs:
conan:
needs: dependencies
runs-on: [self-hosted, heavy]
container: ghcr.io/xrplf/rippled-build-ubuntu:aaf5e3e
container: rippleci/rippled-build-ubuntu:aaf5e3e
env:
build_dir: .build
configuration: Release
@@ -360,7 +304,6 @@ jobs:
# later
instrumentation-build:
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
env:
CLANG_RELEASE: 16
strategy:

View File

@@ -2,7 +2,6 @@ name: windows
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
push:
# If the branches list is ever changed, be sure to change it on all
# build/test jobs (nix, macos, windows, instrumentation)
@@ -22,7 +21,6 @@ concurrency:
jobs:
test:
if: ${{ github.event_name == 'push' || github.event.pull_request.draft != true || contains(github.event.pull_request.labels.*.name, 'DraftRunCI') }}
strategy:
fail-fast: false
matrix:

View File

@@ -83,17 +83,9 @@ The [commandline](https://xrpl.org/docs/references/http-websocket-apis/api-conve
The `network_id` field was added in the `server_info` response in version 1.5.0 (2019), but it is not returned in [reporting mode](https://xrpl.org/rippled-server-modes.html#reporting-mode). However, use of reporting mode is now discouraged, in favor of using [Clio](https://github.com/XRPLF/clio) instead.
## XRP Ledger server version 2.5.0
As of 2025-04-04, version 2.5.0 is in development. You can use a pre-release version by building from source or [using the `nightly` package](https://xrpl.org/docs/infrastructure/installation/install-rippled-on-ubuntu).
### Additions and bugfixes in 2.5.0
- `channel_authorize`: If `signing_support` is not enabled in the config, the RPC is disabled.
## XRP Ledger server version 2.4.0
[Version 2.4.0](https://github.com/XRPLF/rippled/releases/tag/2.4.0) was released on March 4, 2025.
As of 2025-01-28, version 2.4.0 is in development. You can use a pre-release version by building from source or [using the `nightly` package](https://xrpl.org/docs/infrastructure/installation/install-rippled-on-ubuntu).
### Additions and bugfixes in 2.4.0

View File

@@ -1,5 +1,3 @@
[![codecov](https://codecov.io/gh/XRPLF/rippled/graph/badge.svg?token=WyFr5ajq3O)](https://codecov.io/gh/XRPLF/rippled)
# The XRP Ledger
The [XRP Ledger](https://xrpl.org/) is a decentralized cryptographic ledger powered by a network of peer-to-peer nodes. The XRP Ledger uses a novel Byzantine Fault Tolerant consensus algorithm to settle and record transactions in a secure distributed database without a central operator.

View File

@@ -26,7 +26,7 @@
#
# Examples:
# https://vl.ripple.com
# https://unl.xrplf.org
# https://vl.xrplf.org
# http://127.0.0.1:8000
# file:///etc/opt/ripple/vl.txt
#

View File

@@ -98,9 +98,6 @@
# 2024-04-03, Bronek Kozicki
# - add support for output formats: jacoco, clover, lcov
#
# 2025-05-12, Jingchen Wu
# - add -fprofile-update=atomic to ensure atomic profile generation
#
# USAGE:
#
# 1. Copy this file into your cmake modules path.
@@ -203,27 +200,15 @@ set(COVERAGE_COMPILER_FLAGS "-g --coverage"
CACHE INTERNAL "")
if(CMAKE_CXX_COMPILER_ID MATCHES "(GNU|Clang)")
include(CheckCXXCompilerFlag)
include(CheckCCompilerFlag)
check_cxx_compiler_flag(-fprofile-abs-path HAVE_cxx_fprofile_abs_path)
if(HAVE_cxx_fprofile_abs_path)
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
endif()
include(CheckCCompilerFlag)
check_c_compiler_flag(-fprofile-abs-path HAVE_c_fprofile_abs_path)
if(HAVE_c_fprofile_abs_path)
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-abs-path")
endif()
check_cxx_compiler_flag(-fprofile-update HAVE_cxx_fprofile_update)
if(HAVE_cxx_fprofile_update)
set(COVERAGE_CXX_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-update=atomic")
endif()
check_c_compiler_flag(-fprofile-update HAVE_c_fprofile_update)
if(HAVE_c_fprofile_update)
set(COVERAGE_C_COMPILER_FLAGS "${COVERAGE_COMPILER_FLAGS} -fprofile-update=atomic")
endif()
endif()
set(CMAKE_Fortran_FLAGS_COVERAGE

View File

@@ -136,9 +136,6 @@ if(xrpld)
add_executable(rippled)
if(tests)
target_compile_definitions(rippled PUBLIC ENABLE_TESTS)
target_compile_definitions(rippled PRIVATE
UNIT_TEST_REFERENCE_FEE=${UNIT_TEST_REFERENCE_FEE}
)
endif()
target_include_directories(rippled
PRIVATE

View File

@@ -11,12 +11,6 @@ option(assert "Enables asserts, even in release builds" OFF)
option(xrpld "Build xrpld" ON)
option(tests "Build tests" ON)
if(tests)
# This setting allows making a separate workflow to test fees other than default 10
if(NOT UNIT_TEST_REFERENCE_FEE)
set(UNIT_TEST_REFERENCE_FEE "10" CACHE STRING "")
endif()
endif()
option(unity "Creates a build using UNITY support in cmake. This is the default" ON)
if(unity)

View File

@@ -367,7 +367,7 @@ get(Section const& section,
}
inline std::string
get(Section const& section, std::string const& name, char const* defaultValue)
get(Section const& section, std::string const& name, const char* defaultValue)
{
try
{

View File

@@ -55,7 +55,7 @@ lz4Compress(void const* in, std::size_t inSize, BufferFactory&& bf)
auto compressed = bf(outCapacity);
auto compressedSize = LZ4_compress_default(
reinterpret_cast<char const*>(in),
reinterpret_cast<const char*>(in),
reinterpret_cast<char*>(compressed),
inSize,
outCapacity);
@@ -89,7 +89,7 @@ lz4Decompress(
Throw<std::runtime_error>("lz4Decompress: integer overflow (output)");
if (LZ4_decompress_safe(
reinterpret_cast<char const*>(in),
reinterpret_cast<const char*>(in),
reinterpret_cast<char*>(decompressed),
inSize,
decompressedSize) != decompressedSize)

View File

@@ -93,7 +93,7 @@ public:
{
}
constexpr E const&
constexpr const E&
value() const&
{
return val_;
@@ -111,7 +111,7 @@ public:
return std::move(val_);
}
constexpr E const&&
constexpr const E&&
value() const&&
{
return std::move(val_);

View File

@@ -294,7 +294,7 @@ IntrusiveRefCounts::releaseStrongRef() const
}
if (refCounts.compare_exchange_weak(
prevIntVal, nextIntVal, std::memory_order_acq_rel))
prevIntVal, nextIntVal, std::memory_order_release))
{
// Can't be in partial destroy because only decrementing the strong
// count to zero can start a partial destroy, and that can't happen
@@ -351,7 +351,7 @@ IntrusiveRefCounts::addWeakReleaseStrongRef() const
}
}
if (refCounts.compare_exchange_weak(
prevIntVal, nextIntVal, std::memory_order_acq_rel))
prevIntVal, nextIntVal, std::memory_order_release))
{
XRPL_ASSERT(
(!(prevIntVal & partialDestroyStartedMask)),
@@ -374,7 +374,7 @@ IntrusiveRefCounts::releaseWeakRef() const
// This case should only be hit if the partialDestroyStartedBit is
// set non-atomically (and even then very rarely). The code is kept
// in case we need to set the flag non-atomically for perf reasons.
refCounts.wait(prevIntVal, std::memory_order_acquire);
refCounts.wait(prevIntVal, std::memory_order_acq_rel);
prevIntVal = refCounts.load(std::memory_order_acquire);
prev = RefCountPair{prevIntVal};
}
@@ -382,7 +382,7 @@ IntrusiveRefCounts::releaseWeakRef() const
{
// partial destroy MUST finish before running a full destroy (when
// using weak pointers)
refCounts.wait(prevIntVal - weakDelta, std::memory_order_acquire);
refCounts.wait(prevIntVal - weakDelta, std::memory_order_acq_rel);
}
return ReleaseWeakRefAction::destroy;
}
@@ -396,7 +396,7 @@ IntrusiveRefCounts::checkoutStrongRefFromWeak() const noexcept
auto desiredValue = RefCountPair{2, 1}.combinedValue();
while (!refCounts.compare_exchange_weak(
curValue, desiredValue, std::memory_order_acq_rel))
curValue, desiredValue, std::memory_order_release))
{
RefCountPair const prev{curValue};
if (!prev.strong)

View File

@@ -115,7 +115,7 @@ public:
sweep();
bool
del(key_type const& key, bool valid);
del(const key_type& key, bool valid);
public:
/** Replace aliased objects with originals.
@@ -134,20 +134,20 @@ public:
template <class R>
bool
canonicalize(
key_type const& key,
const key_type& key,
SharedPointerType& data,
R&& replaceCallback);
bool
canonicalize_replace_cache(
key_type const& key,
const key_type& key,
SharedPointerType const& data);
bool
canonicalize_replace_client(key_type const& key, SharedPointerType& data);
canonicalize_replace_client(const key_type& key, SharedPointerType& data);
SharedPointerType
fetch(key_type const& key);
fetch(const key_type& key);
/** Insert the element into the container.
If the key already exists, nothing happens.
@@ -168,7 +168,7 @@ public:
// simply return an iterator.
//
bool
retrieve(key_type const& key, T& data);
retrieve(const key_type& key, T& data);
mutex_type&
peekMutex();
@@ -322,10 +322,10 @@ private:
std::string m_name;
// Desired number of cache entries (0 = ignore)
int const m_target_size;
const int m_target_size;
// Desired maximum cache age
clock_type::duration const m_target_age;
const clock_type::duration m_target_age;
// Number of items cached
int m_cache_count;

View File

@@ -365,7 +365,7 @@ TaggedCache<
SharedPointerType,
Hash,
KeyEqual,
Mutex>::del(key_type const& key, bool valid)
Mutex>::del(const key_type& key, bool valid)
{
// Remove from cache, if !valid, remove from map too. Returns true if
// removed from cache
@@ -414,7 +414,7 @@ TaggedCache<
KeyEqual,
Mutex>::
canonicalize(
key_type const& key,
const key_type& key,
SharedPointerType& data,
R&& replaceCallback)
{
@@ -509,7 +509,7 @@ TaggedCache<
KeyEqual,
Mutex>::
canonicalize_replace_cache(
key_type const& key,
const key_type& key,
SharedPointerType const& data)
{
return canonicalize(
@@ -535,7 +535,7 @@ TaggedCache<
Hash,
KeyEqual,
Mutex>::
canonicalize_replace_client(key_type const& key, SharedPointerType& data)
canonicalize_replace_client(const key_type& key, SharedPointerType& data)
{
return canonicalize(key, data, []() { return false; });
}
@@ -558,7 +558,7 @@ TaggedCache<
SharedPointerType,
Hash,
KeyEqual,
Mutex>::fetch(key_type const& key)
Mutex>::fetch(const key_type& key)
{
std::lock_guard<mutex_type> l(m_mutex);
auto ret = initialFetch(key, l);
@@ -656,7 +656,7 @@ TaggedCache<
SharedPointerType,
Hash,
KeyEqual,
Mutex>::retrieve(key_type const& key, T& data)
Mutex>::retrieve(const key_type& key, T& data)
{
// retrieve the value of the stored data
auto entry = fetch(key);

View File

@@ -374,7 +374,7 @@ public:
}
base_uint&
operator^=(base_uint const& b)
operator^=(const base_uint& b)
{
for (int i = 0; i < WIDTH; i++)
data_[i] ^= b.data_[i];
@@ -383,7 +383,7 @@ public:
}
base_uint&
operator&=(base_uint const& b)
operator&=(const base_uint& b)
{
for (int i = 0; i < WIDTH; i++)
data_[i] &= b.data_[i];
@@ -392,7 +392,7 @@ public:
}
base_uint&
operator|=(base_uint const& b)
operator|=(const base_uint& b)
{
for (int i = 0; i < WIDTH; i++)
data_[i] |= b.data_[i];
@@ -415,11 +415,11 @@ public:
return *this;
}
base_uint const
const base_uint
operator++(int)
{
// postfix operator
base_uint const ret = *this;
const base_uint ret = *this;
++(*this);
return ret;
@@ -441,11 +441,11 @@ public:
return *this;
}
base_uint const
const base_uint
operator--(int)
{
// postfix operator
base_uint const ret = *this;
const base_uint ret = *this;
--(*this);
return ret;
@@ -466,7 +466,7 @@ public:
}
base_uint&
operator+=(base_uint const& b)
operator+=(const base_uint& b)
{
std::uint64_t carry = 0;
@@ -511,7 +511,7 @@ public:
}
[[nodiscard]] constexpr bool
parseHex(char const* str)
parseHex(const char* str)
{
return parseHex(std::string_view{str});
}

View File

@@ -43,7 +43,7 @@ struct less
using result_type = bool;
constexpr bool
operator()(T const& left, T const& right) const
operator()(const T& left, const T& right) const
{
return std::less<T>()(left, right);
}
@@ -55,7 +55,7 @@ struct equal_to
using result_type = bool;
constexpr bool
operator()(T const& left, T const& right) const
operator()(const T& left, const T& right) const
{
return std::equal_to<T>()(left, right);
}

View File

@@ -52,7 +52,7 @@ template <
typename Value,
typename Hash,
typename Pred = std::equal_to<Key>,
typename Alloc = std::allocator<std::pair<Key const, Value>>>
typename Alloc = std::allocator<std::pair<const Key, Value>>>
class partitioned_unordered_map
{
std::size_t partitions_;

View File

@@ -76,13 +76,13 @@ public:
}
bool
operator<(tagged_integer const& rhs) const noexcept
operator<(const tagged_integer& rhs) const noexcept
{
return m_value < rhs.m_value;
}
bool
operator==(tagged_integer const& rhs) const noexcept
operator==(const tagged_integer& rhs) const noexcept
{
return m_value == rhs.m_value;
}
@@ -144,14 +144,14 @@ public:
}
tagged_integer&
operator<<=(tagged_integer const& rhs) noexcept
operator<<=(const tagged_integer& rhs) noexcept
{
m_value <<= rhs.m_value;
return *this;
}
tagged_integer&
operator>>=(tagged_integer const& rhs) noexcept
operator>>=(const tagged_integer& rhs) noexcept
{
m_value >>= rhs.m_value;
return *this;

View File

@@ -1,120 +0,0 @@
#ifndef RIPPLE_BASICS_FUNCTIONPROFILER_H_INCLUDED
#define RIPPLE_BASICS_FUNCTIONPROFILER_H_INCLUDED
#include <chrono>
#include <csignal>
#include <mutex>
#include <source_location>
#include <sstream>
#include <string>
#include <unordered_map>
#include <vector>
#include <cmath>
#include <numeric> // std::accumulate
#define PROFILING 1
#if PROFILING && (defined(__x86_64__) || defined(_M_X64))
#include <x86intrin.h>
#else
#define __rdtsc() 0
#endif
namespace beast {
template <typename T>
double compute_stddev(const std::vector<T>& samples) {
if (samples.size() < 2) return 0.0;
double mean = std::accumulate(samples.begin(), samples.end(), 0.0) / samples.size();
double sum_sq = 0.0;
for (double x : samples) {
sum_sq += (x - mean) * (x - mean);
}
return std::sqrt(sum_sq / (samples.size() - 1));
}
void
logProfilingResults();
class FunctionProfiler
{
public:
std::string functionName;
std::chrono::steady_clock::time_point start;
std::uint64_t cpuCycleStart;
inline static std::mutex mutex_;
struct StatisticData
{
std::vector<std::chrono::nanoseconds> time;
std::vector<std::uint64_t> cpuCycles;
};
inline static std::unordered_map<
std::string,
StatisticData>
funcionDurations;
FunctionProfiler(
std::string const& tag,
std::source_location location = std::source_location::current())
#if PROFILING
: functionName(location.function_name() + tag)
, start(std::chrono::steady_clock::now())
, cpuCycleStart(__rdtsc())
#endif
{
}
~FunctionProfiler() noexcept
{
#if PROFILING
auto duration = std::chrono::steady_clock::now() - start;
std::lock_guard<std::mutex> lock{mutex_};
funcionDurations[functionName].time.emplace_back(duration);
funcionDurations[functionName].cpuCycles.emplace_back((__rdtsc() - cpuCycleStart));
#endif
}
};
inline std::string
getProfilingResults()
{
#if PROFILING
std::lock_guard<std::mutex> lock{FunctionProfiler::mutex_};
std::stringstream ss;
ss << "Function profiling results:" << std::endl;
ss << "name,time,cpu cycles,count,average time(ns),time standard deviation,average cpu cycles,cpu cycles standard deviation" << std::endl;
for (auto const& [name, duration] : FunctionProfiler::funcionDurations)
{
std::vector<std::int64_t> times;
times.reserve(duration.time.size());
std::transform(std::begin(duration.time), std::end(duration.time), std::back_inserter(times), [](const std::chrono::nanoseconds& time) {
return static_cast<std::int64_t>(time.count());
});
auto timeInTotal = std::accumulate(std::begin(times), std::end(times), std::int64_t{0});
auto cpuCyclesInTotal = std::accumulate(std::begin(duration.cpuCycles), std::end(duration.cpuCycles), std::int64_t{0});
ss << name << "," << timeInTotal << ","
<< cpuCyclesInTotal << ","
<< duration.time.size() << ","
<< timeInTotal / (double)duration.time.size() << ","
<< compute_stddev(times) << ","
<< cpuCyclesInTotal / (double)duration.cpuCycles.size() << ","
<< compute_stddev(duration.cpuCycles)
<< std::endl;
}
return ss.str();
#else
return "";
#endif
}
} // namespace beast
#endif

View File

@@ -20,48 +20,24 @@
#ifndef BEAST_HASH_XXHASHER_H_INCLUDED
#define BEAST_HASH_XXHASHER_H_INCLUDED
#include <xrpl/beast/core/FunctionProfiler.h>
#include <boost/endian/conversion.hpp>
#include <xxhash.h>
#include <cstddef>
#include <iostream>
#include <new>
#include <span>
#include <type_traits>
#define ORIGINAL_HASH 1
#define BIT_SHIFT_HASH 0
namespace beast {
class xxhasher
{
public:
using HashType = std::size_t;
private:
// requires 64-bit std::size_t
static_assert(sizeof(std::size_t) == 8, "");
#if ORIGINAL_HASH
XXH3_state_t* state_;
#endif
#if PROFILING
std::size_t totalSize_ = 0;
std::chrono::nanoseconds duration_{};
std::uint64_t cpuCycles = 0;
#endif
XXH64_hash_t seed_ = 0;
std::array<std::uint8_t, 40> buffer_;
std::span<std::uint8_t> readBuffer_;
std::span<std::uint8_t> writeBuffer_;
#if ORIGINAL_HASH
static XXH3_state_t*
allocState()
{
@@ -70,24 +46,6 @@ private:
throw std::bad_alloc();
return ret;
}
#endif
void
setupBuffers()
{
writeBuffer_ = std::span{buffer_};
}
void
writeBuffer(void const* data, std::size_t len)
{
auto bytesToWrite = std::min(len, writeBuffer_.size());
std::memcpy(writeBuffer_.data(), data, bytesToWrite);
writeBuffer_ = writeBuffer_.subspan(bytesToWrite);
readBuffer_ = std::span{
std::begin(buffer_), buffer_.size() - writeBuffer_.size()};
}
public:
using result_type = std::size_t;
@@ -100,48 +58,22 @@ public:
xxhasher()
{
#if PROFILING
auto start = std::chrono::steady_clock::now();
auto cpuCyclesStart = __rdtsc();
#endif
#if ORIGINAL_HASH
state_ = allocState();
XXH3_64bits_reset(state_);
#else
setupBuffers();
#endif
#if PROFILING
duration_ += std::chrono::steady_clock::now() - start;
cpuCycles += (__rdtsc() - cpuCyclesStart);
#endif
}
#if ORIGINAL_HASH
~xxhasher() noexcept
{
XXH3_freeState(state_);
}
#endif
template <
class Seed,
std::enable_if_t<std::is_unsigned<Seed>::value>* = nullptr>
explicit xxhasher(Seed seed)
{
seed_ = seed;
#if ORIGINAL_HASH
auto start = std::chrono::steady_clock::now();
auto cpuCyclesStart = __rdtsc();
state_ = allocState();
XXH3_64bits_reset_withSeed(state_, seed);
duration_ += (std::chrono::steady_clock::now() - start);
cpuCycles += (__rdtsc() - cpuCyclesStart);
#else
setupBuffers();
#endif
}
template <
@@ -149,92 +81,20 @@ public:
std::enable_if_t<std::is_unsigned<Seed>::value>* = nullptr>
xxhasher(Seed seed, Seed)
{
#if PROFILING
auto start = std::chrono::steady_clock::now();
auto cpuCyclesStart = __rdtsc();
#endif
seed_ = seed;
#if ORIGINAL_HASH
state_ = allocState();
XXH3_64bits_reset_withSeed(state_, seed);
#else
setupBuffers();
#endif
#if PROFILING
duration_ += (std::chrono::steady_clock::now() - start);
cpuCycles += (__rdtsc() - cpuCyclesStart);
#endif
}
void
operator()(void const* key, std::size_t len) noexcept
{
#if PROFILING
totalSize_ += len;
auto start = std::chrono::steady_clock::now();
auto cpuCyclesStart = __rdtsc();
#endif
#if ORIGINAL_HASH
XXH3_64bits_update(state_, key, len);
#else
writeBuffer(key, len);
#endif
#if PROFILING
duration_ += (std::chrono::steady_clock::now() - start);
cpuCycles += (__rdtsc() - cpuCyclesStart);
#endif
}
explicit
operator HashType() noexcept
operator std::size_t() noexcept
{
#if ORIGINAL_HASH == 0
if (readBuffer_.size() == 0) return 0;
#endif
#if PROFILING
auto start = std::chrono::steady_clock::now();
auto cpuCyclesStart = __rdtsc();
#endif
#if BIT_SHIFT_HASH
const size_t bit_width = readBuffer_.size() * 8;
const size_t shift = seed_ % bit_width;
// Copy input into a buffer long enough to safely extract 64 bits with wraparound
std::uint64_t buffer = 0;
// Load the first 8 bytes (or wrap if input < 8 bytes)
for (size_t i = 0; i < 8; ++i) {
size_t index = readBuffer_.size() - 1 - (i % readBuffer_.size());
buffer <<= 8;
buffer |= readBuffer_[index];
}
// Rotate and return
auto result = (buffer << shift) | (buffer >> (64 - shift));
#elif ORIGINAL_HASH
auto result = XXH3_64bits_digest(state_);
#else
auto result = seed_ == 0 ?
XXH3_64bits(readBuffer_.data(), readBuffer_.size()) :
XXH3_64bits_withSeed(readBuffer_.data(), readBuffer_.size(), seed_);
#endif
#if PROFILING
duration_ += (std::chrono::steady_clock::now() - start);
cpuCycles += (__rdtsc() - cpuCyclesStart);
std::lock_guard<std::mutex> lock{FunctionProfiler::mutex_};
FunctionProfiler::funcionDurations
["xxhasher-" + std::to_string(totalSize_)]
.time.emplace_back(duration_);
FunctionProfiler::funcionDurations
["xxhasher-" + std::to_string(totalSize_)]
.cpuCycles.emplace_back(cpuCycles);
#endif
return result;
return XXH3_64bits_digest(state_);
}
};

View File

@@ -37,9 +37,9 @@ class temp_dir
public:
#if !GENERATING_DOCS
temp_dir(temp_dir const&) = delete;
temp_dir(const temp_dir&) = delete;
temp_dir&
operator=(temp_dir const&) = delete;
operator=(const temp_dir&) = delete;
#endif
/// Construct a temporary directory.

View File

@@ -39,7 +39,7 @@ class Reader
{
public:
using Char = char;
using Location = Char const*;
using Location = const Char*;
/** \brief Constructs a Reader allowing all features
* for parsing.
@@ -64,7 +64,7 @@ public:
* error occurred.
*/
bool
parse(char const* beginDoc, char const* endDoc, Value& root);
parse(const char* beginDoc, const char* endDoc, Value& root);
/// \brief Parse from input stream.
/// \see Json::operator>>(std::istream&, Json::Value&).
@@ -133,7 +133,7 @@ private:
using Errors = std::deque<ErrorInfo>;
bool
expectToken(TokenType type, Token& token, char const* message);
expectToken(TokenType type, Token& token, const char* message);
bool
readToken(Token& token);
void

View File

@@ -61,24 +61,24 @@ enum ValueType {
class StaticString
{
public:
constexpr explicit StaticString(char const* czstring) : str_(czstring)
constexpr explicit StaticString(const char* czstring) : str_(czstring)
{
}
constexpr
operator char const*() const
operator const char*() const
{
return str_;
}
constexpr char const*
constexpr const char*
c_str() const
{
return str_;
}
private:
char const* str_;
const char* str_;
};
inline bool
@@ -156,10 +156,10 @@ public:
using Int = Json::Int;
using ArrayIndex = UInt;
static Value const null;
static Int const minInt;
static Int const maxInt;
static UInt const maxUInt;
static const Value null;
static const Int minInt;
static const Int maxInt;
static const UInt maxUInt;
private:
class CZString
@@ -171,24 +171,24 @@ private:
duplicateOnCopy
};
CZString(int index);
CZString(char const* cstr, DuplicationPolicy allocate);
CZString(CZString const& other);
CZString(const char* cstr, DuplicationPolicy allocate);
CZString(const CZString& other);
~CZString();
CZString&
operator=(CZString const& other) = delete;
operator=(const CZString& other) = delete;
bool
operator<(CZString const& other) const;
operator<(const CZString& other) const;
bool
operator==(CZString const& other) const;
operator==(const CZString& other) const;
int
index() const;
char const*
const char*
c_str() const;
bool
isStaticString() const;
private:
char const* cstr_;
const char* cstr_;
int index_;
};
@@ -215,7 +215,7 @@ public:
Value(Int value);
Value(UInt value);
Value(double value);
Value(char const* value);
Value(const char* value);
/** \brief Constructs a value from a static string.
* Like other value string constructor but do not duplicate the string for
@@ -227,10 +227,10 @@ public:
* Json::Value aValue( StaticString("some text") );
* \endcode
*/
Value(StaticString const& value);
Value(const StaticString& value);
Value(std::string const& value);
Value(bool value);
Value(Value const& other);
Value(const Value& other);
~Value();
Value&
@@ -247,7 +247,7 @@ public:
ValueType
type() const;
char const*
const char*
asCString() const;
/** Returns the unquoted string value. */
std::string
@@ -317,12 +317,12 @@ public:
/// Access an array element (zero based index )
/// (You may need to say 'value[0u]' to get your compiler to distinguish
/// this from the operator[] which takes a string.)
Value const&
const Value&
operator[](UInt index) const;
/// If the array contains at least index+1 elements, returns the element
/// value, otherwise returns defaultValue.
Value
get(UInt index, Value const& defaultValue) const;
get(UInt index, const Value& defaultValue) const;
/// Return true if index < size().
bool
isValidIndex(UInt index) const;
@@ -330,25 +330,25 @@ public:
///
/// Equivalent to jsonvalue[jsonvalue.size()] = value;
Value&
append(Value const& value);
append(const Value& value);
Value&
append(Value&& value);
/// Access an object value by name, create a null member if it does not
/// exist.
Value&
operator[](char const* key);
operator[](const char* key);
/// Access an object value by name, returns null if there is no member with
/// that name.
Value const&
operator[](char const* key) const;
const Value&
operator[](const char* key) const;
/// Access an object value by name, create a null member if it does not
/// exist.
Value&
operator[](std::string const& key);
/// Access an object value by name, returns null if there is no member with
/// that name.
Value const&
const Value&
operator[](std::string const& key) const;
/** \brief Access an object value by name, create a null member if it does
not exist.
@@ -364,14 +364,14 @@ public:
* \endcode
*/
Value&
operator[](StaticString const& key);
operator[](const StaticString& key);
/// Return the member named key if it exist, defaultValue otherwise.
Value
get(char const* key, Value const& defaultValue) const;
get(const char* key, const Value& defaultValue) const;
/// Return the member named key if it exist, defaultValue otherwise.
Value
get(std::string const& key, Value const& defaultValue) const;
get(std::string const& key, const Value& defaultValue) const;
/// \brief Remove and return the named member.
///
@@ -380,14 +380,14 @@ public:
/// \pre type() is objectValue or nullValue
/// \post type() is unchanged
Value
removeMember(char const* key);
removeMember(const char* key);
/// Same as removeMember(const char*)
Value
removeMember(std::string const& key);
/// Return true if the object has a member named key.
bool
isMember(char const* key) const;
isMember(const char* key) const;
/// Return true if the object has a member named key.
bool
isMember(std::string const& key) const;
@@ -414,13 +414,13 @@ public:
end();
friend bool
operator==(Value const&, Value const&);
operator==(const Value&, const Value&);
friend bool
operator<(Value const&, Value const&);
operator<(const Value&, const Value&);
private:
Value&
resolveReference(char const* key, bool isStatic);
resolveReference(const char* key, bool isStatic);
private:
union ValueHolder
@@ -437,31 +437,31 @@ private:
};
bool
operator==(Value const&, Value const&);
operator==(const Value&, const Value&);
inline bool
operator!=(Value const& x, Value const& y)
operator!=(const Value& x, const Value& y)
{
return !(x == y);
}
bool
operator<(Value const&, Value const&);
operator<(const Value&, const Value&);
inline bool
operator<=(Value const& x, Value const& y)
operator<=(const Value& x, const Value& y)
{
return !(y < x);
}
inline bool
operator>(Value const& x, Value const& y)
operator>(const Value& x, const Value& y)
{
return y < x;
}
inline bool
operator>=(Value const& x, Value const& y)
operator>=(const Value& x, const Value& y)
{
return !(x < y);
}
@@ -482,11 +482,11 @@ public:
virtual ~ValueAllocator() = default;
virtual char*
makeMemberName(char const* memberName) = 0;
makeMemberName(const char* memberName) = 0;
virtual void
releaseMemberName(char* memberName) = 0;
virtual char*
duplicateStringValue(char const* value, unsigned int length = unknown) = 0;
duplicateStringValue(const char* value, unsigned int length = unknown) = 0;
virtual void
releaseStringValue(char* value) = 0;
};
@@ -503,16 +503,16 @@ public:
ValueIteratorBase();
explicit ValueIteratorBase(Value::ObjectValues::iterator const& current);
explicit ValueIteratorBase(const Value::ObjectValues::iterator& current);
bool
operator==(SelfType const& other) const
operator==(const SelfType& other) const
{
return isEqual(other);
}
bool
operator!=(SelfType const& other) const
operator!=(const SelfType& other) const
{
return !isEqual(other);
}
@@ -528,7 +528,7 @@ public:
/// Return the member name of the referenced Value. "" if it is not an
/// objectValue.
char const*
const char*
memberName() const;
protected:
@@ -542,13 +542,13 @@ protected:
decrement();
difference_type
computeDistance(SelfType const& other) const;
computeDistance(const SelfType& other) const;
bool
isEqual(SelfType const& other) const;
isEqual(const SelfType& other) const;
void
copy(SelfType const& other);
copy(const SelfType& other);
private:
Value::ObjectValues::iterator current_;
@@ -566,8 +566,8 @@ class ValueConstIterator : public ValueIteratorBase
public:
using size_t = unsigned int;
using difference_type = int;
using reference = Value const&;
using pointer = Value const*;
using reference = const Value&;
using pointer = const Value*;
using SelfType = ValueConstIterator;
ValueConstIterator() = default;
@@ -575,11 +575,11 @@ public:
private:
/*! \internal Use by Value to create an iterator.
*/
explicit ValueConstIterator(Value::ObjectValues::iterator const& current);
explicit ValueConstIterator(const Value::ObjectValues::iterator& current);
public:
SelfType&
operator=(ValueIteratorBase const& other);
operator=(const ValueIteratorBase& other);
SelfType
operator++(int)
@@ -632,17 +632,17 @@ public:
using SelfType = ValueIterator;
ValueIterator() = default;
ValueIterator(ValueConstIterator const& other);
ValueIterator(ValueIterator const& other);
ValueIterator(const ValueConstIterator& other);
ValueIterator(const ValueIterator& other);
private:
/*! \internal Use by Value to create an iterator.
*/
explicit ValueIterator(Value::ObjectValues::iterator const& current);
explicit ValueIterator(const Value::ObjectValues::iterator& current);
public:
SelfType&
operator=(SelfType const& other);
operator=(const SelfType& other);
SelfType
operator++(int)

View File

@@ -39,7 +39,7 @@ public:
{
}
virtual std::string
write(Value const& root) = 0;
write(const Value& root) = 0;
};
/** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format
@@ -60,11 +60,11 @@ public:
public: // overridden from Writer
std::string
write(Value const& root) override;
write(const Value& root) override;
private:
void
writeValue(Value const& value);
writeValue(const Value& value);
std::string document_;
};
@@ -101,15 +101,15 @@ public: // overridden from Writer
* JSON document that represents the root value.
*/
std::string
write(Value const& root) override;
write(const Value& root) override;
private:
void
writeValue(Value const& value);
writeValue(const Value& value);
void
writeArrayValue(Value const& value);
writeArrayValue(const Value& value);
bool
isMultineArray(Value const& value);
isMultineArray(const Value& value);
void
pushValue(std::string const& value);
void
@@ -168,15 +168,15 @@ public:
* return a value.
*/
void
write(std::ostream& out, Value const& root);
write(std::ostream& out, const Value& root);
private:
void
writeValue(Value const& value);
writeValue(const Value& value);
void
writeArrayValue(Value const& value);
writeArrayValue(const Value& value);
bool
isMultineArray(Value const& value);
isMultineArray(const Value& value);
void
pushValue(std::string const& value);
void
@@ -207,12 +207,12 @@ valueToString(double value);
std::string
valueToString(bool value);
std::string
valueToQuotedString(char const* value);
valueToQuotedString(const char* value);
/// \brief Output using the StyledStreamWriter.
/// \see Json::operator>>()
std::ostream&
operator<<(std::ostream&, Value const& root);
operator<<(std::ostream&, const Value& root);
//------------------------------------------------------------------------------

View File

@@ -37,7 +37,7 @@ pretty(Value const&);
/** Output using the StyledStreamWriter. @see Json::operator>>(). */
std::ostream&
operator<<(std::ostream&, Value const& root);
operator<<(std::ostream&, const Value& root);
} // namespace Json

View File

@@ -48,14 +48,6 @@ class STObject;
class STAmount;
class Rules;
/** Calculate AMM account ID.
*/
AccountID
ammAccountID(
std::uint16_t prefix,
uint256 const& parentHash,
uint256 const& ammID);
/** Calculate Liquidity Provider Token (LPT) Currency.
*/
Currency

View File

@@ -120,7 +120,7 @@ enum error_code_i {
rpcSRC_ACT_MALFORMED = 65,
rpcSRC_ACT_MISSING = 66,
rpcSRC_ACT_NOT_FOUND = 67,
rpcDELEGATE_ACT_NOT_FOUND = 68,
// unused 68,
rpcSRC_CUR_MALFORMED = 69,
rpcSRC_ISR_MALFORMED = 70,
rpcSTREAM_MALFORMED = 71,

View File

@@ -336,7 +336,7 @@ public:
// Output Fees as just their numeric value.
template <class Char, class Traits, class UnitTag, class T>
std::basic_ostream<Char, Traits>&
operator<<(std::basic_ostream<Char, Traits>& os, TaggedFee<UnitTag, T> const& q)
operator<<(std::basic_ostream<Char, Traits>& os, const TaggedFee<UnitTag, T>& q)
{
return os << q.value();
}

View File

@@ -279,10 +279,6 @@ amm(Asset const& issue1, Asset const& issue2) noexcept;
Keylet
amm(uint256 const& amm) noexcept;
/** A keylet for Delegate object */
Keylet
delegate(AccountID const& account, AccountID const& authorizedAccount) noexcept;
Keylet
bridge(STXChainBridge const& bridge, STXChainBridge::ChainType chainType);

View File

@@ -132,7 +132,7 @@ enum LedgerSpecificFlags {
lsfNoFreeze = 0x00200000, // True, cannot freeze ripple states
lsfGlobalFreeze = 0x00400000, // True, all assets frozen
lsfDefaultRipple =
0x00800000, // True, incoming trust lines allow rippling by default
0x00800000, // True, trust lines allow rippling by default
lsfDepositAuth = 0x01000000, // True, all deposits require authorization
/* // reserved for Hooks amendment
lsfTshCollect = 0x02000000, // True, allow TSH collect-calls to acc hooks

View File

@@ -80,7 +80,7 @@ struct MultiApiJson
}
void
set(char const* key, auto const& v)
set(const char* key, auto const& v)
requires std::constructible_from<Json::Value, decltype(v)>
{
for (auto& a : this->val)
@@ -91,7 +91,7 @@ struct MultiApiJson
enum IsMemberResult : int { none = 0, some, all };
[[nodiscard]] IsMemberResult
isMember(char const* key) const
isMember(const char* key) const
{
int count = 0;
for (auto& a : this->val)

View File

@@ -1,97 +0,0 @@
//------------------------------------------------------------------------------
/*
This file is part of rippled: https://github.com/ripple/rippled
Copyright (c) 2025 Ripple Labs Inc.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
//==============================================================================
#ifndef RIPPLE_PROTOCOL_PERMISSION_H_INCLUDED
#define RIPPLE_PROTOCOL_PERMISSION_H_INCLUDED
#include <xrpl/protocol/TxFormats.h>
#include <optional>
#include <string>
#include <unordered_map>
#include <unordered_set>
namespace ripple {
/**
* We have both transaction type permissions and granular type permissions.
* Since we will reuse the TransactionFormats to parse the Transaction
* Permissions, only the GranularPermissionType is defined here. To prevent
* conflicts with TxType, the GranularPermissionType is always set to a value
* greater than the maximum value of uint16.
*/
enum GranularPermissionType : std::uint32_t {
#pragma push_macro("PERMISSION")
#undef PERMISSION
#define PERMISSION(type, txType, value) type = value,
#include <xrpl/protocol/detail/permissions.macro>
#undef PERMISSION
#pragma pop_macro("PERMISSION")
};
enum Delegation { delegatable, notDelegatable };
class Permission
{
private:
Permission();
std::unordered_map<std::uint16_t, Delegation> delegatableTx_;
std::unordered_map<std::string, GranularPermissionType>
granularPermissionMap_;
std::unordered_map<GranularPermissionType, std::string> granularNameMap_;
std::unordered_map<GranularPermissionType, TxType> granularTxTypeMap_;
public:
static Permission const&
getInstance();
Permission(Permission const&) = delete;
Permission&
operator=(Permission const&) = delete;
std::optional<std::uint32_t>
getGranularValue(std::string const& name) const;
std::optional<std::string>
getGranularName(GranularPermissionType const& value) const;
std::optional<TxType>
getGranularTxType(GranularPermissionType const& gpType) const;
bool
isDelegatable(std::uint32_t const& permissionValue) const;
// for tx level permission, permission value is equal to tx type plus one
uint32_t
txToPermissionType(TxType const& type) const;
// tx type value is permission value minus one
TxType
permissionToTxType(uint32_t const& value) const;
};
} // namespace ripple
#endif

View File

@@ -155,10 +155,6 @@ std::size_t constexpr maxPriceScale = 20;
*/
std::size_t constexpr maxTrim = 25;
/** The maximum number of delegate permissions an account can grant
*/
std::size_t constexpr permissionMaxSize = 10;
} // namespace ripple
#endif

View File

@@ -113,8 +113,8 @@ public:
// have lower unsigned integer representations.
using value_type = std::uint64_t;
static int const minTickSize = 3;
static int const maxTickSize = 16;
static const int minTickSize = 3;
static const int maxTickSize = 16;
private:
// This has the same representation as STAmount, see the comment on the

View File

@@ -182,22 +182,22 @@ public:
private_access_tag_t,
SerializedTypeID tid,
int fv,
char const* fn,
const char* fn,
int meta = sMD_Default,
IsSigning signing = IsSigning::yes);
explicit SField(private_access_tag_t, int fc);
static SField const&
static const SField&
getField(int fieldCode);
static SField const&
static const SField&
getField(std::string const& fieldName);
static SField const&
static const SField&
getField(int type, int value)
{
return getField(field_code(type, value));
}
static SField const&
static const SField&
getField(SerializedTypeID type, int value)
{
return getField(field_code(type, value));
@@ -284,19 +284,19 @@ public:
}
bool
operator==(SField const& f) const
operator==(const SField& f) const
{
return fieldCode == f.fieldCode;
}
bool
operator!=(SField const& f) const
operator!=(const SField& f) const
{
return fieldCode != f.fieldCode;
}
static int
compare(SField const& f1, SField const& f2);
compare(const SField& f1, const SField& f2);
static std::map<int, SField const*> const&
getKnownCodeToField()

View File

@@ -58,7 +58,7 @@ public:
add(Serializer& s) const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;

View File

@@ -62,20 +62,20 @@ private:
public:
using value_type = STAmount;
static int const cMinOffset = -96;
static int const cMaxOffset = 80;
static const int cMinOffset = -96;
static const int cMaxOffset = 80;
// Maximum native value supported by the code
static std::uint64_t const cMinValue = 1000000000000000ull;
static std::uint64_t const cMaxValue = 9999999999999999ull;
static std::uint64_t const cMaxNative = 9000000000000000000ull;
static const std::uint64_t cMinValue = 1000000000000000ull;
static const std::uint64_t cMaxValue = 9999999999999999ull;
static const std::uint64_t cMaxNative = 9000000000000000000ull;
// Max native value on network.
static std::uint64_t const cMaxNativeN = 100000000000000000ull;
static std::uint64_t const cIssuedCurrency = 0x8000000000000000ull;
static std::uint64_t const cPositive = 0x4000000000000000ull;
static std::uint64_t const cMPToken = 0x2000000000000000ull;
static std::uint64_t const cValueMask = ~(cPositive | cMPToken);
static const std::uint64_t cMaxNativeN = 100000000000000000ull;
static const std::uint64_t cIssuedCurrency = 0x8000000000000000ull;
static const std::uint64_t cPositive = 0x4000000000000000ull;
static const std::uint64_t cMPToken = 0x2000000000000000ull;
static const std::uint64_t cValueMask = ~(cPositive | cMPToken);
static std::uint64_t const uRateOne;
@@ -274,7 +274,7 @@ public:
add(Serializer& s) const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;

View File

@@ -128,13 +128,13 @@ public:
add(Serializer& s) const override;
void
sort(bool (*compare)(STObject const& o1, STObject const& o2));
sort(bool (*compare)(const STObject& o1, const STObject& o2));
bool
operator==(STArray const& s) const;
operator==(const STArray& s) const;
bool
operator!=(STArray const& s) const;
operator!=(const STArray& s) const;
iterator
erase(iterator pos);
@@ -152,7 +152,7 @@ public:
getSType() const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;
@@ -275,13 +275,13 @@ STArray::swap(STArray& a) noexcept
}
inline bool
STArray::operator==(STArray const& s) const
STArray::operator==(const STArray& s) const
{
return v_ == s.v_;
}
inline bool
STArray::operator!=(STArray const& s) const
STArray::operator!=(const STArray& s) const
{
return v_ != s.v_;
}

View File

@@ -129,16 +129,16 @@ class STBase
public:
virtual ~STBase() = default;
STBase();
STBase(STBase const&) = default;
STBase(const STBase&) = default;
STBase&
operator=(STBase const& t);
operator=(const STBase& t);
explicit STBase(SField const& n);
bool
operator==(STBase const& t) const;
operator==(const STBase& t) const;
bool
operator!=(STBase const& t) const;
operator!=(const STBase& t) const;
template <class D>
D&
@@ -197,7 +197,7 @@ private:
//------------------------------------------------------------------------------
std::ostream&
operator<<(std::ostream& out, STBase const& t);
operator<<(std::ostream& out, const STBase& t);
template <class D>
D&

View File

@@ -45,8 +45,8 @@ public:
STBitString() = default;
STBitString(SField const& n);
STBitString(value_type const& v);
STBitString(SField const& n, value_type const& v);
STBitString(const value_type& v);
STBitString(SField const& n, const value_type& v);
STBitString(SerialIter& sit, SField const& name);
SerializedTypeID
@@ -56,7 +56,7 @@ public:
getText() const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
void
add(Serializer& s) const override;
@@ -93,12 +93,12 @@ inline STBitString<Bits>::STBitString(SField const& n) : STBase(n)
}
template <int Bits>
inline STBitString<Bits>::STBitString(value_type const& v) : value_(v)
inline STBitString<Bits>::STBitString(const value_type& v) : value_(v)
{
}
template <int Bits>
inline STBitString<Bits>::STBitString(SField const& n, value_type const& v)
inline STBitString<Bits>::STBitString(SField const& n, const value_type& v)
: STBase(n), value_(v)
{
}
@@ -160,9 +160,9 @@ STBitString<Bits>::getText() const
template <int Bits>
bool
STBitString<Bits>::isEquivalent(STBase const& t) const
STBitString<Bits>::isEquivalent(const STBase& t) const
{
STBitString const* v = dynamic_cast<STBitString const*>(&t);
const STBitString* v = dynamic_cast<const STBitString*>(&t);
return v && (value_ == v->value_);
}

View File

@@ -63,7 +63,7 @@ public:
add(Serializer& s) const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;

View File

@@ -65,7 +65,7 @@ public:
add(Serializer& s) const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;

View File

@@ -54,7 +54,7 @@ public:
isDefault() const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
STInteger&
operator=(value_type const& v);
@@ -127,9 +127,9 @@ STInteger<Integer>::isDefault() const
template <typename Integer>
inline bool
STInteger<Integer>::isEquivalent(STBase const& t) const
STInteger<Integer>::isEquivalent(const STBase& t) const
{
STInteger const* v = dynamic_cast<STInteger const*>(&t);
const STInteger* v = dynamic_cast<const STInteger*>(&t);
return v && (value_ == v->value_);
}

View File

@@ -71,7 +71,7 @@ public:
add(Serializer& s) const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;

View File

@@ -35,7 +35,7 @@ class STLedgerEntry final : public STObject, public CountedObject<STLedgerEntry>
public:
using pointer = std::shared_ptr<STLedgerEntry>;
using ref = std::shared_ptr<STLedgerEntry> const&;
using ref = const std::shared_ptr<STLedgerEntry>&;
/** Create an empty object with the given key and type. */
explicit STLedgerEntry(Keylet const& k);

View File

@@ -99,8 +99,8 @@ public:
STObject&
operator=(STObject&& other);
STObject(SOTemplate const& type, SField const& name);
STObject(SOTemplate const& type, SerialIter& sit, SField const& name);
STObject(const SOTemplate& type, SField const& name);
STObject(const SOTemplate& type, SerialIter& sit, SField const& name);
STObject(SerialIter& sit, SField const& name, int depth = 0);
STObject(SerialIter&& sit, SField const& name);
explicit STObject(SField const& name);
@@ -121,7 +121,7 @@ public:
reserve(std::size_t n);
void
applyTemplate(SOTemplate const& type);
applyTemplate(const SOTemplate& type);
void
applyTemplateFromSField(SField const&);
@@ -130,7 +130,7 @@ public:
isFree() const;
void
set(SOTemplate const&);
set(const SOTemplate&);
bool
set(SerialIter& u, int depth = 0);
@@ -139,7 +139,7 @@ public:
getSType() const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;
@@ -183,13 +183,13 @@ public:
uint256
getSigningHash(HashPrefix prefix) const;
STBase const&
const STBase&
peekAtIndex(int offset) const;
STBase&
getIndex(int offset);
STBase const*
const STBase*
peekAtPIndex(int offset) const;
STBase*
@@ -201,13 +201,13 @@ public:
SField const&
getFieldSType(int index) const;
STBase const&
const STBase&
peekAtField(SField const& field) const;
STBase&
getField(SField const& field);
STBase const*
const STBase*
peekAtPField(SField const& field) const;
STBase*
@@ -241,11 +241,11 @@ public:
getFieldAmount(SField const& field) const;
STPathSet const&
getFieldPathSet(SField const& field) const;
STVector256 const&
const STVector256&
getFieldV256(SField const& field) const;
STArray const&
const STArray&
getFieldArray(SField const& field) const;
STCurrency const&
const STCurrency&
getFieldCurrency(SField const& field) const;
STNumber const&
getFieldNumber(SField const& field) const;
@@ -409,12 +409,12 @@ public:
delField(int index);
bool
hasMatchingEntry(STBase const&);
hasMatchingEntry(const STBase&);
bool
operator==(STObject const& o) const;
operator==(const STObject& o) const;
bool
operator!=(STObject const& o) const;
operator!=(const STObject& o) const;
class FieldErr;
@@ -970,7 +970,7 @@ STObject::getCount() const
return v_.size();
}
inline STBase const&
inline const STBase&
STObject::peekAtIndex(int offset) const
{
return v_[offset].get();
@@ -982,7 +982,7 @@ STObject::getIndex(int offset)
return v_[offset].get();
}
inline STBase const*
inline const STBase*
STObject::peekAtPIndex(int offset) const
{
return &v_[offset].get();
@@ -1117,7 +1117,7 @@ STObject::setFieldH160(SField const& field, base_uint<160, Tag> const& v)
}
inline bool
STObject::operator!=(STObject const& o) const
STObject::operator!=(const STObject& o) const
{
return !(*this == o);
}
@@ -1126,7 +1126,7 @@ template <typename T, typename V>
V
STObject::getFieldByValue(SField const& field) const
{
STBase const* rf = peekAtPField(field);
const STBase* rf = peekAtPField(field);
if (!rf)
throwFieldNotFound(field);
@@ -1136,7 +1136,7 @@ STObject::getFieldByValue(SField const& field) const
if (id == STI_NOTPRESENT)
return V(); // optional field not present
T const* cf = dynamic_cast<T const*>(rf);
const T* cf = dynamic_cast<const T*>(rf);
if (!cf)
Throw<std::runtime_error>("Wrong field type");
@@ -1153,7 +1153,7 @@ template <typename T, typename V>
V const&
STObject::getFieldByConstRef(SField const& field, V const& empty) const
{
STBase const* rf = peekAtPField(field);
const STBase* rf = peekAtPField(field);
if (!rf)
throwFieldNotFound(field);
@@ -1163,7 +1163,7 @@ STObject::getFieldByConstRef(SField const& field, V const& empty) const
if (id == STI_NOTPRESENT)
return empty; // optional field not present
T const* cf = dynamic_cast<T const*>(rf);
const T* cf = dynamic_cast<const T*>(rf);
if (!cf)
Throw<std::runtime_error>("Wrong field type");

View File

@@ -106,10 +106,10 @@ public:
getIssuerID() const;
bool
operator==(STPathElement const& t) const;
operator==(const STPathElement& t) const;
bool
operator!=(STPathElement const& t) const;
operator!=(const STPathElement& t) const;
private:
static std::size_t
@@ -164,7 +164,7 @@ public:
STPathElement&
operator[](int i);
STPathElement const&
const STPathElement&
operator[](int i) const;
void
@@ -196,7 +196,7 @@ public:
assembleAdd(STPath const& base, STPathElement const& tail);
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;
@@ -375,7 +375,7 @@ STPathElement::getIssuerID() const
}
inline bool
STPathElement::operator==(STPathElement const& t) const
STPathElement::operator==(const STPathElement& t) const
{
return (mType & typeAccount) == (t.mType & typeAccount) &&
hash_value_ == t.hash_value_ && mAccountID == t.mAccountID &&
@@ -383,7 +383,7 @@ STPathElement::operator==(STPathElement const& t) const
}
inline bool
STPathElement::operator!=(STPathElement const& t) const
STPathElement::operator!=(const STPathElement& t) const
{
return !operator==(t);
}
@@ -455,7 +455,7 @@ STPath::operator[](int i)
return mPath[i];
}
inline STPathElement const&
inline const STPathElement&
STPath::operator[](int i) const
{
return mPath[i];

View File

@@ -50,7 +50,7 @@ public:
Json::Value getJson(JsonOptions) const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;
@@ -62,7 +62,7 @@ public:
operator=(std::vector<uint256>&& v);
void
setValue(STVector256 const& v);
setValue(const STVector256& v);
/** Retrieve a copy of the vector we contain */
explicit
@@ -153,7 +153,7 @@ STVector256::operator=(std::vector<uint256>&& v)
}
inline void
STVector256::setValue(STVector256 const& v)
STVector256::setValue(const STVector256& v)
{
mValue = v.mValue;
}

View File

@@ -107,7 +107,7 @@ public:
add(Serializer& s) const override;
bool
isEquivalent(STBase const& t) const override;
isEquivalent(const STBase& t) const override;
bool
isDefault() const override;

View File

@@ -139,9 +139,9 @@ public:
int
addRaw(Slice slice);
int
addRaw(void const* ptr, int len);
addRaw(const void* ptr, int len);
int
addRaw(Serializer const& s);
addRaw(const Serializer& s);
int
addVL(Blob const& vector);
@@ -151,7 +151,7 @@ public:
int
addVL(Iter begin, Iter end, int len);
int
addVL(void const* ptr, int len);
addVL(const void* ptr, int len);
// disassemble functions
bool
@@ -161,7 +161,7 @@ public:
bool
getInteger(Integer& number, int offset)
{
static auto const bytes = sizeof(Integer);
static const auto bytes = sizeof(Integer);
if ((offset + bytes) > mData.size())
return false;
number = 0;
@@ -220,7 +220,7 @@ public:
{
return mData.size();
}
void const*
const void*
getDataPtr() const
{
return mData.data();
@@ -238,7 +238,7 @@ public:
std::string
getString() const
{
return std::string(static_cast<char const*>(getDataPtr()), size());
return std::string(static_cast<const char*>(getDataPtr()), size());
}
void
erase()
@@ -296,12 +296,12 @@ public:
return v != mData;
}
bool
operator==(Serializer const& v) const
operator==(const Serializer& v) const
{
return v.mData == mData;
}
bool
operator!=(Serializer const& v) const
operator!=(const Serializer& v) const
{
return v.mData != mData;
}

View File

@@ -225,6 +225,8 @@ enum TERcodes : TERUnderlyingType {
terQUEUED, // Transaction is being held in TxQ until fee drops
terPRE_TICKET, // Ticket is not yet in ledger but might be on its way
terNO_AMM, // AMM doesn't exist for the asset pair
terADDRESS_COLLISION, // Failed to allocate AccountID when trying to
// create a pseudo-account
};
//------------------------------------------------------------------------------

View File

@@ -120,13 +120,6 @@ constexpr std::uint32_t tfTrustSetMask =
~(tfUniversal | tfSetfAuth | tfSetNoRipple | tfClearNoRipple | tfSetFreeze |
tfClearFreeze | tfSetDeepFreeze | tfClearDeepFreeze);
// valid flags for granular permission
constexpr std::uint32_t tfTrustSetGranularMask = tfSetfAuth | tfSetFreeze | tfClearFreeze;
// bits representing supportedGranularMask are set to 0 and the bits
// representing other flags are set to 1 in tfPermissionMask.
constexpr std::uint32_t tfTrustSetPermissionMask = (~tfTrustSetMask) & (~tfTrustSetGranularMask);
// EnableAmendment flags:
constexpr std::uint32_t tfGotMajority = 0x00010000;
constexpr std::uint32_t tfLostMajority = 0x00020000;
@@ -162,8 +155,6 @@ constexpr std::uint32_t const tfMPTokenAuthorizeMask = ~(tfUniversal | tfMPTUna
constexpr std::uint32_t const tfMPTLock = 0x00000001;
constexpr std::uint32_t const tfMPTUnlock = 0x00000002;
constexpr std::uint32_t const tfMPTokenIssuanceSetMask = ~(tfUniversal | tfMPTLock | tfMPTUnlock);
constexpr std::uint32_t const tfMPTokenIssuanceSetGranularMask = tfMPTLock | tfMPTUnlock;
constexpr std::uint32_t const tfMPTokenIssuanceSetPermissionMask = (~tfMPTokenIssuanceSetMask) & (~tfMPTokenIssuanceSetGranularMask);
// MPTokenIssuanceDestroy flags:
constexpr std::uint32_t const tfMPTokenIssuanceDestroyMask = ~tfUniversal;

View File

@@ -59,7 +59,7 @@ enum TxType : std::uint16_t
#pragma push_macro("TRANSACTION")
#undef TRANSACTION
#define TRANSACTION(tag, value, name, delegatable, fields) tag = value,
#define TRANSACTION(tag, value, name, fields) tag = value,
#include <xrpl/protocol/detail/transactions.macro>

View File

@@ -267,7 +267,7 @@ XRPAmount::decimalXRP() const
// Output XRPAmount as just the drops value.
template <class Char, class Traits>
std::basic_ostream<Char, Traits>&
operator<<(std::basic_ostream<Char, Traits>& os, XRPAmount const& q)
operator<<(std::basic_ostream<Char, Traits>& os, const XRPAmount& q)
{
return os << q.drops();
}

View File

@@ -32,9 +32,8 @@
// If you add an amendment here, then do not forget to increment `numFeatures`
// in include/xrpl/protocol/Feature.h.
XRPL_FEATURE(PermissionDelegation, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (PayChanCancelAfter, Supported::yes, VoteBehavior::DefaultNo)
// Check flags in Credential transactions
XRPL_FIX (PseudoAccount, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (InvalidTxFlags, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FIX (FrozenLPTokenTransfer, Supported::yes, VoteBehavior::DefaultNo)
XRPL_FEATURE(DeepFreeze, Supported::yes, VoteBehavior::DefaultNo)

View File

@@ -460,18 +460,6 @@ LEDGER_ENTRY(ltPERMISSIONED_DOMAIN, 0x0082, PermissionedDomain, permissioned_dom
{sfPreviousTxnLgrSeq, soeREQUIRED},
}))
/** A ledger object representing permissions an account has delegated to another account.
\sa keylet::delegate
*/
LEDGER_ENTRY(ltDELEGATE, 0x0083, Delegate, delegate, ({
{sfAccount, soeREQUIRED},
{sfAuthorize, soeREQUIRED},
{sfPermissions, soeREQUIRED},
{sfOwnerNode, soeREQUIRED},
{sfPreviousTxnID, soeREQUIRED},
{sfPreviousTxnLgrSeq, soeREQUIRED},
}))
#undef EXPAND
#undef LEDGER_ENTRY_DUPLICATE

View File

@@ -1,68 +0,0 @@
//------------------------------------------------------------------------------
/*
This file is part of rippled: https://github.com/ripple/rippled
Copyright (c) 2025 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.
*/
//==============================================================================
#if !defined(PERMISSION)
#error "undefined macro: PERMISSION"
#endif
/**
* PERMISSION(name, type, txType, value)
*
* This macro defines a permission:
* name: the name of the permission.
* type: the GranularPermissionType enum.
* txType: the corresponding TxType for this permission.
* value: the uint32 numeric value for the enum type.
*/
/** This permission grants the delegated account the ability to authorize a trustline. */
PERMISSION(TrustlineAuthorize, ttTRUST_SET, 65537)
/** This permission grants the delegated account the ability to freeze a trustline. */
PERMISSION(TrustlineFreeze, ttTRUST_SET, 65538)
/** This permission grants the delegated account the ability to unfreeze a trustline. */
PERMISSION(TrustlineUnfreeze, ttTRUST_SET, 65539)
/** This permission grants the delegated account the ability to set Domain. */
PERMISSION(AccountDomainSet, ttACCOUNT_SET, 65540)
/** This permission grants the delegated account the ability to set EmailHashSet. */
PERMISSION(AccountEmailHashSet, ttACCOUNT_SET, 65541)
/** This permission grants the delegated account the ability to set MessageKey. */
PERMISSION(AccountMessageKeySet, ttACCOUNT_SET, 65542)
/** This permission grants the delegated account the ability to set TransferRate. */
PERMISSION(AccountTransferRateSet, ttACCOUNT_SET, 65543)
/** This permission grants the delegated account the ability to set TickSize. */
PERMISSION(AccountTickSizeSet, ttACCOUNT_SET, 65544)
/** This permission grants the delegated account the ability to mint payment, which means sending a payment for a currency where the sending account is the issuer. */
PERMISSION(PaymentMint, ttPAYMENT, 65545)
/** This permission grants the delegated account the ability to burn payment, which means sending a payment for a currency where the destination account is the issuer */
PERMISSION(PaymentBurn, ttPAYMENT, 65546)
/** This permission grants the delegated account the ability to lock MPToken. */
PERMISSION(MPTokenIssuanceLock, ttMPTOKEN_ISSUANCE_SET, 65547)
/** This permission grants the delegated account the ability to unlock MPToken. */
PERMISSION(MPTokenIssuanceUnlock, ttMPTOKEN_ISSUANCE_SET, 65548)

View File

@@ -112,7 +112,6 @@ TYPED_SFIELD(sfEmitGeneration, UINT32, 46)
TYPED_SFIELD(sfVoteWeight, UINT32, 48)
TYPED_SFIELD(sfFirstNFTokenSequence, UINT32, 50)
TYPED_SFIELD(sfOracleDocumentID, UINT32, 51)
TYPED_SFIELD(sfPermissionValue, UINT32, 52)
// 64-bit integers (common)
TYPED_SFIELD(sfIndexNext, UINT64, 1)
@@ -279,7 +278,6 @@ TYPED_SFIELD(sfRegularKey, ACCOUNT, 8)
TYPED_SFIELD(sfNFTokenMinter, ACCOUNT, 9)
TYPED_SFIELD(sfEmitCallback, ACCOUNT, 10)
TYPED_SFIELD(sfHolder, ACCOUNT, 11)
TYPED_SFIELD(sfDelegate, ACCOUNT, 12)
// account (uncommon)
TYPED_SFIELD(sfHookAccount, ACCOUNT, 16)
@@ -329,7 +327,6 @@ UNTYPED_SFIELD(sfSignerEntry, OBJECT, 11)
UNTYPED_SFIELD(sfNFToken, OBJECT, 12)
UNTYPED_SFIELD(sfEmitDetails, OBJECT, 13)
UNTYPED_SFIELD(sfHook, OBJECT, 14)
UNTYPED_SFIELD(sfPermission, OBJECT, 15)
// inner object (uncommon)
UNTYPED_SFIELD(sfSigner, OBJECT, 16)
@@ -380,4 +377,3 @@ UNTYPED_SFIELD(sfAuthAccounts, ARRAY, 25)
UNTYPED_SFIELD(sfAuthorizeCredentials, ARRAY, 26)
UNTYPED_SFIELD(sfUnauthorizeCredentials, ARRAY, 27)
UNTYPED_SFIELD(sfAcceptedCredentials, ARRAY, 28)
UNTYPED_SFIELD(sfPermissions, ARRAY, 29)

View File

@@ -50,7 +50,7 @@ class TokenCodecErrcCategory : public std::error_category
{
public:
// Return a short descriptive name for the category
virtual char const*
virtual const char*
name() const noexcept override final
{
return "TokenCodecError";
@@ -86,7 +86,7 @@ public:
};
} // namespace detail
inline ripple::detail::TokenCodecErrcCategory const&
inline const ripple::detail::TokenCodecErrcCategory&
TokenCodecErrcCategory()
{
static ripple::detail::TokenCodecErrcCategory c;

View File

@@ -22,14 +22,14 @@
#endif
/**
* TRANSACTION(tag, value, name, delegatable, fields)
* TRANSACTION(tag, value, name, fields)
*
* You must define a transactor class in the `ripple` namespace named `name`,
* and include its header in `src/xrpld/app/tx/detail/applySteps.cpp`.
*/
/** This transaction type executes a payment. */
TRANSACTION(ttPAYMENT, 0, Payment, Delegation::delegatable, ({
TRANSACTION(ttPAYMENT, 0, Payment, ({
{sfDestination, soeREQUIRED},
{sfAmount, soeREQUIRED, soeMPTSupported},
{sfSendMax, soeOPTIONAL, soeMPTSupported},
@@ -41,7 +41,7 @@ TRANSACTION(ttPAYMENT, 0, Payment, Delegation::delegatable, ({
}))
/** This transaction type creates an escrow object. */
TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, Delegation::delegatable, ({
TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, ({
{sfDestination, soeREQUIRED},
{sfAmount, soeREQUIRED},
{sfCondition, soeOPTIONAL},
@@ -51,7 +51,7 @@ TRANSACTION(ttESCROW_CREATE, 1, EscrowCreate, Delegation::delegatable, ({
}))
/** This transaction type completes an existing escrow. */
TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, Delegation::delegatable, ({
TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, ({
{sfOwner, soeREQUIRED},
{sfOfferSequence, soeREQUIRED},
{sfFulfillment, soeOPTIONAL},
@@ -61,7 +61,7 @@ TRANSACTION(ttESCROW_FINISH, 2, EscrowFinish, Delegation::delegatable, ({
/** This transaction type adjusts various account settings. */
TRANSACTION(ttACCOUNT_SET, 3, AccountSet, Delegation::notDelegatable, ({
TRANSACTION(ttACCOUNT_SET, 3, AccountSet, ({
{sfEmailHash, soeOPTIONAL},
{sfWalletLocator, soeOPTIONAL},
{sfWalletSize, soeOPTIONAL},
@@ -75,20 +75,20 @@ TRANSACTION(ttACCOUNT_SET, 3, AccountSet, Delegation::notDelegatable, ({
}))
/** This transaction type cancels an existing escrow. */
TRANSACTION(ttESCROW_CANCEL, 4, EscrowCancel, Delegation::delegatable, ({
TRANSACTION(ttESCROW_CANCEL, 4, EscrowCancel, ({
{sfOwner, soeREQUIRED},
{sfOfferSequence, soeREQUIRED},
}))
/** This transaction type sets or clears an account's "regular key". */
TRANSACTION(ttREGULAR_KEY_SET, 5, SetRegularKey, Delegation::notDelegatable, ({
TRANSACTION(ttREGULAR_KEY_SET, 5, SetRegularKey, ({
{sfRegularKey, soeOPTIONAL},
}))
// 6 deprecated
/** This transaction type creates an offer to trade one asset for another. */
TRANSACTION(ttOFFER_CREATE, 7, OfferCreate, Delegation::delegatable, ({
TRANSACTION(ttOFFER_CREATE, 7, OfferCreate, ({
{sfTakerPays, soeREQUIRED},
{sfTakerGets, soeREQUIRED},
{sfExpiration, soeOPTIONAL},
@@ -96,14 +96,14 @@ TRANSACTION(ttOFFER_CREATE, 7, OfferCreate, Delegation::delegatable, ({
}))
/** This transaction type cancels existing offers to trade one asset for another. */
TRANSACTION(ttOFFER_CANCEL, 8, OfferCancel, Delegation::delegatable, ({
TRANSACTION(ttOFFER_CANCEL, 8, OfferCancel, ({
{sfOfferSequence, soeREQUIRED},
}))
// 9 deprecated
/** This transaction type creates a new set of tickets. */
TRANSACTION(ttTICKET_CREATE, 10, TicketCreate, Delegation::delegatable, ({
TRANSACTION(ttTICKET_CREATE, 10, TicketCreate, ({
{sfTicketCount, soeREQUIRED},
}))
@@ -112,13 +112,13 @@ TRANSACTION(ttTICKET_CREATE, 10, TicketCreate, Delegation::delegatable, ({
/** This transaction type modifies the signer list associated with an account. */
// The SignerEntries are optional because a SignerList is deleted by
// setting the SignerQuorum to zero and omitting SignerEntries.
TRANSACTION(ttSIGNER_LIST_SET, 12, SignerListSet, Delegation::notDelegatable, ({
TRANSACTION(ttSIGNER_LIST_SET, 12, SignerListSet, ({
{sfSignerQuorum, soeREQUIRED},
{sfSignerEntries, soeOPTIONAL},
}))
/** This transaction type creates a new unidirectional XRP payment channel. */
TRANSACTION(ttPAYCHAN_CREATE, 13, PaymentChannelCreate, Delegation::delegatable, ({
TRANSACTION(ttPAYCHAN_CREATE, 13, PaymentChannelCreate, ({
{sfDestination, soeREQUIRED},
{sfAmount, soeREQUIRED},
{sfSettleDelay, soeREQUIRED},
@@ -128,14 +128,14 @@ TRANSACTION(ttPAYCHAN_CREATE, 13, PaymentChannelCreate, Delegation::delegatable,
}))
/** This transaction type funds an existing unidirectional XRP payment channel. */
TRANSACTION(ttPAYCHAN_FUND, 14, PaymentChannelFund, Delegation::delegatable, ({
TRANSACTION(ttPAYCHAN_FUND, 14, PaymentChannelFund, ({
{sfChannel, soeREQUIRED},
{sfAmount, soeREQUIRED},
{sfExpiration, soeOPTIONAL},
}))
/** This transaction type submits a claim against an existing unidirectional payment channel. */
TRANSACTION(ttPAYCHAN_CLAIM, 15, PaymentChannelClaim, Delegation::delegatable, ({
TRANSACTION(ttPAYCHAN_CLAIM, 15, PaymentChannelClaim, ({
{sfChannel, soeREQUIRED},
{sfAmount, soeOPTIONAL},
{sfBalance, soeOPTIONAL},
@@ -145,7 +145,7 @@ TRANSACTION(ttPAYCHAN_CLAIM, 15, PaymentChannelClaim, Delegation::delegatable, (
}))
/** This transaction type creates a new check. */
TRANSACTION(ttCHECK_CREATE, 16, CheckCreate, Delegation::delegatable, ({
TRANSACTION(ttCHECK_CREATE, 16, CheckCreate, ({
{sfDestination, soeREQUIRED},
{sfSendMax, soeREQUIRED},
{sfExpiration, soeOPTIONAL},
@@ -154,19 +154,19 @@ TRANSACTION(ttCHECK_CREATE, 16, CheckCreate, Delegation::delegatable, ({
}))
/** This transaction type cashes an existing check. */
TRANSACTION(ttCHECK_CASH, 17, CheckCash, Delegation::delegatable, ({
TRANSACTION(ttCHECK_CASH, 17, CheckCash, ({
{sfCheckID, soeREQUIRED},
{sfAmount, soeOPTIONAL},
{sfDeliverMin, soeOPTIONAL},
}))
/** This transaction type cancels an existing check. */
TRANSACTION(ttCHECK_CANCEL, 18, CheckCancel, Delegation::delegatable, ({
TRANSACTION(ttCHECK_CANCEL, 18, CheckCancel, ({
{sfCheckID, soeREQUIRED},
}))
/** This transaction type grants or revokes authorization to transfer funds. */
TRANSACTION(ttDEPOSIT_PREAUTH, 19, DepositPreauth, Delegation::delegatable, ({
TRANSACTION(ttDEPOSIT_PREAUTH, 19, DepositPreauth, ({
{sfAuthorize, soeOPTIONAL},
{sfUnauthorize, soeOPTIONAL},
{sfAuthorizeCredentials, soeOPTIONAL},
@@ -174,14 +174,14 @@ TRANSACTION(ttDEPOSIT_PREAUTH, 19, DepositPreauth, Delegation::delegatable, ({
}))
/** This transaction type modifies a trustline between two accounts. */
TRANSACTION(ttTRUST_SET, 20, TrustSet, Delegation::delegatable, ({
TRANSACTION(ttTRUST_SET, 20, TrustSet, ({
{sfLimitAmount, soeOPTIONAL},
{sfQualityIn, soeOPTIONAL},
{sfQualityOut, soeOPTIONAL},
}))
/** This transaction type deletes an existing account. */
TRANSACTION(ttACCOUNT_DELETE, 21, AccountDelete, Delegation::notDelegatable, ({
TRANSACTION(ttACCOUNT_DELETE, 21, AccountDelete, ({
{sfDestination, soeREQUIRED},
{sfDestinationTag, soeOPTIONAL},
{sfCredentialIDs, soeOPTIONAL},
@@ -190,7 +190,7 @@ TRANSACTION(ttACCOUNT_DELETE, 21, AccountDelete, Delegation::notDelegatable, ({
// 22 reserved
/** This transaction mints a new NFT. */
TRANSACTION(ttNFTOKEN_MINT, 25, NFTokenMint, Delegation::delegatable, ({
TRANSACTION(ttNFTOKEN_MINT, 25, NFTokenMint, ({
{sfNFTokenTaxon, soeREQUIRED},
{sfTransferFee, soeOPTIONAL},
{sfIssuer, soeOPTIONAL},
@@ -201,13 +201,13 @@ TRANSACTION(ttNFTOKEN_MINT, 25, NFTokenMint, Delegation::delegatable, ({
}))
/** This transaction burns (i.e. destroys) an existing NFT. */
TRANSACTION(ttNFTOKEN_BURN, 26, NFTokenBurn, Delegation::delegatable, ({
TRANSACTION(ttNFTOKEN_BURN, 26, NFTokenBurn, ({
{sfNFTokenID, soeREQUIRED},
{sfOwner, soeOPTIONAL},
}))
/** This transaction creates a new offer to buy or sell an NFT. */
TRANSACTION(ttNFTOKEN_CREATE_OFFER, 27, NFTokenCreateOffer, Delegation::delegatable, ({
TRANSACTION(ttNFTOKEN_CREATE_OFFER, 27, NFTokenCreateOffer, ({
{sfNFTokenID, soeREQUIRED},
{sfAmount, soeREQUIRED},
{sfDestination, soeOPTIONAL},
@@ -216,25 +216,25 @@ TRANSACTION(ttNFTOKEN_CREATE_OFFER, 27, NFTokenCreateOffer, Delegation::delegata
}))
/** This transaction cancels an existing offer to buy or sell an existing NFT. */
TRANSACTION(ttNFTOKEN_CANCEL_OFFER, 28, NFTokenCancelOffer, Delegation::delegatable, ({
TRANSACTION(ttNFTOKEN_CANCEL_OFFER, 28, NFTokenCancelOffer, ({
{sfNFTokenOffers, soeREQUIRED},
}))
/** This transaction accepts an existing offer to buy or sell an existing NFT. */
TRANSACTION(ttNFTOKEN_ACCEPT_OFFER, 29, NFTokenAcceptOffer, Delegation::delegatable, ({
TRANSACTION(ttNFTOKEN_ACCEPT_OFFER, 29, NFTokenAcceptOffer, ({
{sfNFTokenBuyOffer, soeOPTIONAL},
{sfNFTokenSellOffer, soeOPTIONAL},
{sfNFTokenBrokerFee, soeOPTIONAL},
}))
/** This transaction claws back issued tokens. */
TRANSACTION(ttCLAWBACK, 30, Clawback, Delegation::delegatable, ({
TRANSACTION(ttCLAWBACK, 30, Clawback, ({
{sfAmount, soeREQUIRED, soeMPTSupported},
{sfHolder, soeOPTIONAL},
}))
/** This transaction claws back tokens from an AMM pool. */
TRANSACTION(ttAMM_CLAWBACK, 31, AMMClawback, Delegation::delegatable, ({
TRANSACTION(ttAMM_CLAWBACK, 31, AMMClawback, ({
{sfHolder, soeREQUIRED},
{sfAsset, soeREQUIRED},
{sfAsset2, soeREQUIRED},
@@ -242,14 +242,14 @@ TRANSACTION(ttAMM_CLAWBACK, 31, AMMClawback, Delegation::delegatable, ({
}))
/** This transaction type creates an AMM instance */
TRANSACTION(ttAMM_CREATE, 35, AMMCreate, Delegation::delegatable, ({
TRANSACTION(ttAMM_CREATE, 35, AMMCreate, ({
{sfAmount, soeREQUIRED},
{sfAmount2, soeREQUIRED},
{sfTradingFee, soeREQUIRED},
}))
/** This transaction type deposits into an AMM instance */
TRANSACTION(ttAMM_DEPOSIT, 36, AMMDeposit, Delegation::delegatable, ({
TRANSACTION(ttAMM_DEPOSIT, 36, AMMDeposit, ({
{sfAsset, soeREQUIRED},
{sfAsset2, soeREQUIRED},
{sfAmount, soeOPTIONAL},
@@ -260,7 +260,7 @@ TRANSACTION(ttAMM_DEPOSIT, 36, AMMDeposit, Delegation::delegatable, ({
}))
/** This transaction type withdraws from an AMM instance */
TRANSACTION(ttAMM_WITHDRAW, 37, AMMWithdraw, Delegation::delegatable, ({
TRANSACTION(ttAMM_WITHDRAW, 37, AMMWithdraw, ({
{sfAsset, soeREQUIRED},
{sfAsset2, soeREQUIRED},
{sfAmount, soeOPTIONAL},
@@ -270,14 +270,14 @@ TRANSACTION(ttAMM_WITHDRAW, 37, AMMWithdraw, Delegation::delegatable, ({
}))
/** This transaction type votes for the trading fee */
TRANSACTION(ttAMM_VOTE, 38, AMMVote, Delegation::delegatable, ({
TRANSACTION(ttAMM_VOTE, 38, AMMVote, ({
{sfAsset, soeREQUIRED},
{sfAsset2, soeREQUIRED},
{sfTradingFee, soeREQUIRED},
}))
/** This transaction type bids for the auction slot */
TRANSACTION(ttAMM_BID, 39, AMMBid, Delegation::delegatable, ({
TRANSACTION(ttAMM_BID, 39, AMMBid, ({
{sfAsset, soeREQUIRED},
{sfAsset2, soeREQUIRED},
{sfBidMin, soeOPTIONAL},
@@ -286,20 +286,20 @@ TRANSACTION(ttAMM_BID, 39, AMMBid, Delegation::delegatable, ({
}))
/** This transaction type deletes AMM in the empty state */
TRANSACTION(ttAMM_DELETE, 40, AMMDelete, Delegation::delegatable, ({
TRANSACTION(ttAMM_DELETE, 40, AMMDelete, ({
{sfAsset, soeREQUIRED},
{sfAsset2, soeREQUIRED},
}))
/** This transactions creates a crosschain sequence number */
TRANSACTION(ttXCHAIN_CREATE_CLAIM_ID, 41, XChainCreateClaimID, Delegation::delegatable, ({
TRANSACTION(ttXCHAIN_CREATE_CLAIM_ID, 41, XChainCreateClaimID, ({
{sfXChainBridge, soeREQUIRED},
{sfSignatureReward, soeREQUIRED},
{sfOtherChainSource, soeREQUIRED},
}))
/** This transactions initiates a crosschain transaction */
TRANSACTION(ttXCHAIN_COMMIT, 42, XChainCommit, Delegation::delegatable, ({
TRANSACTION(ttXCHAIN_COMMIT, 42, XChainCommit, ({
{sfXChainBridge, soeREQUIRED},
{sfXChainClaimID, soeREQUIRED},
{sfAmount, soeREQUIRED},
@@ -307,7 +307,7 @@ TRANSACTION(ttXCHAIN_COMMIT, 42, XChainCommit, Delegation::delegatable, ({
}))
/** This transaction completes a crosschain transaction */
TRANSACTION(ttXCHAIN_CLAIM, 43, XChainClaim, Delegation::delegatable, ({
TRANSACTION(ttXCHAIN_CLAIM, 43, XChainClaim, ({
{sfXChainBridge, soeREQUIRED},
{sfXChainClaimID, soeREQUIRED},
{sfDestination, soeREQUIRED},
@@ -316,7 +316,7 @@ TRANSACTION(ttXCHAIN_CLAIM, 43, XChainClaim, Delegation::delegatable, ({
}))
/** This transaction initiates a crosschain account create transaction */
TRANSACTION(ttXCHAIN_ACCOUNT_CREATE_COMMIT, 44, XChainAccountCreateCommit, Delegation::delegatable, ({
TRANSACTION(ttXCHAIN_ACCOUNT_CREATE_COMMIT, 44, XChainAccountCreateCommit, ({
{sfXChainBridge, soeREQUIRED},
{sfDestination, soeREQUIRED},
{sfAmount, soeREQUIRED},
@@ -324,7 +324,7 @@ TRANSACTION(ttXCHAIN_ACCOUNT_CREATE_COMMIT, 44, XChainAccountCreateCommit, Deleg
}))
/** This transaction adds an attestation to a claim */
TRANSACTION(ttXCHAIN_ADD_CLAIM_ATTESTATION, 45, XChainAddClaimAttestation, Delegation::delegatable, ({
TRANSACTION(ttXCHAIN_ADD_CLAIM_ATTESTATION, 45, XChainAddClaimAttestation, ({
{sfXChainBridge, soeREQUIRED},
{sfAttestationSignerAccount, soeREQUIRED},
@@ -340,7 +340,7 @@ TRANSACTION(ttXCHAIN_ADD_CLAIM_ATTESTATION, 45, XChainAddClaimAttestation, Deleg
}))
/** This transaction adds an attestation to an account */
TRANSACTION(ttXCHAIN_ADD_ACCOUNT_CREATE_ATTESTATION, 46, XChainAddAccountCreateAttestation, Delegation::delegatable, ({
TRANSACTION(ttXCHAIN_ADD_ACCOUNT_CREATE_ATTESTATION, 46, XChainAddAccountCreateAttestation, ({
{sfXChainBridge, soeREQUIRED},
{sfAttestationSignerAccount, soeREQUIRED},
@@ -357,31 +357,31 @@ TRANSACTION(ttXCHAIN_ADD_ACCOUNT_CREATE_ATTESTATION, 46, XChainAddAccountCreateA
}))
/** This transaction modifies a sidechain */
TRANSACTION(ttXCHAIN_MODIFY_BRIDGE, 47, XChainModifyBridge, Delegation::delegatable, ({
TRANSACTION(ttXCHAIN_MODIFY_BRIDGE, 47, XChainModifyBridge, ({
{sfXChainBridge, soeREQUIRED},
{sfSignatureReward, soeOPTIONAL},
{sfMinAccountCreateAmount, soeOPTIONAL},
}))
/** This transactions creates a sidechain */
TRANSACTION(ttXCHAIN_CREATE_BRIDGE, 48, XChainCreateBridge, Delegation::delegatable, ({
TRANSACTION(ttXCHAIN_CREATE_BRIDGE, 48, XChainCreateBridge, ({
{sfXChainBridge, soeREQUIRED},
{sfSignatureReward, soeREQUIRED},
{sfMinAccountCreateAmount, soeOPTIONAL},
}))
/** This transaction type creates or updates a DID */
TRANSACTION(ttDID_SET, 49, DIDSet, Delegation::delegatable, ({
TRANSACTION(ttDID_SET, 49, DIDSet, ({
{sfDIDDocument, soeOPTIONAL},
{sfURI, soeOPTIONAL},
{sfData, soeOPTIONAL},
}))
/** This transaction type deletes a DID */
TRANSACTION(ttDID_DELETE, 50, DIDDelete, Delegation::delegatable, ({}))
TRANSACTION(ttDID_DELETE, 50, DIDDelete, ({}))
/** This transaction type creates an Oracle instance */
TRANSACTION(ttORACLE_SET, 51, OracleSet, Delegation::delegatable, ({
TRANSACTION(ttORACLE_SET, 51, OracleSet, ({
{sfOracleDocumentID, soeREQUIRED},
{sfProvider, soeOPTIONAL},
{sfURI, soeOPTIONAL},
@@ -391,18 +391,18 @@ TRANSACTION(ttORACLE_SET, 51, OracleSet, Delegation::delegatable, ({
}))
/** This transaction type deletes an Oracle instance */
TRANSACTION(ttORACLE_DELETE, 52, OracleDelete, Delegation::delegatable, ({
TRANSACTION(ttORACLE_DELETE, 52, OracleDelete, ({
{sfOracleDocumentID, soeREQUIRED},
}))
/** This transaction type fixes a problem in the ledger state */
TRANSACTION(ttLEDGER_STATE_FIX, 53, LedgerStateFix, Delegation::delegatable, ({
TRANSACTION(ttLEDGER_STATE_FIX, 53, LedgerStateFix, ({
{sfLedgerFixType, soeREQUIRED},
{sfOwner, soeOPTIONAL},
}))
/** This transaction type creates a MPTokensIssuance instance */
TRANSACTION(ttMPTOKEN_ISSUANCE_CREATE, 54, MPTokenIssuanceCreate, Delegation::delegatable, ({
TRANSACTION(ttMPTOKEN_ISSUANCE_CREATE, 54, MPTokenIssuanceCreate, ({
{sfAssetScale, soeOPTIONAL},
{sfTransferFee, soeOPTIONAL},
{sfMaximumAmount, soeOPTIONAL},
@@ -410,24 +410,24 @@ TRANSACTION(ttMPTOKEN_ISSUANCE_CREATE, 54, MPTokenIssuanceCreate, Delegation::de
}))
/** This transaction type destroys a MPTokensIssuance instance */
TRANSACTION(ttMPTOKEN_ISSUANCE_DESTROY, 55, MPTokenIssuanceDestroy, Delegation::delegatable, ({
TRANSACTION(ttMPTOKEN_ISSUANCE_DESTROY, 55, MPTokenIssuanceDestroy, ({
{sfMPTokenIssuanceID, soeREQUIRED},
}))
/** This transaction type sets flags on a MPTokensIssuance or MPToken instance */
TRANSACTION(ttMPTOKEN_ISSUANCE_SET, 56, MPTokenIssuanceSet, Delegation::delegatable, ({
TRANSACTION(ttMPTOKEN_ISSUANCE_SET, 56, MPTokenIssuanceSet, ({
{sfMPTokenIssuanceID, soeREQUIRED},
{sfHolder, soeOPTIONAL},
}))
/** This transaction type authorizes a MPToken instance */
TRANSACTION(ttMPTOKEN_AUTHORIZE, 57, MPTokenAuthorize, Delegation::delegatable, ({
TRANSACTION(ttMPTOKEN_AUTHORIZE, 57, MPTokenAuthorize, ({
{sfMPTokenIssuanceID, soeREQUIRED},
{sfHolder, soeOPTIONAL},
}))
/** This transaction type create an Credential instance */
TRANSACTION(ttCREDENTIAL_CREATE, 58, CredentialCreate, Delegation::delegatable, ({
TRANSACTION(ttCREDENTIAL_CREATE, 58, CredentialCreate, ({
{sfSubject, soeREQUIRED},
{sfCredentialType, soeREQUIRED},
{sfExpiration, soeOPTIONAL},
@@ -435,47 +435,41 @@ TRANSACTION(ttCREDENTIAL_CREATE, 58, CredentialCreate, Delegation::delegatable,
}))
/** This transaction type accept an Credential object */
TRANSACTION(ttCREDENTIAL_ACCEPT, 59, CredentialAccept, Delegation::delegatable, ({
TRANSACTION(ttCREDENTIAL_ACCEPT, 59, CredentialAccept, ({
{sfIssuer, soeREQUIRED},
{sfCredentialType, soeREQUIRED},
}))
/** This transaction type delete an Credential object */
TRANSACTION(ttCREDENTIAL_DELETE, 60, CredentialDelete, Delegation::delegatable, ({
TRANSACTION(ttCREDENTIAL_DELETE, 60, CredentialDelete, ({
{sfSubject, soeOPTIONAL},
{sfIssuer, soeOPTIONAL},
{sfCredentialType, soeREQUIRED},
}))
/** This transaction type modify a NFToken */
TRANSACTION(ttNFTOKEN_MODIFY, 61, NFTokenModify, Delegation::delegatable, ({
TRANSACTION(ttNFTOKEN_MODIFY, 61, NFTokenModify, ({
{sfNFTokenID, soeREQUIRED},
{sfOwner, soeOPTIONAL},
{sfURI, soeOPTIONAL},
}))
/** This transaction type creates or modifies a Permissioned Domain */
TRANSACTION(ttPERMISSIONED_DOMAIN_SET, 62, PermissionedDomainSet, Delegation::delegatable, ({
TRANSACTION(ttPERMISSIONED_DOMAIN_SET, 62, PermissionedDomainSet, ({
{sfDomainID, soeOPTIONAL},
{sfAcceptedCredentials, soeREQUIRED},
}))
/** This transaction type deletes a Permissioned Domain */
TRANSACTION(ttPERMISSIONED_DOMAIN_DELETE, 63, PermissionedDomainDelete, Delegation::delegatable, ({
TRANSACTION(ttPERMISSIONED_DOMAIN_DELETE, 63, PermissionedDomainDelete, ({
{sfDomainID, soeREQUIRED},
}))
/** This transaction type delegates authorized account specified permissions */
TRANSACTION(ttDELEGATE_SET, 64, DelegateSet, Delegation::notDelegatable, ({
{sfAuthorize, soeREQUIRED},
{sfPermissions, soeREQUIRED},
}))
/** This system-generated transaction type is used to update the status of the various amendments.
For details, see: https://xrpl.org/amendments.html
*/
TRANSACTION(ttAMENDMENT, 100, EnableAmendment, Delegation::notDelegatable, ({
TRANSACTION(ttAMENDMENT, 100, EnableAmendment, ({
{sfLedgerSequence, soeREQUIRED},
{sfAmendment, soeREQUIRED},
}))
@@ -483,7 +477,7 @@ TRANSACTION(ttAMENDMENT, 100, EnableAmendment, Delegation::notDelegatable, ({
/** This system-generated transaction type is used to update the network's fee settings.
For details, see: https://xrpl.org/fee-voting.html
*/
TRANSACTION(ttFEE, 101, SetFee, Delegation::notDelegatable, ({
TRANSACTION(ttFEE, 101, SetFee, ({
{sfLedgerSequence, soeOPTIONAL},
// Old version uses raw numbers
{sfBaseFee, soeOPTIONAL},
@@ -500,7 +494,7 @@ TRANSACTION(ttFEE, 101, SetFee, Delegation::notDelegatable, ({
For details, see: https://xrpl.org/negative-unl.html
*/
TRANSACTION(ttUNL_MODIFY, 102, UNLModify, Delegation::notDelegatable, ({
TRANSACTION(ttUNL_MODIFY, 102, UNLModify, ({
{sfUNLModifyDisabling, soeREQUIRED},
{sfLedgerSequence, soeREQUIRED},
{sfUNLModifyValidator, soeREQUIRED},

View File

@@ -20,7 +20,7 @@ struct JsonMissingKeyError : std::exception
JsonMissingKeyError(Json::StaticString const& k) : key{k.c_str()}
{
}
char const*
const char*
what() const noexcept override
{
if (msg.empty())
@@ -40,7 +40,7 @@ struct JsonTypeMismatchError : std::exception
: key{k.c_str()}, expectedType{std::move(et)}
{
}
char const*
const char*
what() const noexcept override
{
if (msg.empty())

View File

@@ -145,7 +145,6 @@ JSS(attestations);
JSS(attestation_reward_account);
JSS(auction_slot); // out: amm_info
JSS(authorized); // out: AccountLines
JSS(authorize); // out: delegate
JSS(authorized_credentials); // in: ledger_entry DepositPreauth
JSS(auth_accounts); // out: amm_info
JSS(auth_change); // out: AccountInfo
@@ -700,7 +699,7 @@ JSS(write_load); // out: GetCounts
#pragma push_macro("TRANSACTION")
#undef TRANSACTION
#define TRANSACTION(tag, value, name, delegatable, fields) JSS(name);
#define TRANSACTION(tag, value, name, fields) JSS(name);
#include <xrpl/protocol/detail/transactions.macro>

View File

@@ -94,7 +94,7 @@ extractTarLz4(
if (archive_entry_size(entry) > 0)
{
void const* buf;
const void* buf;
size_t sz;
la_int64_t offset;
while (true)

View File

@@ -63,7 +63,7 @@ getFileContents(
return {};
}
std::string const result{
const std::string result{
std::istreambuf_iterator<char>{fileStream},
std::istreambuf_iterator<char>{}};

View File

@@ -31,13 +31,12 @@
#include <type_traits>
#include <utility>
#ifdef _MSC_VER
#pragma message("Using boost::multiprecision::uint128_t")
#ifdef BOOST_COMP_MSVC
#include <boost/multiprecision/cpp_int.hpp>
using uint128_t = boost::multiprecision::uint128_t;
#else // !defined(_MSC_VER)
#else // !defined(_MSVC_LANG)
using uint128_t = __uint128_t;
#endif // !defined(_MSC_VER)
#endif // !defined(_MSVC_LANG)
namespace ripple {
@@ -469,7 +468,7 @@ Number::operator/=(Number const& y)
}
// Shift by 10^17 gives greatest precision while not overflowing uint128_t
// or the cast back to int64_t
uint128_t const f = 100'000'000'000'000'000;
const uint128_t f = 100'000'000'000'000'000;
mantissa_ = static_cast<std::int64_t>(uint128_t(nm) * f / uint128_t(dm));
exponent_ = ne - de - 17;
mantissa_ *= np * dp;

View File

@@ -89,13 +89,13 @@ parseUrl(parsedURL& pUrl, std::string const& strUrl)
boost::algorithm::to_lower(pUrl.scheme);
pUrl.username = smMatch[2];
pUrl.password = smMatch[3];
std::string const domain = smMatch[4];
const std::string domain = smMatch[4];
// We need to use Endpoint to parse the domain to
// strip surrounding brackets from IPv6 addresses,
// e.g. [::1] => ::1.
auto const result = beast::IP::Endpoint::from_string_checked(domain);
const auto result = beast::IP::Endpoint::from_string_checked(domain);
pUrl.domain = result ? result->address().to_string() : domain;
std::string const port = smMatch[5];
const std::string port = smMatch[5];
if (!port.empty())
{
pUrl.port = beast::lexicalCast<std::uint16_t>(port);

View File

@@ -67,7 +67,7 @@ UptimeClock::time_point
UptimeClock::now()
{
// start the update thread on first use
static auto const init = start_clock();
static const auto init = start_clock();
// Return the number of seconds since rippled start
return time_point{duration{now_}};

View File

@@ -31,7 +31,9 @@ namespace ripple {
std::optional<std::uint64_t>
mulDiv(std::uint64_t value, std::uint64_t mul, std::uint64_t div)
{
boost::multiprecision::uint128_t result;
using namespace boost::multiprecision;
uint128_t result;
result = multiply(result, value, mul);
result /= div;

View File

@@ -34,7 +34,7 @@ namespace Json {
namespace {
std::map<char, char const*> jsonSpecialCharacterEscape = {
std::map<char, const char*> jsonSpecialCharacterEscape = {
{'"', "\\\""},
{'\\', "\\\\"},
{'/', "\\/"},
@@ -47,13 +47,13 @@ std::map<char, char const*> jsonSpecialCharacterEscape = {
static size_t const jsonEscapeLength = 2;
// All other JSON punctuation.
char const closeBrace = '}';
char const closeBracket = ']';
char const colon = ':';
char const comma = ',';
char const openBrace = '{';
char const openBracket = '[';
char const quote = '"';
const char closeBrace = '}';
const char closeBracket = ']';
const char colon = ':';
const char comma = ',';
const char openBrace = '{';
const char openBracket = '[';
const char quote = '"';
static auto const integralFloatsBecomeInts = false;

View File

@@ -78,8 +78,8 @@ bool
Reader::parse(std::string const& document, Value& root)
{
document_ = document;
char const* begin = document_.c_str();
char const* end = begin + document_.length();
const char* begin = document_.c_str();
const char* end = begin + document_.length();
return parse(begin, end, root);
}
@@ -99,7 +99,7 @@ Reader::parse(std::istream& sin, Value& root)
}
bool
Reader::parse(char const* beginDoc, char const* endDoc, Value& root)
Reader::parse(const char* beginDoc, const char* endDoc, Value& root)
{
begin_ = beginDoc;
end_ = endDoc;
@@ -193,7 +193,7 @@ Reader::skipCommentTokens(Token& token)
}
bool
Reader::expectToken(TokenType type, Token& token, char const* message)
Reader::expectToken(TokenType type, Token& token, const char* message)
{
readToken(token);
@@ -629,7 +629,7 @@ bool
Reader::decodeDouble(Token& token)
{
double value = 0;
int const bufferSize = 32;
const int bufferSize = 32;
int count;
int length = int(token.end_ - token.start_);
// Sanity check to avoid buffer overflow exploits.
@@ -939,7 +939,7 @@ Reader::getFormatedErrorMessages() const
itError != errors_.end();
++itError)
{
ErrorInfo const& error = *itError;
const ErrorInfo& error = *itError;
formattedMessage +=
"* " + getLocationLineAndColumn(error.token_.start_) + "\n";
formattedMessage += " " + error.message_ + "\n";

View File

@@ -31,10 +31,10 @@
namespace Json {
Value const Value::null;
Int const Value::minInt = Int(~(UInt(-1) / 2));
Int const Value::maxInt = Int(UInt(-1) / 2);
UInt const Value::maxUInt = UInt(-1);
const Value Value::null;
const Int Value::minInt = Int(~(UInt(-1) / 2));
const Int Value::maxInt = Int(UInt(-1) / 2);
const UInt Value::maxUInt = UInt(-1);
class DefaultValueAllocator : public ValueAllocator
{
@@ -42,7 +42,7 @@ public:
virtual ~DefaultValueAllocator() = default;
char*
makeMemberName(char const* memberName) override
makeMemberName(const char* memberName) override
{
return duplicateStringValue(memberName);
}
@@ -54,7 +54,7 @@ public:
}
char*
duplicateStringValue(char const* value, unsigned int length = unknown)
duplicateStringValue(const char* value, unsigned int length = unknown)
override
{
//@todo investigate this old optimization
@@ -110,14 +110,14 @@ Value::CZString::CZString(int index) : cstr_(0), index_(index)
{
}
Value::CZString::CZString(char const* cstr, DuplicationPolicy allocate)
Value::CZString::CZString(const char* cstr, DuplicationPolicy allocate)
: cstr_(
allocate == duplicate ? valueAllocator()->makeMemberName(cstr) : cstr)
, index_(allocate)
{
}
Value::CZString::CZString(CZString const& other)
Value::CZString::CZString(const CZString& other)
: cstr_(
other.index_ != noDuplication && other.cstr_ != 0
? valueAllocator()->makeMemberName(other.cstr_)
@@ -136,7 +136,7 @@ Value::CZString::~CZString()
}
bool
Value::CZString::operator<(CZString const& other) const
Value::CZString::operator<(const CZString& other) const
{
if (cstr_ && other.cstr_)
return strcmp(cstr_, other.cstr_) < 0;
@@ -145,7 +145,7 @@ Value::CZString::operator<(CZString const& other) const
}
bool
Value::CZString::operator==(CZString const& other) const
Value::CZString::operator==(const CZString& other) const
{
if (cstr_ && other.cstr_)
return strcmp(cstr_, other.cstr_) == 0;
@@ -159,7 +159,7 @@ Value::CZString::index() const
return index_;
}
char const*
const char*
Value::CZString::c_str() const
{
return cstr_;
@@ -232,7 +232,7 @@ Value::Value(double value) : type_(realValue)
value_.real_ = value;
}
Value::Value(char const* value) : type_(stringValue), allocated_(true)
Value::Value(const char* value) : type_(stringValue), allocated_(true)
{
value_.string_ = valueAllocator()->duplicateStringValue(value);
}
@@ -243,7 +243,7 @@ Value::Value(std::string const& value) : type_(stringValue), allocated_(true)
value.c_str(), (unsigned int)value.length());
}
Value::Value(StaticString const& value) : type_(stringValue), allocated_(false)
Value::Value(const StaticString& value) : type_(stringValue), allocated_(false)
{
value_.string_ = const_cast<char*>(value.c_str());
}
@@ -253,7 +253,7 @@ Value::Value(bool value) : type_(booleanValue)
value_.bool_ = value;
}
Value::Value(Value const& other) : type_(other.type_)
Value::Value(const Value& other) : type_(other.type_)
{
switch (type_)
{
@@ -370,7 +370,7 @@ integerCmp(Int i, UInt ui)
}
bool
operator<(Value const& x, Value const& y)
operator<(const Value& x, const Value& y)
{
if (auto signum = x.type_ - y.type_)
{
@@ -419,7 +419,7 @@ operator<(Value const& x, Value const& y)
}
bool
operator==(Value const& x, Value const& y)
operator==(const Value& x, const Value& y)
{
if (x.type_ != y.type_)
{
@@ -464,7 +464,7 @@ operator==(Value const& x, Value const& y)
return 0; // unreachable
}
char const*
const char*
Value::asCString() const
{
XRPL_ASSERT(type_ == stringValue, "Json::Value::asCString : valid type");
@@ -795,7 +795,7 @@ Value::operator[](UInt index)
return (*it).second;
}
Value const&
const Value&
Value::operator[](UInt index) const
{
XRPL_ASSERT(
@@ -815,13 +815,13 @@ Value::operator[](UInt index) const
}
Value&
Value::operator[](char const* key)
Value::operator[](const char* key)
{
return resolveReference(key, false);
}
Value&
Value::resolveReference(char const* key, bool isStatic)
Value::resolveReference(const char* key, bool isStatic)
{
XRPL_ASSERT(
type_ == nullValue || type_ == objectValue,
@@ -844,9 +844,9 @@ Value::resolveReference(char const* key, bool isStatic)
}
Value
Value::get(UInt index, Value const& defaultValue) const
Value::get(UInt index, const Value& defaultValue) const
{
Value const* value = &((*this)[index]);
const Value* value = &((*this)[index]);
return value == &null ? defaultValue : *value;
}
@@ -856,8 +856,8 @@ Value::isValidIndex(UInt index) const
return index < size();
}
Value const&
Value::operator[](char const* key) const
const Value&
Value::operator[](const char* key) const
{
XRPL_ASSERT(
type_ == nullValue || type_ == objectValue,
@@ -881,20 +881,20 @@ Value::operator[](std::string const& key)
return (*this)[key.c_str()];
}
Value const&
const Value&
Value::operator[](std::string const& key) const
{
return (*this)[key.c_str()];
}
Value&
Value::operator[](StaticString const& key)
Value::operator[](const StaticString& key)
{
return resolveReference(key, true);
}
Value&
Value::append(Value const& value)
Value::append(const Value& value)
{
return (*this)[size()] = value;
}
@@ -906,20 +906,20 @@ Value::append(Value&& value)
}
Value
Value::get(char const* key, Value const& defaultValue) const
Value::get(const char* key, const Value& defaultValue) const
{
Value const* value = &((*this)[key]);
const Value* value = &((*this)[key]);
return value == &null ? defaultValue : *value;
}
Value
Value::get(std::string const& key, Value const& defaultValue) const
Value::get(std::string const& key, const Value& defaultValue) const
{
return get(key.c_str(), defaultValue);
}
Value
Value::removeMember(char const* key)
Value::removeMember(const char* key)
{
XRPL_ASSERT(
type_ == nullValue || type_ == objectValue,
@@ -946,12 +946,12 @@ Value::removeMember(std::string const& key)
}
bool
Value::isMember(char const* key) const
Value::isMember(const char* key) const
{
if (type_ != objectValue)
return false;
Value const* value = &((*this)[key]);
const Value* value = &((*this)[key]);
return value != &null;
}

View File

@@ -37,7 +37,7 @@ ValueIteratorBase::ValueIteratorBase() : current_(), isNull_(true)
}
ValueIteratorBase::ValueIteratorBase(
Value::ObjectValues::iterator const& current)
const Value::ObjectValues::iterator& current)
: current_(current), isNull_(false)
{
}
@@ -61,7 +61,7 @@ ValueIteratorBase::decrement()
}
ValueIteratorBase::difference_type
ValueIteratorBase::computeDistance(SelfType const& other) const
ValueIteratorBase::computeDistance(const SelfType& other) const
{
// Iterator for null value are initialized using the default
// constructor, which initialize current_ to the default
@@ -89,7 +89,7 @@ ValueIteratorBase::computeDistance(SelfType const& other) const
}
bool
ValueIteratorBase::isEqual(SelfType const& other) const
ValueIteratorBase::isEqual(const SelfType& other) const
{
if (isNull_)
{
@@ -100,7 +100,7 @@ ValueIteratorBase::isEqual(SelfType const& other) const
}
void
ValueIteratorBase::copy(SelfType const& other)
ValueIteratorBase::copy(const SelfType& other)
{
current_ = other.current_;
}
@@ -108,7 +108,7 @@ ValueIteratorBase::copy(SelfType const& other)
Value
ValueIteratorBase::key() const
{
Value::CZString const czstring = (*current_).first;
const Value::CZString czstring = (*current_).first;
if (czstring.c_str())
{
@@ -124,7 +124,7 @@ ValueIteratorBase::key() const
UInt
ValueIteratorBase::index() const
{
Value::CZString const czstring = (*current_).first;
const Value::CZString czstring = (*current_).first;
if (!czstring.c_str())
return czstring.index();
@@ -132,10 +132,10 @@ ValueIteratorBase::index() const
return Value::UInt(-1);
}
char const*
const char*
ValueIteratorBase::memberName() const
{
char const* name = (*current_).first.c_str();
const char* name = (*current_).first.c_str();
return name ? name : "";
}
@@ -148,13 +148,13 @@ ValueIteratorBase::memberName() const
// //////////////////////////////////////////////////////////////////
ValueConstIterator::ValueConstIterator(
Value::ObjectValues::iterator const& current)
const Value::ObjectValues::iterator& current)
: ValueIteratorBase(current)
{
}
ValueConstIterator&
ValueConstIterator::operator=(ValueIteratorBase const& other)
ValueConstIterator::operator=(const ValueIteratorBase& other)
{
copy(other);
return *this;
@@ -168,23 +168,23 @@ ValueConstIterator::operator=(ValueIteratorBase const& other)
// //////////////////////////////////////////////////////////////////
// //////////////////////////////////////////////////////////////////
ValueIterator::ValueIterator(Value::ObjectValues::iterator const& current)
ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current)
: ValueIteratorBase(current)
{
}
ValueIterator::ValueIterator(ValueConstIterator const& other)
ValueIterator::ValueIterator(const ValueConstIterator& other)
: ValueIteratorBase(other)
{
}
ValueIterator::ValueIterator(ValueIterator const& other)
ValueIterator::ValueIterator(const ValueIterator& other)
: ValueIteratorBase(other)
{
}
ValueIterator&
ValueIterator::operator=(SelfType const& other)
ValueIterator::operator=(const SelfType& other)
{
copy(other);
return *this;

View File

@@ -40,7 +40,7 @@ isControlCharacter(char ch)
}
static bool
containsControlCharacter(char const* str)
containsControlCharacter(const char* str)
{
while (*str)
{
@@ -117,7 +117,7 @@ valueToString(bool value)
}
std::string
valueToQuotedString(char const* value)
valueToQuotedString(const char* value)
{
// Not sure how to handle unicode...
if (strpbrk(value, "\"\\\b\f\n\r\t") == nullptr &&
@@ -132,7 +132,7 @@ valueToQuotedString(char const* value)
result.reserve(maxsize); // to avoid lots of mallocs
result += "\"";
for (char const* c = value; *c != 0; ++c)
for (const char* c = value; *c != 0; ++c)
{
switch (*c)
{
@@ -197,7 +197,7 @@ valueToQuotedString(char const* value)
// //////////////////////////////////////////////////////////////////
std::string
FastWriter::write(Value const& root)
FastWriter::write(const Value& root)
{
document_ = "";
writeValue(root);
@@ -205,7 +205,7 @@ FastWriter::write(Value const& root)
}
void
FastWriter::writeValue(Value const& value)
FastWriter::writeValue(const Value& value)
{
switch (value.type())
{
@@ -281,7 +281,7 @@ StyledWriter::StyledWriter() : rightMargin_(74), indentSize_(3)
}
std::string
StyledWriter::write(Value const& root)
StyledWriter::write(const Value& root)
{
document_ = "";
addChildValues_ = false;
@@ -292,7 +292,7 @@ StyledWriter::write(Value const& root)
}
void
StyledWriter::writeValue(Value const& value)
StyledWriter::writeValue(const Value& value)
{
switch (value.type())
{
@@ -338,7 +338,7 @@ StyledWriter::writeValue(Value const& value)
while (true)
{
std::string const& name = *it;
Value const& childValue = value[name];
const Value& childValue = value[name];
writeWithIndent(valueToQuotedString(name.c_str()));
document_ += " : ";
writeValue(childValue);
@@ -358,7 +358,7 @@ StyledWriter::writeValue(Value const& value)
}
void
StyledWriter::writeArrayValue(Value const& value)
StyledWriter::writeArrayValue(const Value& value)
{
unsigned size = value.size();
@@ -377,7 +377,7 @@ StyledWriter::writeArrayValue(Value const& value)
while (true)
{
Value const& childValue = value[index];
const Value& childValue = value[index];
if (hasChildValue)
writeWithIndent(childValues_[index]);
@@ -417,7 +417,7 @@ StyledWriter::writeArrayValue(Value const& value)
}
bool
StyledWriter::isMultineArray(Value const& value)
StyledWriter::isMultineArray(const Value& value)
{
int size = value.size();
bool isMultiLine = size * 3 >= rightMargin_;
@@ -425,7 +425,7 @@ StyledWriter::isMultineArray(Value const& value)
for (int index = 0; index < size && !isMultiLine; ++index)
{
Value const& childValue = value[index];
const Value& childValue = value[index];
isMultiLine = isMultiLine ||
((childValue.isArray() || childValue.isObject()) &&
childValue.size() > 0);
@@ -507,7 +507,7 @@ StyledStreamWriter::StyledStreamWriter(std::string indentation)
}
void
StyledStreamWriter::write(std::ostream& out, Value const& root)
StyledStreamWriter::write(std::ostream& out, const Value& root)
{
document_ = &out;
addChildValues_ = false;
@@ -518,7 +518,7 @@ StyledStreamWriter::write(std::ostream& out, Value const& root)
}
void
StyledStreamWriter::writeValue(Value const& value)
StyledStreamWriter::writeValue(const Value& value)
{
switch (value.type())
{
@@ -564,7 +564,7 @@ StyledStreamWriter::writeValue(Value const& value)
while (true)
{
std::string const& name = *it;
Value const& childValue = value[name];
const Value& childValue = value[name];
writeWithIndent(valueToQuotedString(name.c_str()));
*document_ << " : ";
writeValue(childValue);
@@ -584,7 +584,7 @@ StyledStreamWriter::writeValue(Value const& value)
}
void
StyledStreamWriter::writeArrayValue(Value const& value)
StyledStreamWriter::writeArrayValue(const Value& value)
{
unsigned size = value.size();
@@ -603,7 +603,7 @@ StyledStreamWriter::writeArrayValue(Value const& value)
while (true)
{
Value const& childValue = value[index];
const Value& childValue = value[index];
if (hasChildValue)
writeWithIndent(childValues_[index]);
@@ -643,7 +643,7 @@ StyledStreamWriter::writeArrayValue(Value const& value)
}
bool
StyledStreamWriter::isMultineArray(Value const& value)
StyledStreamWriter::isMultineArray(const Value& value)
{
int size = value.size();
bool isMultiLine = size * 3 >= rightMargin_;
@@ -651,7 +651,7 @@ StyledStreamWriter::isMultineArray(Value const& value)
for (int index = 0; index < size && !isMultiLine; ++index)
{
Value const& childValue = value[index];
const Value& childValue = value[index];
isMultiLine = isMultiLine ||
((childValue.isArray() || childValue.isObject()) &&
childValue.size() > 0);
@@ -726,7 +726,7 @@ StyledStreamWriter::unindent()
}
std::ostream&
operator<<(std::ostream& sout, Value const& root)
operator<<(std::ostream& sout, const Value& root)
{
Json::StyledStreamWriter writer;
writer.write(sout, root);

View File

@@ -39,18 +39,6 @@
namespace ripple {
AccountID
ammAccountID(
std::uint16_t prefix,
uint256 const& parentHash,
uint256 const& ammID)
{
ripesha_hasher rsh;
auto const hash = sha512Half(prefix, parentHash, ammID);
rsh(hash.data(), hash.size());
return AccountID{static_cast<ripesha_hasher::result_type>(rsh)};
}
Currency
ammLPTCurrency(Currency const& cur1, Currency const& cur2)
{

View File

@@ -36,7 +36,7 @@ namespace BuildInfo {
// and follow the format described at http://semver.org/
//------------------------------------------------------------------------------
// clang-format off
char const* const versionString = "2.5.0-b1"
char const* const versionString = "2.4.0"
// clang-format on
#if defined(DEBUG) || defined(SANITIZER)

View File

@@ -96,7 +96,6 @@ constexpr static ErrorInfo unorderedErrorInfos[]{
{rpcNOT_SYNCED, "notSynced", "Not synced to the network.", 503},
{rpcNO_EVENTS, "noEvents", "Current transport does not support events.", 405},
{rpcNO_NETWORK, "noNetwork", "Not synced to the network.", 503},
{rpcWRONG_NETWORK, "wrongNetwork", "Wrong network.", 503},
{rpcNO_PERMISSION, "noPermission", "You don't have permission for this command.", 401},
{rpcNO_PF_REQUEST, "noPathRequest", "No pathfinding request in progress.", 404},
{rpcOBJECT_NOT_FOUND, "objectNotFound", "The requested object was not found.", 404},
@@ -107,7 +106,6 @@ constexpr static ErrorInfo unorderedErrorInfos[]{
{rpcSRC_ACT_MALFORMED, "srcActMalformed", "Source account is malformed.", 400},
{rpcSRC_ACT_MISSING, "srcActMissing", "Source account not provided.", 400},
{rpcSRC_ACT_NOT_FOUND, "srcActNotFound", "Source account not found.", 404},
{rpcDELEGATE_ACT_NOT_FOUND, "delegateActNotFound", "Delegate account not found.", 404},
{rpcSRC_CUR_MALFORMED, "srcCurMalformed", "Source currency is malformed.", 400},
{rpcSRC_ISR_MALFORMED, "srcIsrMalformed", "Source issuer is malformed.", 400},
{rpcSTREAM_MALFORMED, "malformedStream", "Stream malformed.", 400},

View File

@@ -139,27 +139,27 @@ class FeatureCollections
{
if (i >= features.size())
LogicError("Invalid FeatureBitset index");
auto const& sequence = features.get<Feature::byIndex>();
const auto& sequence = features.get<Feature::byIndex>();
return sequence[i];
}
size_t
getIndex(Feature const& feature) const
{
auto const& sequence = features.get<Feature::byIndex>();
const auto& sequence = features.get<Feature::byIndex>();
auto const it_to = sequence.iterator_to(feature);
return it_to - sequence.begin();
}
Feature const*
getByFeature(uint256 const& feature) const
{
auto const& feature_index = features.get<Feature::byFeature>();
const auto& feature_index = features.get<Feature::byFeature>();
auto const feature_it = feature_index.find(feature);
return feature_it == feature_index.end() ? nullptr : &*feature_it;
}
Feature const*
getByName(std::string const& name) const
{
auto const& name_index = features.get<Feature::byName>();
const auto& name_index = features.get<Feature::byName>();
auto const name_it = name_index.find(name);
return name_it == name_index.end() ? nullptr : &*name_it;
}
@@ -240,7 +240,7 @@ FeatureCollections::getRegisteredFeature(std::string const& name) const
}
void
check(bool condition, char const* logicErrorMessage)
check(bool condition, const char* logicErrorMessage)
{
if (!condition)
LogicError(logicErrorMessage);
@@ -437,13 +437,9 @@ featureToName(uint256 const& f)
uint256 const feature##name = registerFeature(#name, supported, vote);
#define XRPL_FIX(name, supported, vote) \
uint256 const fix##name = registerFeature("fix" #name, supported, vote);
// clang-format off
#define XRPL_RETIRE(name) \
[[deprecated("The referenced amendment has been retired")]] \
[[maybe_unused]] \
#define XRPL_RETIRE(name) \
[[deprecated("The referenced amendment has been retired"), maybe_unused]] \
uint256 const retired##name = retireFeature(#name);
// clang-format on
#include <xrpl/protocol/detail/features.macro>
@@ -459,7 +455,7 @@ featureToName(uint256 const& f)
//
// Use initialization of one final static variable to set
// featureCollections::readOnly.
[[maybe_unused]] static bool const readOnlySet =
[[maybe_unused]] static const bool readOnlySet =
featureCollections.registrationIsDone();
} // namespace ripple

View File

@@ -94,7 +94,6 @@ enum class LedgerNameSpace : std::uint16_t {
MPTOKEN = 't',
CREDENTIAL = 'D',
PERMISSIONED_DOMAIN = 'm',
DELEGATE = 'E',
// No longer used or supported. Left here to reserve the space
// to avoid accidental reuse.
@@ -453,14 +452,6 @@ amm(uint256 const& id) noexcept
return {ltAMM, id};
}
Keylet
delegate(AccountID const& account, AccountID const& authorizedAccount) noexcept
{
return {
ltDELEGATE,
indexHash(LedgerNameSpace::DELEGATE, account, authorizedAccount)};
}
Keylet
bridge(STXChainBridge const& bridge, STXChainBridge::ChainType chainType)
{

View File

@@ -154,10 +154,6 @@ InnerObjectFormats::InnerObjectFormats()
{sfIssuer, soeREQUIRED},
{sfCredentialType, soeREQUIRED},
});
add(sfPermission.jsonName.c_str(),
sfPermission.getCode(),
{{sfPermissionValue, soeREQUIRED}});
}
InnerObjectFormats const&

View File

@@ -29,7 +29,7 @@ namespace ripple {
LedgerFormats::LedgerFormats()
{
// Fields shared by all ledger formats:
static std::initializer_list<SOElement> const commonFields{
static const std::initializer_list<SOElement> commonFields{
{sfLedgerIndex, soeOPTIONAL},
{sfLedgerEntryType, soeREQUIRED},
{sfFlags, soeREQUIRED},

View File

@@ -1,148 +0,0 @@
//------------------------------------------------------------------------------
/*
This file is part of rippled: https://github.com/ripple/rippled
Copyright (c) 2025 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.
*/
//==============================================================================
#include <xrpl/beast/utility/instrumentation.h>
#include <xrpl/protocol/Permissions.h>
#include <xrpl/protocol/jss.h>
namespace ripple {
Permission::Permission()
{
delegatableTx_ = {
#pragma push_macro("TRANSACTION")
#undef TRANSACTION
#define TRANSACTION(tag, value, name, delegatable, fields) {value, delegatable},
#include <xrpl/protocol/detail/transactions.macro>
#undef TRANSACTION
#pragma pop_macro("TRANSACTION")
};
granularPermissionMap_ = {
#pragma push_macro("PERMISSION")
#undef PERMISSION
#define PERMISSION(type, txType, value) {#type, type},
#include <xrpl/protocol/detail/permissions.macro>
#undef PERMISSION
#pragma pop_macro("PERMISSION")
};
granularNameMap_ = {
#pragma push_macro("PERMISSION")
#undef PERMISSION
#define PERMISSION(type, txType, value) {type, #type},
#include <xrpl/protocol/detail/permissions.macro>
#undef PERMISSION
#pragma pop_macro("PERMISSION")
};
granularTxTypeMap_ = {
#pragma push_macro("PERMISSION")
#undef PERMISSION
#define PERMISSION(type, txType, value) {type, txType},
#include <xrpl/protocol/detail/permissions.macro>
#undef PERMISSION
#pragma pop_macro("PERMISSION")
};
for ([[maybe_unused]] auto const& permission : granularPermissionMap_)
XRPL_ASSERT(
permission.second > UINT16_MAX,
"ripple::Permission::granularPermissionMap_ : granular permission "
"value must not exceed the maximum uint16_t value.");
}
Permission const&
Permission::getInstance()
{
static Permission const instance;
return instance;
}
std::optional<std::uint32_t>
Permission::getGranularValue(std::string const& name) const
{
auto const it = granularPermissionMap_.find(name);
if (it != granularPermissionMap_.end())
return static_cast<uint32_t>(it->second);
return std::nullopt;
}
std::optional<std::string>
Permission::getGranularName(GranularPermissionType const& value) const
{
auto const it = granularNameMap_.find(value);
if (it != granularNameMap_.end())
return it->second;
return std::nullopt;
}
std::optional<TxType>
Permission::getGranularTxType(GranularPermissionType const& gpType) const
{
auto const it = granularTxTypeMap_.find(gpType);
if (it != granularTxTypeMap_.end())
return it->second;
return std::nullopt;
}
bool
Permission::isDelegatable(std::uint32_t const& permissionValue) const
{
auto const granularPermission =
getGranularName(static_cast<GranularPermissionType>(permissionValue));
if (granularPermission)
// granular permissions are always allowed to be delegated
return true;
auto const it = delegatableTx_.find(permissionValue - 1);
if (it != delegatableTx_.end() && it->second == Delegation::notDelegatable)
return false;
return true;
}
uint32_t
Permission::txToPermissionType(TxType const& type) const
{
return static_cast<uint32_t>(type) + 1;
}
TxType
Permission::permissionToTxType(uint32_t const& value) const
{
return static_cast<TxType>(value - 1);
}
} // namespace ripple

View File

@@ -183,7 +183,7 @@ Quality
Quality::round(int digits) const
{
// Modulus for mantissa
static std::uint64_t const mod[17] = {
static const std::uint64_t mod[17] = {
/* 0 */ 10000000000000000,
/* 1 */ 1000000000000000,
/* 2 */ 100000000000000,

View File

@@ -87,7 +87,7 @@ SField::SField(
private_access_tag_t,
SerializedTypeID tid,
int fv,
char const* fn,
const char* fn,
int meta,
IsSigning signing)
: fieldCode(field_code(tid, fv))

View File

@@ -106,7 +106,7 @@ STAccount::add(Serializer& s) const
}
bool
STAccount::isEquivalent(STBase const& t) const
STAccount::isEquivalent(const STBase& t) const
{
auto const* const tPtr = dynamic_cast<STAccount const*>(&t);
return tPtr && (default_ == tPtr->default_) && (value_ == tPtr->value_);

View File

@@ -90,13 +90,13 @@ setSTAmountCanonicalizeSwitchover(bool v)
*getStaticSTAmountCanonicalizeSwitchover() = v;
}
static std::uint64_t const tenTo14 = 100000000000000ull;
static std::uint64_t const tenTo14m1 = tenTo14 - 1;
static std::uint64_t const tenTo17 = tenTo14 * 1000;
static const std::uint64_t tenTo14 = 100000000000000ull;
static const std::uint64_t tenTo14m1 = tenTo14 - 1;
static const std::uint64_t tenTo17 = tenTo14 * 1000;
//------------------------------------------------------------------------------
static std::int64_t
getInt64Value(STAmount const& amount, bool valid, char const* error)
getInt64Value(STAmount const& amount, bool valid, const char* error)
{
if (!valid)
Throw<std::runtime_error>(error);
@@ -680,9 +680,9 @@ STAmount::add(Serializer& s) const
}
bool
STAmount::isEquivalent(STBase const& t) const
STAmount::isEquivalent(const STBase& t) const
{
STAmount const* v = dynamic_cast<STAmount const*>(&t);
const STAmount* v = dynamic_cast<const STAmount*>(&t);
return v && (*v == *this);
}
@@ -1065,7 +1065,7 @@ amountFromJsonNoThrow(STAmount& result, Json::Value const& jvSource)
result = amountFromJson(sfGeneric, jvSource);
return true;
}
catch (std::exception const& e)
catch (const std::exception& e)
{
JLOG(debugLog().warn())
<< "amountFromJsonNoThrow: caught: " << e.what();

View File

@@ -181,9 +181,9 @@ STArray::getSType() const
}
bool
STArray::isEquivalent(STBase const& t) const
STArray::isEquivalent(const STBase& t) const
{
auto v = dynamic_cast<STArray const*>(&t);
auto v = dynamic_cast<const STArray*>(&t);
return v != nullptr && v_ == v->v_;
}
@@ -194,7 +194,7 @@ STArray::isDefault() const
}
void
STArray::sort(bool (*compare)(STObject const&, STObject const&))
STArray::sort(bool (*compare)(const STObject&, const STObject&))
{
std::sort(v_.begin(), v_.end(), compare);
}

View File

@@ -40,7 +40,7 @@ STBase::STBase(SField const& n) : fName(&n)
}
STBase&
STBase::operator=(STBase const& t)
STBase::operator=(const STBase& t)
{
if (!fName->isUseful())
fName = t.fName;
@@ -48,13 +48,13 @@ STBase::operator=(STBase const& t)
}
bool
STBase::operator==(STBase const& t) const
STBase::operator==(const STBase& t) const
{
return (getSType() == t.getSType()) && isEquivalent(t);
}
bool
STBase::operator!=(STBase const& t) const
STBase::operator!=(const STBase& t) const
{
return (getSType() != t.getSType()) || !isEquivalent(t);
}
@@ -116,7 +116,7 @@ STBase::add(Serializer& s) const
}
bool
STBase::isEquivalent(STBase const& t) const
STBase::isEquivalent(const STBase& t) const
{
XRPL_ASSERT(
getSType() == STI_NOTPRESENT,
@@ -154,7 +154,7 @@ STBase::addFieldID(Serializer& s) const
//------------------------------------------------------------------------------
std::ostream&
operator<<(std::ostream& out, STBase const& t)
operator<<(std::ostream& out, const STBase& t)
{
return out << t.getFullText();
}

View File

@@ -71,9 +71,9 @@ STBlob::add(Serializer& s) const
}
bool
STBlob::isEquivalent(STBase const& t) const
STBlob::isEquivalent(const STBase& t) const
{
STBlob const* v = dynamic_cast<STBlob const*>(&t);
const STBlob* v = dynamic_cast<const STBlob*>(&t);
return v && (value_ == v->value_);
}

View File

@@ -72,9 +72,9 @@ STCurrency::add(Serializer& s) const
}
bool
STCurrency::isEquivalent(STBase const& t) const
STCurrency::isEquivalent(const STBase& t) const
{
STCurrency const* v = dynamic_cast<STCurrency const*>(&t);
const STCurrency* v = dynamic_cast<const STCurrency*>(&t);
return v && (*v == *this);
}

View File

@@ -22,7 +22,6 @@
#include <xrpl/beast/utility/instrumentation.h>
#include <xrpl/json/json_value.h>
#include <xrpl/protocol/LedgerFormats.h>
#include <xrpl/protocol/Permissions.h>
#include <xrpl/protocol/SField.h>
#include <xrpl/protocol/STBase.h>
#include <xrpl/protocol/STInteger.h>
@@ -178,27 +177,6 @@ template <>
Json::Value
STUInt32::getJson(JsonOptions) const
{
if (getFName() == sfPermissionValue)
{
auto const permissionValue =
static_cast<GranularPermissionType>(value_);
auto const granular =
Permission::getInstance().getGranularName(permissionValue);
if (granular)
{
return *granular;
}
else
{
auto const txType =
Permission::getInstance().permissionToTxType(value_);
auto item = TxFormats::getInstance().findByType(txType);
if (item != nullptr)
return item->getName();
}
}
return value_;
}

View File

@@ -128,9 +128,9 @@ STIssue::add(Serializer& s) const
}
bool
STIssue::isEquivalent(STBase const& t) const
STIssue::isEquivalent(const STBase& t) const
{
STIssue const* v = dynamic_cast<STIssue const*>(&t);
const STIssue* v = dynamic_cast<const STIssue*>(&t);
return v && (*v == *this);
}

View File

@@ -153,7 +153,7 @@ STObject::operator=(STObject&& other)
}
void
STObject::set(SOTemplate const& type)
STObject::set(const SOTemplate& type)
{
v_.clear();
v_.reserve(type.size());
@@ -169,7 +169,7 @@ STObject::set(SOTemplate const& type)
}
void
STObject::applyTemplate(SOTemplate const& type)
STObject::applyTemplate(const SOTemplate& type)
{
auto throwFieldErr = [](std::string const& field, char const* description) {
std::stringstream ss;
@@ -296,9 +296,9 @@ STObject::set(SerialIter& sit, int depth)
}
bool
STObject::hasMatchingEntry(STBase const& t)
STObject::hasMatchingEntry(const STBase& t)
{
STBase const* o = peekAtPField(t.getFName());
const STBase* o = peekAtPField(t.getFName());
if (!o)
return false;
@@ -357,9 +357,9 @@ STObject::getText() const
}
bool
STObject::isEquivalent(STBase const& t) const
STObject::isEquivalent(const STBase& t) const
{
STObject const* v = dynamic_cast<STObject const*>(&t);
const STObject* v = dynamic_cast<const STObject*>(&t);
if (!v)
return false;
@@ -425,7 +425,7 @@ STObject::getFieldIndex(SField const& field) const
return -1;
}
STBase const&
const STBase&
STObject::peekAtField(SField const& field) const
{
int index = getFieldIndex(field);
@@ -453,7 +453,7 @@ STObject::getFieldSType(int index) const
return v_[index]->getFName();
}
STBase const*
const STBase*
STObject::peekAtPField(SField const& field) const
{
int index = getFieldIndex(field);
@@ -536,7 +536,7 @@ STObject::isFlag(std::uint32_t f) const
std::uint32_t
STObject::getFlags(void) const
{
STUInt32 const* t = dynamic_cast<STUInt32 const*>(peekAtPField(sfFlags));
const STUInt32* t = dynamic_cast<const STUInt32*>(peekAtPField(sfFlags));
if (!t)
return 0;
@@ -574,7 +574,7 @@ STObject::makeFieldAbsent(SField const& field)
if (index == -1)
throwFieldNotFound(field);
STBase const& f = peekAtIndex(index);
const STBase& f = peekAtIndex(index);
if (f.getSType() == STI_NOTPRESENT)
return;
@@ -675,14 +675,14 @@ STObject::getFieldPathSet(SField const& field) const
return getFieldByConstRef<STPathSet>(field, empty);
}
STVector256 const&
const STVector256&
STObject::getFieldV256(SField const& field) const
{
static STVector256 const empty{};
return getFieldByConstRef<STVector256>(field, empty);
}
STArray const&
const STArray&
STObject::getFieldArray(SField const& field) const
{
static STArray const empty{};
@@ -835,7 +835,7 @@ STObject::getJson(JsonOptions options) const
}
bool
STObject::operator==(STObject const& obj) const
STObject::operator==(const STObject& obj) const
{
// This is not particularly efficient, and only compares data elements
// with binary representations

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