diff --git a/.github/workflows/verify-generated-headers.yml b/.github/workflows/verify-generated-headers.yml index 861d1d2a1..2d682fb58 100644 --- a/.github/workflows/verify-generated-headers.yml +++ b/.github/workflows/verify-generated-headers.yml @@ -18,6 +18,10 @@ jobs: generator: bash ./hook/generate_sfcodes.sh - target: hook/tts.h generator: ./hook/generate_tts.sh + - target: hook/ls_flags.h + generator: ./hook/generate_lsflags.sh + - target: hook/tx_flags.h + generator: ./hook/generate_txflags.sh runs-on: ubuntu-24.04 env: CLANG_VERSION: 18 diff --git a/hook/generate_lsflags.sh b/hook/generate_lsflags.sh new file mode 100755 index 000000000..50a69e8b8 --- /dev/null +++ b/hook/generate_lsflags.sh @@ -0,0 +1,82 @@ +#!/bin/bash +set -eu + +SCRIPT_DIR=$(dirname "$0") +SCRIPT_DIR=$(cd "$SCRIPT_DIR" && pwd) + +RIPPLED_ROOT="$SCRIPT_DIR/../include/xrpl" +LEDGER_FORMATS="$RIPPLED_ROOT/protocol/LedgerFormats.h" + +echo '// Generated using generate_lsflags.sh' +echo '' +echo '#ifndef HOOKLSFLAGS_INCLUDED' +echo '#define HOOKLSFLAGS_INCLUDED 1' +echo '' +awk ' + function ltrim(s) { sub(/^[[:space:]]+/, "", s); return s } + function rtrim(s) { sub(/[[:space:]]+$/, "", s); return s } + function trim(s) { return rtrim(ltrim(s)) } + + function flush_group() { + if (entry_count > 0 && group != "") { + printf "enum %s {\n", group + for (i = 1; i <= entry_count; i++) { + printf " %s,\n", entries[i] + } + printf "};\n" + } + delete entries + entry_count = 0 + } + + /enum LedgerSpecificFlags \{/ { inside = 1; next } + inside && /^\};/ { inside = 0; flush_group(); next } + !inside { next } + + # Group header comments: // ltFOO or // remarks + /^[[:space:]]*\/\/[[:space:]]*(lt[A-Z_]+|remarks)[[:space:]]*$/ { + flush_group() + line = $0 + sub(/.*\/\/[[:space:]]*/, "", line) + group = trim(line) + next + } + + # Skip pure comment lines (not group headers) + /^[[:space:]]*\/\// { next } + + # Skip blank lines + /^[[:space:]]*$/ { next } + + # Accumulate flag lines (handle multi-line values) + { + line = $0 + # Strip inline comments + sub(/\/\/.*/, "", line) + line = trim(line) + if (line == "") next + + if (pending != "") { + pending = pending " " line + } else { + pending = line + } + + # If line ends with comma, the entry is complete + if (pending ~ /,$/) { + # Remove trailing comma + sub(/,$/, "", pending) + entries[++entry_count] = pending + pending = "" + } + } + + BEGIN { + inside = 0 + group = "" + pending = "" + entry_count = 0 + } +' "$LEDGER_FORMATS" +echo '' +echo '#endif // HOOKLSFLAGS_INCLUDED' diff --git a/hook/generate_txflags.sh b/hook/generate_txflags.sh new file mode 100755 index 000000000..f20fcac66 --- /dev/null +++ b/hook/generate_txflags.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -eu + +SCRIPT_DIR=$(dirname "$0") +SCRIPT_DIR=$(cd "$SCRIPT_DIR" && pwd) + +RIPPLED_ROOT="$SCRIPT_DIR/../include/xrpl" +TX_FLAGS="$RIPPLED_ROOT/protocol/TxFlags.h" + +echo '// Generated using generate_txflags.sh' +echo '#include "ls_flags.h"' +echo '#include ' +echo '' +cat "$TX_FLAGS" | + awk ' + /^[[:space:]]*enum / { + if (count > 0) print "" + inside = 1 + count++ + } + inside { + print + if (/};/) inside = 0 + } + ' diff --git a/hook/hookapi.h b/hook/hookapi.h index eb9751f14..69890544b 100644 --- a/hook/hookapi.h +++ b/hook/hookapi.h @@ -49,4 +49,7 @@ #include "macro.h" #include "tts.h" +#include "ls_flags.h" +#include "tx_flags.h" + #endif diff --git a/hook/ls_flags.h b/hook/ls_flags.h new file mode 100644 index 000000000..2ce87f081 --- /dev/null +++ b/hook/ls_flags.h @@ -0,0 +1,75 @@ +// Generated using generate_lsflags.sh + +#ifndef HOOKLSFLAGS_INCLUDED +#define HOOKLSFLAGS_INCLUDED 1 + +enum ltACCOUNT_ROOT { + lsfPasswordSpent = 0x00010000, + lsfRequireDestTag = 0x00020000, + lsfRequireAuth = 0x00040000, + lsfDisallowXRP = 0x00080000, + lsfDisableMaster = 0x00100000, + lsfNoFreeze = 0x00200000, + lsfGlobalFreeze = 0x00400000, + lsfDefaultRipple = 0x00800000, + lsfDepositAuth = 0x01000000, + lsfTshCollect = 0x02000000, + lsfDisallowIncomingNFTokenOffer = 0x04000000, + lsfDisallowIncomingCheck = 0x08000000, + lsfDisallowIncomingPayChan = 0x10000000, + lsfDisallowIncomingTrustline = 0x20000000, + lsfURITokenIssuer = 0x40000000, + lsfDisallowIncomingRemit = 0x80000000, + lsfAllowTrustLineClawback = 0x00001000, +}; +enum ltOFFER { + lsfPassive = 0x00010000, + lsfSell = 0x00020000, +}; +enum ltRIPPLE_STATE { + lsfLowReserve = 0x00010000, + lsfHighReserve = 0x00020000, + lsfLowAuth = 0x00040000, + lsfHighAuth = 0x00080000, + lsfLowNoRipple = 0x00100000, + lsfHighNoRipple = 0x00200000, + lsfLowFreeze = 0x00400000, + lsfHighFreeze = 0x00800000, + lsfLowDeepFreeze = 0x02000000, + lsfHighDeepFreeze = 0x04000000, + lsfAMMNode = 0x01000000, +}; +enum ltSIGNER_LIST { + lsfOneOwnerCount = 0x00010000, +}; +enum ltDIR_NODE { + lsfNFTokenBuyOffers = 0x00000001, + lsfNFTokenSellOffers = 0x00000002, + lsfEmittedDir = 0x00000004, +}; +enum ltNFTOKEN_OFFER { + lsfSellNFToken = 0x00000001, +}; +enum ltURI_TOKEN { + lsfBurnable = 0x00000001, +}; +enum remarks { + lsfImmutable = 1, +}; +enum ltMPTOKEN_ISSUANCE { + lsfMPTLocked = 0x00000001, + lsfMPTCanLock = 0x00000002, + lsfMPTRequireAuth = 0x00000004, + lsfMPTCanEscrow = 0x00000008, + lsfMPTCanTrade = 0x00000010, + lsfMPTCanTransfer = 0x00000020, + lsfMPTCanClawback = 0x00000040, +}; +enum ltMPTOKEN { + lsfMPTAuthorized = 0x00000002, +}; +enum ltCREDENTIAL { + lsfAccepted = 0x00010000, +}; + +#endif // HOOKLSFLAGS_INCLUDED diff --git a/hook/tx_flags.h b/hook/tx_flags.h new file mode 100644 index 000000000..79ecd9be8 --- /dev/null +++ b/hook/tx_flags.h @@ -0,0 +1,117 @@ +// Generated using generate_txflags.sh +#include "ls_flags.h" +#include + +enum UniversalFlags : uint32_t { + tfFullyCanonicalSig = 0x80000000, +}; + +enum AccountSetFlags : uint32_t { + tfRequireDestTag = 0x00010000, + tfOptionalDestTag = 0x00020000, + tfRequireAuth = 0x00040000, + tfOptionalAuth = 0x00080000, + tfDisallowXRP = 0x00100000, + tfAllowXRP = 0x00200000, +}; + +enum AccountFlags : uint32_t { + asfRequireDest = 1, + asfRequireAuth = 2, + asfDisallowXRP = 3, + asfDisableMaster = 4, + asfAccountTxnID = 5, + asfNoFreeze = 6, + asfGlobalFreeze = 7, + asfDefaultRipple = 8, + asfDepositAuth = 9, + asfAuthorizedNFTokenMinter = 10, + asfTshCollect = 11, + asfDisallowIncomingNFTokenOffer = 12, + asfDisallowIncomingCheck = 13, + asfDisallowIncomingPayChan = 14, + asfDisallowIncomingTrustline = 15, + asfDisallowIncomingRemit = 16, + asfAllowTrustLineClawback = 17, +}; + +enum OfferCreateFlags : uint32_t { + tfPassive = 0x00010000, + tfImmediateOrCancel = 0x00020000, + tfFillOrKill = 0x00040000, + tfSell = 0x00080000, +}; + +enum PaymentFlags : uint32_t { + tfNoRippleDirect = 0x00010000, + tfPartialPayment = 0x00020000, + tfLimitQuality = 0x00040000, +}; + +enum TrustSetFlags : uint32_t { + tfSetfAuth = 0x00010000, + tfSetNoRipple = 0x00020000, + tfClearNoRipple = 0x00040000, + tfSetFreeze = 0x00100000, + tfClearFreeze = 0x00200000, + tfSetDeepFreeze = 0x00400000, + tfClearDeepFreeze = 0x00800000 +}; + +enum EnableAmendmentFlags : uint32_t { + tfGotMajority = 0x00010000, + tfLostMajority = 0x00020000, + tfTestSuite = 0x80000000, +}; + +enum PaymentChannelClaimFlags : uint32_t { + tfRenew = 0x00010000, + tfClose = 0x00020000, +}; + +enum NFTokenMintFlags : uint32_t { + tfBurnable = 0x00000001, + tfOnlyXRP = 0x00000002, + tfTrustLine = 0x00000004, + tfTransferable = 0x00000008, + tfMutable = 0x00000010, + tfStrongTSH = 0x00008000, +}; + +enum MPTokenIssuanceCreateFlags : uint32_t { + tfMPTCanLock = lsfMPTCanLock, + tfMPTRequireAuth = lsfMPTRequireAuth, + tfMPTCanEscrow = lsfMPTCanEscrow, + tfMPTCanTrade = lsfMPTCanTrade, + tfMPTCanTransfer = lsfMPTCanTransfer, + tfMPTCanClawback = lsfMPTCanClawback, +}; + +enum MPTokenAuthorizeFlags : uint32_t { + tfMPTUnauthorize = 0x00000001, +}; + +enum MPTokenIssuanceSetFlags : uint32_t { + tfMPTLock = 0x00000001, + tfMPTUnlock = 0x00000002, +}; + +enum NFTokenCreateOfferFlags : uint32_t { + tfSellNFToken = 0x00000001, +}; + +enum ClaimRewardFlags : uint32_t { + tfOptOut = 0x00000001, +}; + +enum CronSetFlags : uint32_t { + tfCronUnset = 0x00000001, +}; + +enum AMMClawbackFlags : uint32_t { + tfClawTwoAssets = 0x00000001, +}; + +enum BridgeModifyFlags : uint32_t { + tfClearAccountCreateAmount = 0x00010000, +}; diff --git a/include/xrpl/protocol/TxFlags.h b/include/xrpl/protocol/TxFlags.h index cb6634dae..01f807193 100644 --- a/include/xrpl/protocol/TxFlags.h +++ b/include/xrpl/protocol/TxFlags.h @@ -132,7 +132,7 @@ constexpr std::uint32_t tfTrustSetMask = tfClearFreeze | tfSetDeepFreeze | tfClearDeepFreeze); // EnableAmendment flags: -enum EnableAmendmentFlags : std::uint32_t { +enum EnableAmendmentFlags : uint32_t { tfGotMajority = 0x00010000, tfLostMajority = 0x00020000, tfTestSuite = 0x80000000,