mirror of
				https://github.com/XRPLF/rippled.git
				synced 2025-11-04 11:15:56 +00:00 
			
		
		
		
	Compare commits
	
		
			14 Commits
		
	
	
		
			aaa2210b69
			...
			a1q123456/
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					4b5ed9c219 | ||
| 
						 | 
					5dd2020902 | ||
| 
						 | 
					ae95aff7aa | ||
| 
						 | 
					4f5fb6b298 | ||
| 
						 | 
					c742a94e5f | ||
| 
						 | 
					abf240f6f3 | ||
| 
						 | 
					3f8fed9628 | ||
| 
						 | 
					e2e82e1c96 | ||
| 
						 | 
					a7a39d62d3 | ||
| 
						 | 
					b875ea9f37 | ||
| 
						 | 
					a25f2ee9dd | ||
| 
						 | 
					4f295d4856 | ||
| 
						 | 
					2e5f69f8f8 | ||
| 
						 | 
					02da6b2508 | 
@@ -53,11 +53,11 @@ class SeqProxy;
 | 
			
		||||
namespace keylet {
 | 
			
		||||
 | 
			
		||||
/** AccountID root */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltACCOUNT_ROOT>
 | 
			
		||||
account(AccountID const& id) noexcept;
 | 
			
		||||
 | 
			
		||||
/** The index of the amendment table */
 | 
			
		||||
Keylet const&
 | 
			
		||||
TypedKeylet<ltAMENDMENTS> const&
 | 
			
		||||
amendments() noexcept;
 | 
			
		||||
 | 
			
		||||
/** Any item that can be in an owner dir. */
 | 
			
		||||
@@ -69,7 +69,7 @@ child(uint256 const& key) noexcept;
 | 
			
		||||
    The "short" skip list is a node (at a fixed index) that holds the hashes
 | 
			
		||||
    of ledgers since the last flag ledger. It will contain, at most, 256 hashes.
 | 
			
		||||
*/
 | 
			
		||||
Keylet const&
 | 
			
		||||
TypedKeylet<ltLEDGER_HASHES> const&
 | 
			
		||||
skip() noexcept;
 | 
			
		||||
 | 
			
		||||
/** The index of the long skip for a particular ledger range.
 | 
			
		||||
@@ -82,15 +82,15 @@ skip() noexcept;
 | 
			
		||||
    and uses it to get the hash of the flag ledger whose short skip list will
 | 
			
		||||
    contain the hash of the requested ledger.
 | 
			
		||||
*/
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltLEDGER_HASHES>
 | 
			
		||||
skip(LedgerIndex ledger) noexcept;
 | 
			
		||||
 | 
			
		||||
/** The (fixed) index of the object containing the ledger fees. */
 | 
			
		||||
Keylet const&
 | 
			
		||||
TypedKeylet<ltFEE_SETTINGS> const&
 | 
			
		||||
fees() noexcept;
 | 
			
		||||
 | 
			
		||||
/** The (fixed) index of the object containing the ledger negativeUNL. */
 | 
			
		||||
Keylet const&
 | 
			
		||||
TypedKeylet<ltNEGATIVE_UNL> const&
 | 
			
		||||
negativeUNL() noexcept;
 | 
			
		||||
 | 
			
		||||
/** The beginning of an order book */
 | 
			
		||||
@@ -98,7 +98,7 @@ struct book_t
 | 
			
		||||
{
 | 
			
		||||
    explicit book_t() = default;
 | 
			
		||||
 | 
			
		||||
    Keylet
 | 
			
		||||
    TypedKeylet<ltDIR_NODE>
 | 
			
		||||
    operator()(Book const& b) const;
 | 
			
		||||
};
 | 
			
		||||
static book_t const book{};
 | 
			
		||||
@@ -111,13 +111,13 @@ static book_t const book{};
 | 
			
		||||
    between them.
 | 
			
		||||
*/
 | 
			
		||||
/** @{ */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltRIPPLE_STATE>
 | 
			
		||||
line(
 | 
			
		||||
    AccountID const& id0,
 | 
			
		||||
    AccountID const& id1,
 | 
			
		||||
    Currency const& currency) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltRIPPLE_STATE>
 | 
			
		||||
line(AccountID const& id, Issue const& issue) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return line(id, issue.account, issue.currency);
 | 
			
		||||
@@ -126,27 +126,27 @@ line(AccountID const& id, Issue const& issue) noexcept
 | 
			
		||||
 | 
			
		||||
/** An offer from an account */
 | 
			
		||||
/** @{ */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltOFFER>
 | 
			
		||||
offer(AccountID const& id, std::uint32_t seq) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltOFFER>
 | 
			
		||||
offer(uint256 const& key) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltOFFER, key};
 | 
			
		||||
    return {key};
 | 
			
		||||
}
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/** The initial directory page for a specific quality */
 | 
			
		||||
Keylet
 | 
			
		||||
quality(Keylet const& k, std::uint64_t q) noexcept;
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
quality(TypedKeylet<ltDIR_NODE> const& k, std::uint64_t q) noexcept;
 | 
			
		||||
 | 
			
		||||
/** The directory for the next lower quality */
 | 
			
		||||
struct next_t
 | 
			
		||||
{
 | 
			
		||||
    explicit next_t() = default;
 | 
			
		||||
 | 
			
		||||
    Keylet
 | 
			
		||||
    operator()(Keylet const& k) const;
 | 
			
		||||
    TypedKeylet<ltDIR_NODE>
 | 
			
		||||
    operator()(TypedKeylet<ltDIR_NODE> const& k) const;
 | 
			
		||||
};
 | 
			
		||||
static next_t const next{};
 | 
			
		||||
 | 
			
		||||
@@ -155,50 +155,50 @@ struct ticket_t
 | 
			
		||||
{
 | 
			
		||||
    explicit ticket_t() = default;
 | 
			
		||||
 | 
			
		||||
    Keylet
 | 
			
		||||
    TypedKeylet<ltTICKET>
 | 
			
		||||
    operator()(AccountID const& id, std::uint32_t ticketSeq) const;
 | 
			
		||||
 | 
			
		||||
    Keylet
 | 
			
		||||
    TypedKeylet<ltTICKET>
 | 
			
		||||
    operator()(AccountID const& id, SeqProxy ticketSeq) const;
 | 
			
		||||
 | 
			
		||||
    Keylet
 | 
			
		||||
    TypedKeylet<ltTICKET>
 | 
			
		||||
    operator()(uint256 const& key) const
 | 
			
		||||
    {
 | 
			
		||||
        return {ltTICKET, key};
 | 
			
		||||
        return {key};
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
static ticket_t const ticket{};
 | 
			
		||||
 | 
			
		||||
/** A SignerList */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltSIGNER_LIST>
 | 
			
		||||
signers(AccountID const& account) noexcept;
 | 
			
		||||
 | 
			
		||||
/** A Check */
 | 
			
		||||
/** @{ */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltCHECK>
 | 
			
		||||
check(AccountID const& id, std::uint32_t seq) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltCHECK>
 | 
			
		||||
check(uint256 const& key) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltCHECK, key};
 | 
			
		||||
    return {key};
 | 
			
		||||
}
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/** A DepositPreauth */
 | 
			
		||||
/** @{ */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDEPOSIT_PREAUTH>
 | 
			
		||||
depositPreauth(AccountID const& owner, AccountID const& preauthorized) noexcept;
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDEPOSIT_PREAUTH>
 | 
			
		||||
depositPreauth(
 | 
			
		||||
    AccountID const& owner,
 | 
			
		||||
    std::set<std::pair<AccountID, Slice>> const& authCreds) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltDEPOSIT_PREAUTH>
 | 
			
		||||
depositPreauth(uint256 const& key) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltDEPOSIT_PREAUTH, key};
 | 
			
		||||
    return {key};
 | 
			
		||||
}
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
@@ -209,15 +209,15 @@ Keylet
 | 
			
		||||
unchecked(uint256 const& key) noexcept;
 | 
			
		||||
 | 
			
		||||
/** The root page of an account's directory */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
ownerDir(AccountID const& id) noexcept;
 | 
			
		||||
 | 
			
		||||
/** A page in a directory */
 | 
			
		||||
/** @{ */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
page(uint256 const& root, std::uint64_t index = 0) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltDIR_NODE>
 | 
			
		||||
page(Keylet const& root, std::uint64_t index = 0) noexcept
 | 
			
		||||
{
 | 
			
		||||
    XRPL_ASSERT(
 | 
			
		||||
@@ -227,11 +227,11 @@ page(Keylet const& root, std::uint64_t index = 0) noexcept
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/** An escrow entry */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltESCROW>
 | 
			
		||||
escrow(AccountID const& src, std::uint32_t seq) noexcept;
 | 
			
		||||
 | 
			
		||||
/** A PaymentChannel */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltPAYCHAN>
 | 
			
		||||
payChan(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexcept;
 | 
			
		||||
 | 
			
		||||
/** NFT page keylets
 | 
			
		||||
@@ -243,110 +243,110 @@ payChan(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexcept;
 | 
			
		||||
 */
 | 
			
		||||
/** @{ */
 | 
			
		||||
/** A keylet for the owner's first possible NFT page. */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltNFTOKEN_PAGE>
 | 
			
		||||
nftpage_min(AccountID const& owner);
 | 
			
		||||
 | 
			
		||||
/** A keylet for the owner's last possible NFT page. */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltNFTOKEN_PAGE>
 | 
			
		||||
nftpage_max(AccountID const& owner);
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
nftpage(Keylet const& k, uint256 const& token);
 | 
			
		||||
TypedKeylet<ltNFTOKEN_PAGE>
 | 
			
		||||
nftpage(TypedKeylet<ltNFTOKEN_PAGE> const& k, uint256 const& token);
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/** An offer from an account to buy or sell an NFT */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltNFTOKEN_OFFER>
 | 
			
		||||
nftoffer(AccountID const& owner, std::uint32_t seq);
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltNFTOKEN_OFFER>
 | 
			
		||||
nftoffer(uint256 const& offer)
 | 
			
		||||
{
 | 
			
		||||
    return {ltNFTOKEN_OFFER, offer};
 | 
			
		||||
    return {offer};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** The directory of buy offers for the specified NFT */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
nft_buys(uint256 const& id) noexcept;
 | 
			
		||||
 | 
			
		||||
/** The directory of sell offers for the specified NFT */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
nft_sells(uint256 const& id) noexcept;
 | 
			
		||||
 | 
			
		||||
/** AMM entry */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltAMM>
 | 
			
		||||
amm(Asset const& issue1, Asset const& issue2) noexcept;
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltAMM>
 | 
			
		||||
amm(uint256 const& amm) noexcept;
 | 
			
		||||
 | 
			
		||||
/** A keylet for Delegate object */
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDELEGATE>
 | 
			
		||||
delegate(AccountID const& account, AccountID const& authorizedAccount) noexcept;
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltBRIDGE>
 | 
			
		||||
bridge(STXChainBridge const& bridge, STXChainBridge::ChainType chainType);
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltXCHAIN_OWNED_CLAIM_ID>
 | 
			
		||||
xChainClaimID(STXChainBridge const& bridge, std::uint64_t seq);
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltXCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID>
 | 
			
		||||
xChainCreateAccountClaimID(STXChainBridge const& bridge, std::uint64_t seq);
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDID>
 | 
			
		||||
did(AccountID const& account) noexcept;
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltORACLE>
 | 
			
		||||
oracle(AccountID const& account, std::uint32_t const& documentID) noexcept;
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltCREDENTIAL>
 | 
			
		||||
credential(
 | 
			
		||||
    AccountID const& subject,
 | 
			
		||||
    AccountID const& issuer,
 | 
			
		||||
    Slice const& credType) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltCREDENTIAL>
 | 
			
		||||
credential(uint256 const& key) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltCREDENTIAL, key};
 | 
			
		||||
    return {key};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltMPTOKEN_ISSUANCE>
 | 
			
		||||
mptIssuance(std::uint32_t seq, AccountID const& issuer) noexcept;
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltMPTOKEN_ISSUANCE>
 | 
			
		||||
mptIssuance(MPTID const& issuanceID) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltMPTOKEN_ISSUANCE>
 | 
			
		||||
mptIssuance(uint256 const& issuanceKey)
 | 
			
		||||
{
 | 
			
		||||
    return {ltMPTOKEN_ISSUANCE, issuanceKey};
 | 
			
		||||
    return {issuanceKey};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltMPTOKEN>
 | 
			
		||||
mptoken(MPTID const& issuanceID, AccountID const& holder) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltMPTOKEN>
 | 
			
		||||
mptoken(uint256 const& mptokenKey)
 | 
			
		||||
{
 | 
			
		||||
    return {ltMPTOKEN, mptokenKey};
 | 
			
		||||
    return {mptokenKey};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltMPTOKEN>
 | 
			
		||||
mptoken(uint256 const& issuanceKey, AccountID const& holder) noexcept;
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltVAULT>
 | 
			
		||||
vault(AccountID const& owner, std::uint32_t seq) noexcept;
 | 
			
		||||
 | 
			
		||||
inline Keylet
 | 
			
		||||
inline TypedKeylet<ltVAULT>
 | 
			
		||||
vault(uint256 const& vaultKey)
 | 
			
		||||
{
 | 
			
		||||
    return {ltVAULT, vaultKey};
 | 
			
		||||
    return {vaultKey};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltPERMISSIONED_DOMAIN>
 | 
			
		||||
permissionedDomain(AccountID const& account, std::uint32_t seq) noexcept;
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltPERMISSIONED_DOMAIN>
 | 
			
		||||
permissionedDomain(uint256 const& domainID) noexcept;
 | 
			
		||||
}  // namespace keylet
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,22 @@ struct Keylet
 | 
			
		||||
    check(STLedgerEntry const&) const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <LedgerEntryType Type>
 | 
			
		||||
struct TypedKeylet : Keylet
 | 
			
		||||
{
 | 
			
		||||
    static constexpr LedgerEntryType LedgerType = Type;
 | 
			
		||||
 | 
			
		||||
    TypedKeylet(uint256 const& key_) : Keylet(Type, key_)
 | 
			
		||||
    {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Keylet
 | 
			
		||||
    untyped() const
 | 
			
		||||
    {
 | 
			
		||||
        return Keylet(LedgerType, key);
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace ripple
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -55,13 +55,33 @@ enum LedgerEntryType : std::uint16_t
 | 
			
		||||
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRY")
 | 
			
		||||
#undef LEDGER_ENTRY
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRY_FIELD")
 | 
			
		||||
#undef LEDGER_ENTRY_FIELD
 | 
			
		||||
#pragma push_macro("DEFINE_LEDGER_ENTRY_FIELDS")
 | 
			
		||||
#undef DEFINE_LEDGER_ENTRY_FIELDS
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRIES_BEGIN")
 | 
			
		||||
#undef LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRIES_END")
 | 
			
		||||
#undef LEDGER_ENTRIES_END
 | 
			
		||||
 | 
			
		||||
#define LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#define LEDGER_ENTRIES_END
 | 
			
		||||
#define DEFINE_LEDGER_ENTRY_FIELDS(...) ({__VA_ARGS__})
 | 
			
		||||
#define LEDGER_ENTRY_FIELD(...) {__VA_ARGS__},
 | 
			
		||||
#define LEDGER_ENTRY(tag, value, name, rpcName, fields) tag = value,
 | 
			
		||||
 | 
			
		||||
#include <xrpl/protocol/detail/ledger_entries.macro>
 | 
			
		||||
 | 
			
		||||
#undef LEDGER_ENTRY
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY")
 | 
			
		||||
#undef LEDGER_ENTRY_FIELD
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY_FIELD")
 | 
			
		||||
#undef DEFINE_LEDGER_ENTRY_FIELDS
 | 
			
		||||
#pragma pop_macro("DEFINE_LEDGER_ENTRY_FIELDS")
 | 
			
		||||
#undef LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRIES_BEGIN")
 | 
			
		||||
#undef LEDGER_ENTRIES_END
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRIES_END")
 | 
			
		||||
 | 
			
		||||
    //---------------------------------------------------------------------------
 | 
			
		||||
    /** A special type, matching any ledger entry type.
 | 
			
		||||
 
 | 
			
		||||
@@ -368,11 +368,15 @@ using SF_XCHAIN_BRIDGE = TypedField<STXChainBridge>;
 | 
			
		||||
#undef UNTYPED_SFIELD
 | 
			
		||||
#pragma push_macro("TYPED_SFIELD")
 | 
			
		||||
#undef TYPED_SFIELD
 | 
			
		||||
#pragma push_macro("ARRAY_SFIELD")
 | 
			
		||||
#undef ARRAY_SFIELD
 | 
			
		||||
 | 
			
		||||
#define UNTYPED_SFIELD(sfName, stiSuffix, fieldValue, ...) \
 | 
			
		||||
    extern SField const sfName;
 | 
			
		||||
#define TYPED_SFIELD(sfName, stiSuffix, fieldValue, ...) \
 | 
			
		||||
    extern SF_##stiSuffix const sfName;
 | 
			
		||||
#define ARRAY_SFIELD(sfName, sfItemName, stiSuffix, fieldValue, ...) \
 | 
			
		||||
    UNTYPED_SFIELD(sfName, stiSuffix, fieldValue, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
extern SField const sfInvalid;
 | 
			
		||||
extern SField const sfGeneric;
 | 
			
		||||
@@ -383,6 +387,8 @@ extern SField const sfGeneric;
 | 
			
		||||
#pragma pop_macro("TYPED_SFIELD")
 | 
			
		||||
#undef UNTYPED_SFIELD
 | 
			
		||||
#pragma pop_macro("UNTYPED_SFIELD")
 | 
			
		||||
#undef ARRAY_SFIELD
 | 
			
		||||
#pragma pop_macro("ARRAY_SFIELD")
 | 
			
		||||
 | 
			
		||||
}  // namespace ripple
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1048
									
								
								include/xrpl/protocol/TypedLedgerEntries.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1048
									
								
								include/xrpl/protocol/TypedLedgerEntries.h
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										175
									
								
								include/xrpl/protocol/detail/inner_objects.macro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								include/xrpl/protocol/detail/inner_objects.macro
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,175 @@
 | 
			
		||||
 | 
			
		||||
#if !defined(INNER_OBJECT)
 | 
			
		||||
#error "undefined macro: INNER_OBJECT"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(FIELDS)
 | 
			
		||||
#error "undefined macro: FIELDS"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(FIELD)
 | 
			
		||||
#error "undefined macro: FIELD"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(INNER_OBJECT_BEGIN)
 | 
			
		||||
#error "undefined macro: INNER_OBJECT_BEGIN"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(INNER_OBJECT_END)
 | 
			
		||||
#error "undefined macro: INNER_OBJECT_END"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT_BEGIN
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfSignerEntry,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfSignerEntry, sfAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfSignerEntry, sfSignerWeight, soeREQUIRED)
 | 
			
		||||
        FIELD(sfSignerEntry, sfWalletLocator, soeOPTIONAL)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfSigner,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfSigner, sfAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfSigner, sfSigningPubKey, soeREQUIRED)
 | 
			
		||||
        FIELD(sfSigner, sfTxnSignature, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfMajority,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfMajority, sfAmendment, soeREQUIRED)
 | 
			
		||||
        FIELD(sfMajority, sfCloseTime, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfDisabledValidator,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfDisabledValidator, sfPublicKey, soeREQUIRED)
 | 
			
		||||
        FIELD(sfDisabledValidator, sfFirstLedgerSequence, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfNFToken,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfNFToken, sfNFTokenID, soeREQUIRED)
 | 
			
		||||
        FIELD(sfNFToken, sfURI, soeOPTIONAL)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfVoteEntry,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfVoteEntry, sfAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfVoteEntry, sfTradingFee, soeDEFAULT)
 | 
			
		||||
        FIELD(sfVoteEntry, sfVoteWeight, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfAuctionSlot,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfAuctionSlot, sfAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfAuctionSlot, sfExpiration, soeREQUIRED)
 | 
			
		||||
        FIELD(sfAuctionSlot, sfDiscountedFee, soeDEFAULT)
 | 
			
		||||
        FIELD(sfAuctionSlot, sfPrice, soeREQUIRED)
 | 
			
		||||
        FIELD(sfAuctionSlot, sfAuthAccounts, soeOPTIONAL)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfXChainClaimAttestationCollectionElement,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfAttestationSignerAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfPublicKey, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfSignature, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfAmount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfAttestationRewardAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfWasLockingChainSend, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfXChainClaimID, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimAttestationCollectionElement, sfDestination, soeOPTIONAL)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfXChainCreateAccountAttestationCollectionElement,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfAttestationSignerAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfPublicKey, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfSignature, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfAmount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfAttestationRewardAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfWasLockingChainSend, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfXChainAccountCreateCount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfDestination, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountAttestationCollectionElement, sfSignatureReward, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfXChainClaimProofSig,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfXChainClaimProofSig, sfAttestationSignerAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimProofSig, sfPublicKey, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimProofSig, sfAmount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimProofSig, sfAttestationRewardAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimProofSig, sfWasLockingChainSend, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainClaimProofSig, sfDestination, soeOPTIONAL)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfXChainCreateAccountProofSig,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfXChainCreateAccountProofSig, sfAttestationSignerAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountProofSig, sfPublicKey, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountProofSig, sfAmount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountProofSig, sfSignatureReward, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountProofSig, sfAttestationRewardAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountProofSig, sfWasLockingChainSend, soeREQUIRED)
 | 
			
		||||
        FIELD(sfXChainCreateAccountProofSig, sfDestination, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfAuthAccount,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfAuthAccount, sfAccount, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfPriceData,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfPriceData, sfBaseAsset, soeREQUIRED)
 | 
			
		||||
        FIELD(sfPriceData, sfQuoteAsset, soeREQUIRED)
 | 
			
		||||
        FIELD(sfPriceData, sfAssetPrice, soeOPTIONAL)
 | 
			
		||||
        FIELD(sfPriceData, sfScale, soeDEFAULT)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfCredential,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfCredential, sfIssuer, soeREQUIRED)
 | 
			
		||||
        FIELD(sfCredential, sfCredentialType, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfPermission,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfPermission, sfPermissionValue, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfBatchSigner,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfBatchSigner, sfAccount, soeREQUIRED)
 | 
			
		||||
        FIELD(sfBatchSigner, sfSigningPubKey, soeOPTIONAL)
 | 
			
		||||
        FIELD(sfBatchSigner, sfTxnSignature, soeOPTIONAL)
 | 
			
		||||
        FIELD(sfBatchSigner, sfSigners, soeOPTIONAL)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT(sfBook,
 | 
			
		||||
    FIELDS(
 | 
			
		||||
        FIELD(sfBook, sfBookDirectory, soeREQUIRED)
 | 
			
		||||
        FIELD(sfBook, sfBookNode, soeREQUIRED)
 | 
			
		||||
    )
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INNER_OBJECT_END
 | 
			
		||||
@@ -21,6 +21,22 @@
 | 
			
		||||
#error "undefined macro: LEDGER_ENTRY"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(LEDGER_ENTRY_FIELD)
 | 
			
		||||
#error "undefined macro: LEDGER_ENTRY_FIELD"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(DEFINE_LEDGER_ENTRY_FIELDS)
 | 
			
		||||
#error "undefined macro: DEFINE_LEDGER_ENTRY_FIELDS"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(LEDGER_ENTRIES_BEGIN)
 | 
			
		||||
#error "undefined macro: LEDGER_ENTRIES_BEGIN"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(LEDGER_ENTRIES_END)
 | 
			
		||||
#error "undefined macro: LEDGER_ENTRIES_END"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef LEDGER_ENTRY_DUPLICATE
 | 
			
		||||
// The EXPAND macro is needed for Windows
 | 
			
		||||
// https://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly
 | 
			
		||||
@@ -32,6 +48,8 @@
 | 
			
		||||
#define LEDGER_ENTRY_DUPLICATE(...) EXPAND(LEDGER_ENTRY(__VA_ARGS__))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
LEDGER_ENTRIES_BEGIN
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * These objects are listed in order of increasing ledger type ID.
 | 
			
		||||
 * There are many gaps between these IDs.
 | 
			
		||||
@@ -42,50 +60,50 @@
 | 
			
		||||
 | 
			
		||||
    \sa keylet::nftoffer
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltNFTOKEN_OFFER, 0x0037, NFTokenOffer, nft_offer, ({
 | 
			
		||||
    {sfOwner,                soeREQUIRED},
 | 
			
		||||
    {sfNFTokenID,            soeREQUIRED},
 | 
			
		||||
    {sfAmount,               soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfNFTokenOfferNode,     soeREQUIRED},
 | 
			
		||||
    {sfDestination,          soeOPTIONAL},
 | 
			
		||||
    {sfExpiration,           soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltNFTOKEN_OFFER, 0x0037, NFTokenOffer, nft_offer, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwner, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfNFTokenID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAmount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfNFTokenOfferNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestination, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfExpiration, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which describes a check.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::check
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltCHECK, 0x0043, Check, check, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfDestination,          soeREQUIRED},
 | 
			
		||||
    {sfSendMax,              soeREQUIRED},
 | 
			
		||||
    {sfSequence,             soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfDestinationNode,      soeREQUIRED},
 | 
			
		||||
    {sfExpiration,           soeOPTIONAL},
 | 
			
		||||
    {sfInvoiceID,            soeOPTIONAL},
 | 
			
		||||
    {sfSourceTag,            soeOPTIONAL},
 | 
			
		||||
    {sfDestinationTag,       soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltCHECK, 0x0043, Check, check, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestination, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSendMax, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSequence, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestinationNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfExpiration, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfInvoiceID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSourceTag, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestinationTag, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** The ledger object which tracks the DID.
 | 
			
		||||
 | 
			
		||||
   \sa keylet::did
 | 
			
		||||
*/
 | 
			
		||||
LEDGER_ENTRY(ltDID, 0x0049, DID, did, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfDIDDocument,          soeOPTIONAL},
 | 
			
		||||
    {sfURI,                  soeOPTIONAL},
 | 
			
		||||
    {sfData,                 soeOPTIONAL},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltDID, 0x0049, DID, did, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDIDDocument, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfURI, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfData, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** The ledger object which tracks the current negative UNL state.
 | 
			
		||||
 | 
			
		||||
@@ -93,25 +111,25 @@ LEDGER_ENTRY(ltDID, 0x0049, DID, did, ({
 | 
			
		||||
 | 
			
		||||
    \sa keylet::negativeUNL
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltNEGATIVE_UNL, 0x004e, NegativeUNL, nunl, ({
 | 
			
		||||
    {sfDisabledValidators,   soeOPTIONAL},
 | 
			
		||||
    {sfValidatorToDisable,   soeOPTIONAL},
 | 
			
		||||
    {sfValidatorToReEnable,  soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnID,        soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltNEGATIVE_UNL, 0x004e, NegativeUNL, nunl, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDisabledValidators, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfValidatorToDisable, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfValidatorToReEnable, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which contains a list of NFTs
 | 
			
		||||
 | 
			
		||||
    \sa keylet::nftpage_min, keylet::nftpage_max, keylet::nftpage
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltNFTOKEN_PAGE, 0x0050, NFTokenPage, nft_page, ({
 | 
			
		||||
    {sfPreviousPageMin,      soeOPTIONAL},
 | 
			
		||||
    {sfNextPageMin,          soeOPTIONAL},
 | 
			
		||||
    {sfNFTokens,             soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltNFTOKEN_PAGE, 0x0050, NFTokenPage, nft_page, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousPageMin, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfNextPageMin, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfNFTokens, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which contains a signer list for an account.
 | 
			
		||||
 | 
			
		||||
@@ -119,77 +137,77 @@ LEDGER_ENTRY(ltNFTOKEN_PAGE, 0x0050, NFTokenPage, nft_page, ({
 | 
			
		||||
 */
 | 
			
		||||
// All fields are soeREQUIRED because there is always a SignerEntries.
 | 
			
		||||
// If there are no SignerEntries the node is deleted.
 | 
			
		||||
LEDGER_ENTRY(ltSIGNER_LIST, 0x0053, SignerList, signer_list, ({
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfSignerQuorum,         soeREQUIRED},
 | 
			
		||||
    {sfSignerEntries,        soeREQUIRED},
 | 
			
		||||
    {sfSignerListID,         soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltSIGNER_LIST, 0x0053, SignerList, signer_list, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSignerQuorum, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSignerEntries, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSignerListID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which describes a ticket.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::ticket
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltTICKET, 0x0054, Ticket, ticket, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfTicketSequence,       soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltTICKET, 0x0054, Ticket, ticket, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTicketSequence, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which describes an account.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::account
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltACCOUNT_ROOT, 0x0061, AccountRoot, account, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfSequence,             soeREQUIRED},
 | 
			
		||||
    {sfBalance,              soeREQUIRED},
 | 
			
		||||
    {sfOwnerCount,           soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
    {sfAccountTxnID,         soeOPTIONAL},
 | 
			
		||||
    {sfRegularKey,           soeOPTIONAL},
 | 
			
		||||
    {sfEmailHash,            soeOPTIONAL},
 | 
			
		||||
    {sfWalletLocator,        soeOPTIONAL},
 | 
			
		||||
    {sfWalletSize,           soeOPTIONAL},
 | 
			
		||||
    {sfMessageKey,           soeOPTIONAL},
 | 
			
		||||
    {sfTransferRate,         soeOPTIONAL},
 | 
			
		||||
    {sfDomain,               soeOPTIONAL},
 | 
			
		||||
    {sfTickSize,             soeOPTIONAL},
 | 
			
		||||
    {sfTicketCount,          soeOPTIONAL},
 | 
			
		||||
    {sfNFTokenMinter,        soeOPTIONAL},
 | 
			
		||||
    {sfMintedNFTokens,       soeDEFAULT},
 | 
			
		||||
    {sfBurnedNFTokens,       soeDEFAULT},
 | 
			
		||||
    {sfFirstNFTokenSequence, soeOPTIONAL},
 | 
			
		||||
    {sfAMMID,                soeOPTIONAL}, // pseudo-account designator
 | 
			
		||||
    {sfVaultID,              soeOPTIONAL}, // pseudo-account designator
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltACCOUNT_ROOT, 0x0061, AccountRoot, account, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSequence, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfBalance, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerCount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccountTxnID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfRegularKey, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfEmailHash, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfWalletLocator, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfWalletSize, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfMessageKey, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTransferRate, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDomain, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTickSize, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTicketCount, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfNFTokenMinter, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfMintedNFTokens, soeDEFAULT)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfBurnedNFTokens, soeDEFAULT)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfFirstNFTokenSequence, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAMMID, soeOPTIONAL) // pseudo-account designator
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfVaultID, soeOPTIONAL) // pseudo-account designator
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which contains a list of object identifiers.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::page, keylet::quality, keylet::book, keylet::next and
 | 
			
		||||
        keylet::ownerDir
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltDIR_NODE, 0x0064, DirectoryNode, directory, ({
 | 
			
		||||
    {sfOwner,                soeOPTIONAL},  // for owner directories
 | 
			
		||||
    {sfTakerPaysCurrency,    soeOPTIONAL},  // order book directories
 | 
			
		||||
    {sfTakerPaysIssuer,      soeOPTIONAL},  // order book directories
 | 
			
		||||
    {sfTakerGetsCurrency,    soeOPTIONAL},  // order book directories
 | 
			
		||||
    {sfTakerGetsIssuer,      soeOPTIONAL},  // order book directories
 | 
			
		||||
    {sfExchangeRate,         soeOPTIONAL},  // order book directories
 | 
			
		||||
    {sfIndexes,              soeREQUIRED},
 | 
			
		||||
    {sfRootIndex,            soeREQUIRED},
 | 
			
		||||
    {sfIndexNext,            soeOPTIONAL},
 | 
			
		||||
    {sfIndexPrevious,        soeOPTIONAL},
 | 
			
		||||
    {sfNFTokenID,            soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnID,        soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeOPTIONAL},
 | 
			
		||||
    {sfDomainID,             soeOPTIONAL}
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltDIR_NODE, 0x0064, DirectoryNode, directory, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwner, soeOPTIONAL)  // for owner directories
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTakerPaysCurrency, soeOPTIONAL)  // order book directories
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTakerPaysIssuer, soeOPTIONAL)  // order book directories
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTakerGetsCurrency, soeOPTIONAL)  // order book directories
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTakerGetsIssuer, soeOPTIONAL)  // order book directories
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfExchangeRate, soeOPTIONAL)  // order book directories
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfIndexes, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfRootIndex, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfIndexNext, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfIndexPrevious, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfNFTokenID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDomainID, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** The ledger object which lists details about amendments on the network.
 | 
			
		||||
 | 
			
		||||
@@ -197,12 +215,12 @@ LEDGER_ENTRY(ltDIR_NODE, 0x0064, DirectoryNode, directory, ({
 | 
			
		||||
 | 
			
		||||
    \sa keylet::amendments
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltAMENDMENTS, 0x0066, Amendments, amendments, ({
 | 
			
		||||
    {sfAmendments,           soeOPTIONAL},  // Enabled
 | 
			
		||||
    {sfMajorities,           soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnID,        soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltAMENDMENTS, 0x0066, Amendments, amendments, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAmendments, soeOPTIONAL)  // Enabled
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfMajorities, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object that contains a list of ledger hashes.
 | 
			
		||||
 | 
			
		||||
@@ -212,76 +230,76 @@ LEDGER_ENTRY(ltAMENDMENTS, 0x0066, Amendments, amendments, ({
 | 
			
		||||
 | 
			
		||||
    \sa keylet::skip
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltLEDGER_HASHES, 0x0068, LedgerHashes, hashes, ({
 | 
			
		||||
    {sfFirstLedgerSequence,  soeOPTIONAL},
 | 
			
		||||
    {sfLastLedgerSequence,   soeOPTIONAL},
 | 
			
		||||
    {sfHashes,               soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltLEDGER_HASHES, 0x0068, LedgerHashes, hashes, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfFirstLedgerSequence, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLastLedgerSequence, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfHashes, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** The ledger object which lists details about sidechains.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::bridge
 | 
			
		||||
*/
 | 
			
		||||
LEDGER_ENTRY(ltBRIDGE, 0x0069, Bridge, bridge, ({
 | 
			
		||||
    {sfAccount,                  soeREQUIRED},
 | 
			
		||||
    {sfSignatureReward,          soeREQUIRED},
 | 
			
		||||
    {sfMinAccountCreateAmount,   soeOPTIONAL},
 | 
			
		||||
    {sfXChainBridge,             soeREQUIRED},
 | 
			
		||||
    {sfXChainClaimID,            soeREQUIRED},
 | 
			
		||||
    {sfXChainAccountCreateCount, soeREQUIRED},
 | 
			
		||||
    {sfXChainAccountClaimCount,  soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,                soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,        soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltBRIDGE, 0x0069, Bridge, bridge, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSignatureReward, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfMinAccountCreateAmount, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainBridge, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainClaimID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainAccountCreateCount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainAccountClaimCount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which describes an offer on the DEX.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::offer
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltOFFER, 0x006f, Offer, offer, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfSequence,             soeREQUIRED},
 | 
			
		||||
    {sfTakerPays,            soeREQUIRED},
 | 
			
		||||
    {sfTakerGets,            soeREQUIRED},
 | 
			
		||||
    {sfBookDirectory,        soeREQUIRED},
 | 
			
		||||
    {sfBookNode,             soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
    {sfExpiration,           soeOPTIONAL},
 | 
			
		||||
    {sfDomainID,             soeOPTIONAL},
 | 
			
		||||
    {sfAdditionalBooks,      soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltOFFER, 0x006f, Offer, offer, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSequence, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTakerPays, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTakerGets, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfBookDirectory, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfBookNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfExpiration, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDomainID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAdditionalBooks, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which describes a deposit preauthorization.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::depositPreauth
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY_DUPLICATE(ltDEPOSIT_PREAUTH, 0x0070, DepositPreauth, deposit_preauth, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfAuthorize,            soeOPTIONAL},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
    {sfAuthorizeCredentials, soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY_DUPLICATE(ltDEPOSIT_PREAUTH, 0x0070, DepositPreauth, deposit_preauth, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAuthorize, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAuthorizeCredentials, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A claim id for a cross chain transaction.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::xChainClaimID
 | 
			
		||||
*/
 | 
			
		||||
LEDGER_ENTRY(ltXCHAIN_OWNED_CLAIM_ID, 0x0071, XChainOwnedClaimID, xchain_owned_claim_id, ({
 | 
			
		||||
    {sfAccount,                 soeREQUIRED},
 | 
			
		||||
    {sfXChainBridge,            soeREQUIRED},
 | 
			
		||||
    {sfXChainClaimID,           soeREQUIRED},
 | 
			
		||||
    {sfOtherChainSource,        soeREQUIRED},
 | 
			
		||||
    {sfXChainClaimAttestations, soeREQUIRED},
 | 
			
		||||
    {sfSignatureReward,         soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,               soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,           soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,       soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltXCHAIN_OWNED_CLAIM_ID, 0x0071, XChainOwnedClaimID, xchain_owned_claim_id, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainBridge, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainClaimID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOtherChainSource, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainClaimAttestations, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSignatureReward, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which describes a bidirectional trust line.
 | 
			
		||||
 | 
			
		||||
@@ -289,19 +307,19 @@ LEDGER_ENTRY(ltXCHAIN_OWNED_CLAIM_ID, 0x0071, XChainOwnedClaimID, xchain_owned_c
 | 
			
		||||
 | 
			
		||||
    \sa keylet::line
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltRIPPLE_STATE, 0x0072, RippleState, state, ({
 | 
			
		||||
    {sfBalance,              soeREQUIRED},
 | 
			
		||||
    {sfLowLimit,             soeREQUIRED},
 | 
			
		||||
    {sfHighLimit,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
    {sfLowNode,              soeOPTIONAL},
 | 
			
		||||
    {sfLowQualityIn,         soeOPTIONAL},
 | 
			
		||||
    {sfLowQualityOut,        soeOPTIONAL},
 | 
			
		||||
    {sfHighNode,             soeOPTIONAL},
 | 
			
		||||
    {sfHighQualityIn,        soeOPTIONAL},
 | 
			
		||||
    {sfHighQualityOut,       soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltRIPPLE_STATE, 0x0072, RippleState, state, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfBalance, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLowLimit, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfHighLimit, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLowNode, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLowQualityIn, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLowQualityOut, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfHighNode, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfHighQualityIn, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfHighQualityOut, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** The ledger object which lists the network's fee settings.
 | 
			
		||||
 | 
			
		||||
@@ -309,201 +327,202 @@ LEDGER_ENTRY(ltRIPPLE_STATE, 0x0072, RippleState, state, ({
 | 
			
		||||
 | 
			
		||||
    \sa keylet::fees
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, ({
 | 
			
		||||
LEDGER_ENTRY(ltFEE_SETTINGS, 0x0073, FeeSettings, fee, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    // Old version uses raw numbers
 | 
			
		||||
    {sfBaseFee,                soeOPTIONAL},
 | 
			
		||||
    {sfReferenceFeeUnits,      soeOPTIONAL},
 | 
			
		||||
    {sfReserveBase,            soeOPTIONAL},
 | 
			
		||||
    {sfReserveIncrement,       soeOPTIONAL},
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfBaseFee, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfReferenceFeeUnits, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfReserveBase, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfReserveIncrement, soeOPTIONAL)
 | 
			
		||||
    // New version uses Amounts
 | 
			
		||||
    {sfBaseFeeDrops,           soeOPTIONAL},
 | 
			
		||||
    {sfReserveBaseDrops,       soeOPTIONAL},
 | 
			
		||||
    {sfReserveIncrementDrops,  soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnID,          soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,      soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfBaseFeeDrops, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfReserveBaseDrops, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfReserveIncrementDrops, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A claim id for a cross chain create account transaction.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::xChainCreateAccountClaimID
 | 
			
		||||
*/
 | 
			
		||||
LEDGER_ENTRY(ltXCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID, 0x0074, XChainOwnedCreateAccountClaimID, xchain_owned_create_account_claim_id, ({
 | 
			
		||||
    {sfAccount,                         soeREQUIRED},
 | 
			
		||||
    {sfXChainBridge,                    soeREQUIRED},
 | 
			
		||||
    {sfXChainAccountCreateCount,        soeREQUIRED},
 | 
			
		||||
    {sfXChainCreateAccountAttestations, soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,                       soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,                   soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,               soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltXCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID, 0x0074, XChainOwnedCreateAccountClaimID, xchain_owned_create_account_claim_id, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainBridge, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainAccountCreateCount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfXChainCreateAccountAttestations, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object describing a single escrow.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::escrow
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltESCROW, 0x0075, Escrow, escrow, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfDestination,          soeREQUIRED},
 | 
			
		||||
    {sfAmount,               soeREQUIRED},
 | 
			
		||||
    {sfCondition,            soeOPTIONAL},
 | 
			
		||||
    {sfCancelAfter,          soeOPTIONAL},
 | 
			
		||||
    {sfFinishAfter,          soeOPTIONAL},
 | 
			
		||||
    {sfSourceTag,            soeOPTIONAL},
 | 
			
		||||
    {sfDestinationTag,       soeOPTIONAL},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
    {sfDestinationNode,      soeOPTIONAL},
 | 
			
		||||
    {sfTransferRate,         soeOPTIONAL},
 | 
			
		||||
    {sfIssuerNode,           soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltESCROW, 0x0075, Escrow, escrow, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestination, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAmount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfCondition, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfCancelAfter, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfFinishAfter, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSourceTag, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestinationTag, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestinationNode, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTransferRate, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfIssuerNode, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object describing a single unidirectional XRP payment channel.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::payChan
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltPAYCHAN, 0x0078, PayChannel, payment_channel, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfDestination,          soeREQUIRED},
 | 
			
		||||
    {sfAmount,               soeREQUIRED},
 | 
			
		||||
    {sfBalance,              soeREQUIRED},
 | 
			
		||||
    {sfPublicKey,            soeREQUIRED},
 | 
			
		||||
    {sfSettleDelay,          soeREQUIRED},
 | 
			
		||||
    {sfExpiration,           soeOPTIONAL},
 | 
			
		||||
    {sfCancelAfter,          soeOPTIONAL},
 | 
			
		||||
    {sfSourceTag,            soeOPTIONAL},
 | 
			
		||||
    {sfDestinationTag,       soeOPTIONAL},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
    {sfDestinationNode,      soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltPAYCHAN, 0x0078, PayChannel, payment_channel, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestination, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAmount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfBalance, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPublicKey, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSettleDelay, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfExpiration, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfCancelAfter, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSourceTag, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestinationTag, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDestinationNode, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** The ledger object which tracks the AMM.
 | 
			
		||||
 | 
			
		||||
   \sa keylet::amm
 | 
			
		||||
*/
 | 
			
		||||
LEDGER_ENTRY(ltAMM, 0x0079, AMM, amm, ({
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfTradingFee,           soeDEFAULT},
 | 
			
		||||
    {sfVoteSlots,            soeOPTIONAL},
 | 
			
		||||
    {sfAuctionSlot,          soeOPTIONAL},
 | 
			
		||||
    {sfLPTokenBalance,       soeREQUIRED},
 | 
			
		||||
    {sfAsset,                soeREQUIRED},
 | 
			
		||||
    {sfAsset2,               soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltAMM, 0x0079, AMM, amm, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTradingFee, soeDEFAULT)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfVoteSlots, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAuctionSlot, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLPTokenBalance, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAsset, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAsset2, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which tracks MPTokenIssuance
 | 
			
		||||
    \sa keylet::mptIssuance
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltMPTOKEN_ISSUANCE, 0x007e, MPTokenIssuance, mpt_issuance, ({
 | 
			
		||||
    {sfIssuer,                   soeREQUIRED},
 | 
			
		||||
    {sfSequence,                 soeREQUIRED},
 | 
			
		||||
    {sfTransferFee,              soeDEFAULT},
 | 
			
		||||
    {sfOwnerNode,                soeREQUIRED},
 | 
			
		||||
    {sfAssetScale,               soeDEFAULT},
 | 
			
		||||
    {sfMaximumAmount,            soeOPTIONAL},
 | 
			
		||||
    {sfOutstandingAmount,        soeREQUIRED},
 | 
			
		||||
    {sfLockedAmount,             soeOPTIONAL},
 | 
			
		||||
    {sfMPTokenMetadata,          soeOPTIONAL},
 | 
			
		||||
    {sfPreviousTxnID,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,        soeREQUIRED},
 | 
			
		||||
    {sfDomainID,                 soeOPTIONAL},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltMPTOKEN_ISSUANCE, 0x007e, MPTokenIssuance, mpt_issuance, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfIssuer, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSequence, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfTransferFee, soeDEFAULT)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAssetScale, soeDEFAULT)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfMaximumAmount, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOutstandingAmount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLockedAmount, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfMPTokenMetadata, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfDomainID, soeOPTIONAL)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which tracks MPToken
 | 
			
		||||
    \sa keylet::mptoken
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltMPTOKEN, 0x007f, MPToken, mptoken, ({
 | 
			
		||||
    {sfAccount,                  soeREQUIRED},
 | 
			
		||||
    {sfMPTokenIssuanceID,        soeREQUIRED},
 | 
			
		||||
    {sfMPTAmount,                soeDEFAULT},
 | 
			
		||||
    {sfLockedAmount,             soeOPTIONAL},
 | 
			
		||||
    {sfOwnerNode,                soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,        soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltMPTOKEN, 0x007f, MPToken, mptoken, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfMPTokenIssuanceID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfMPTAmount, soeDEFAULT)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLockedAmount, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which tracks Oracle
 | 
			
		||||
    \sa keylet::oracle
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltORACLE, 0x0080, Oracle, oracle, ({
 | 
			
		||||
    {sfOwner,                soeREQUIRED},
 | 
			
		||||
    {sfProvider,             soeREQUIRED},
 | 
			
		||||
    {sfPriceDataSeries,      soeREQUIRED},
 | 
			
		||||
    {sfAssetClass,           soeREQUIRED},
 | 
			
		||||
    {sfLastUpdateTime,       soeREQUIRED},
 | 
			
		||||
    {sfURI,                  soeOPTIONAL},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltORACLE, 0x0080, Oracle, oracle, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwner, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfProvider, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPriceDataSeries, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAssetClass, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLastUpdateTime, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfURI, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which tracks Credential
 | 
			
		||||
    \sa keylet::credential
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltCREDENTIAL, 0x0081, Credential, credential, ({
 | 
			
		||||
    {sfSubject,              soeREQUIRED},
 | 
			
		||||
    {sfIssuer,               soeREQUIRED},
 | 
			
		||||
    {sfCredentialType,       soeREQUIRED},
 | 
			
		||||
    {sfExpiration,           soeOPTIONAL},
 | 
			
		||||
    {sfURI,                  soeOPTIONAL},
 | 
			
		||||
    {sfIssuerNode,           soeREQUIRED},
 | 
			
		||||
    {sfSubjectNode,          soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltCREDENTIAL, 0x0081, Credential, credential, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSubject, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfIssuer, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfCredentialType, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfExpiration, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfURI, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfIssuerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSubjectNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object which tracks PermissionedDomain
 | 
			
		||||
    \sa keylet::permissionedDomain
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltPERMISSIONED_DOMAIN, 0x0082, PermissionedDomain, permissioned_domain, ({
 | 
			
		||||
    {sfOwner,               soeREQUIRED},
 | 
			
		||||
    {sfSequence,            soeREQUIRED},
 | 
			
		||||
    {sfAcceptedCredentials, soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,           soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnID,       soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,   soeREQUIRED},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltPERMISSIONED_DOMAIN, 0x0082, PermissionedDomain, permissioned_domain, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwner, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSequence, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAcceptedCredentials, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(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},
 | 
			
		||||
}))
 | 
			
		||||
LEDGER_ENTRY(ltDELEGATE, 0x0083, Delegate, delegate, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAuthorize, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPermissions, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
/** A ledger object representing a single asset vault.
 | 
			
		||||
 | 
			
		||||
    \sa keylet::mptoken
 | 
			
		||||
 */
 | 
			
		||||
LEDGER_ENTRY(ltVAULT, 0x0084, Vault, vault, ({
 | 
			
		||||
    {sfPreviousTxnID,        soeREQUIRED},
 | 
			
		||||
    {sfPreviousTxnLgrSeq,    soeREQUIRED},
 | 
			
		||||
    {sfSequence,             soeREQUIRED},
 | 
			
		||||
    {sfOwnerNode,            soeREQUIRED},
 | 
			
		||||
    {sfOwner,                soeREQUIRED},
 | 
			
		||||
    {sfAccount,              soeREQUIRED},
 | 
			
		||||
    {sfData,                 soeOPTIONAL},
 | 
			
		||||
    {sfAsset,                soeREQUIRED},
 | 
			
		||||
    {sfAssetsTotal,          soeREQUIRED},
 | 
			
		||||
    {sfAssetsAvailable,      soeREQUIRED},
 | 
			
		||||
    {sfAssetsMaximum,        soeDEFAULT},
 | 
			
		||||
    {sfLossUnrealized,       soeREQUIRED},
 | 
			
		||||
    {sfShareMPTID,           soeREQUIRED},
 | 
			
		||||
    {sfWithdrawalPolicy,     soeREQUIRED},
 | 
			
		||||
LEDGER_ENTRY(ltVAULT, 0x0084, Vault, vault, DEFINE_LEDGER_ENTRY_FIELDS(
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfPreviousTxnLgrSeq, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfSequence, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwnerNode, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfOwner, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAccount, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfData, soeOPTIONAL)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAsset, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAssetsTotal, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAssetsAvailable, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfAssetsMaximum, soeDEFAULT)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfLossUnrealized, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfShareMPTID, soeREQUIRED)
 | 
			
		||||
    LEDGER_ENTRY_FIELD(sfWithdrawalPolicy, soeREQUIRED)
 | 
			
		||||
    // no SharesTotal ever (use MPTIssuance.sfOutstandingAmount)
 | 
			
		||||
    // no PermissionedDomainID ever (use MPTIssuance.sfDomainID)
 | 
			
		||||
}))
 | 
			
		||||
))
 | 
			
		||||
 | 
			
		||||
#undef EXPAND
 | 
			
		||||
#undef LEDGER_ENTRY_DUPLICATE
 | 
			
		||||
 | 
			
		||||
LEDGER_ENTRIES_END
 | 
			
		||||
 
 | 
			
		||||
@@ -23,6 +23,9 @@
 | 
			
		||||
#if !defined(TYPED_SFIELD)
 | 
			
		||||
#error "undefined macro: TYPED_SFIELD"
 | 
			
		||||
#endif
 | 
			
		||||
#if !defined(ARRAY_SFIELD)
 | 
			
		||||
#error "undefined macro: ARRAY_SFIELD"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// untyped
 | 
			
		||||
UNTYPED_SFIELD(sfLedgerEntry,            LEDGERENTRY, 257)
 | 
			
		||||
@@ -366,33 +369,33 @@ UNTYPED_SFIELD(sfBook,                   OBJECT,    36)
 | 
			
		||||
// array of objects (common)
 | 
			
		||||
// ARRAY/1 is reserved for end of array
 | 
			
		||||
// sfSigningAccounts has never been used.
 | 
			
		||||
//UNTYPED_SFIELD(sfSigningAccounts,        ARRAY,      2)
 | 
			
		||||
UNTYPED_SFIELD(sfSigners,                ARRAY,      3, SField::sMD_Default, SField::notSigning)
 | 
			
		||||
UNTYPED_SFIELD(sfSignerEntries,          ARRAY,      4)
 | 
			
		||||
UNTYPED_SFIELD(sfTemplate,               ARRAY,      5)
 | 
			
		||||
UNTYPED_SFIELD(sfNecessary,              ARRAY,      6)
 | 
			
		||||
UNTYPED_SFIELD(sfSufficient,             ARRAY,      7)
 | 
			
		||||
UNTYPED_SFIELD(sfAffectedNodes,          ARRAY,      8)
 | 
			
		||||
UNTYPED_SFIELD(sfMemos,                  ARRAY,      9)
 | 
			
		||||
UNTYPED_SFIELD(sfNFTokens,               ARRAY,     10)
 | 
			
		||||
UNTYPED_SFIELD(sfHooks,                  ARRAY,     11)
 | 
			
		||||
UNTYPED_SFIELD(sfVoteSlots,              ARRAY,     12)
 | 
			
		||||
UNTYPED_SFIELD(sfAdditionalBooks,        ARRAY,     13)
 | 
			
		||||
//UNTYPED_SFIELD(sfSigningAccounts, sfInvalid,        ARRAY,      2)
 | 
			
		||||
ARRAY_SFIELD(sfSigners, sfSigner,                ARRAY,      3, SField::sMD_Default, SField::notSigning)
 | 
			
		||||
ARRAY_SFIELD(sfSignerEntries, sfSignerEntry,          ARRAY,      4)
 | 
			
		||||
ARRAY_SFIELD(sfTemplate, sfInvalid,               ARRAY,      5)
 | 
			
		||||
ARRAY_SFIELD(sfNecessary, sfInvalid,              ARRAY,      6)
 | 
			
		||||
ARRAY_SFIELD(sfSufficient, sfInvalid,             ARRAY,      7)
 | 
			
		||||
ARRAY_SFIELD(sfAffectedNodes, sfInvalid,          ARRAY,      8)
 | 
			
		||||
ARRAY_SFIELD(sfMemos, sfInvalid,                  ARRAY,      9)
 | 
			
		||||
ARRAY_SFIELD(sfNFTokens, sfNFToken,               ARRAY,     10)
 | 
			
		||||
ARRAY_SFIELD(sfHooks, sfInvalid,                  ARRAY,     11)
 | 
			
		||||
ARRAY_SFIELD(sfVoteSlots, sfVoteEntry,              ARRAY,     12)
 | 
			
		||||
ARRAY_SFIELD(sfAdditionalBooks, sfInvalid,        ARRAY,     13)
 | 
			
		||||
 | 
			
		||||
// array of objects (uncommon)
 | 
			
		||||
UNTYPED_SFIELD(sfMajorities,             ARRAY,     16)
 | 
			
		||||
UNTYPED_SFIELD(sfDisabledValidators,     ARRAY,     17)
 | 
			
		||||
UNTYPED_SFIELD(sfHookExecutions,         ARRAY,     18)
 | 
			
		||||
UNTYPED_SFIELD(sfHookParameters,         ARRAY,     19)
 | 
			
		||||
UNTYPED_SFIELD(sfHookGrants,             ARRAY,     20)
 | 
			
		||||
UNTYPED_SFIELD(sfXChainClaimAttestations, ARRAY,    21)
 | 
			
		||||
UNTYPED_SFIELD(sfXChainCreateAccountAttestations, ARRAY, 22)
 | 
			
		||||
ARRAY_SFIELD(sfMajorities, sfMajority,             ARRAY,     16)
 | 
			
		||||
ARRAY_SFIELD(sfDisabledValidators, sfDisabledValidator,     ARRAY,     17)
 | 
			
		||||
ARRAY_SFIELD(sfHookExecutions, sfInvalid,         ARRAY,     18)
 | 
			
		||||
ARRAY_SFIELD(sfHookParameters, sfInvalid,         ARRAY,     19)
 | 
			
		||||
ARRAY_SFIELD(sfHookGrants, sfInvalid,             ARRAY,     20)
 | 
			
		||||
ARRAY_SFIELD(sfXChainClaimAttestations, sfInvalid, ARRAY,    21)
 | 
			
		||||
ARRAY_SFIELD(sfXChainCreateAccountAttestations, sfInvalid, ARRAY, 22)
 | 
			
		||||
//                                                  23 unused
 | 
			
		||||
UNTYPED_SFIELD(sfPriceDataSeries,        ARRAY,     24)
 | 
			
		||||
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)
 | 
			
		||||
UNTYPED_SFIELD(sfRawTransactions,        ARRAY,     30)
 | 
			
		||||
UNTYPED_SFIELD(sfBatchSigners,           ARRAY,     31, SField::sMD_Default, SField::notSigning)
 | 
			
		||||
ARRAY_SFIELD(sfPriceDataSeries, sfPriceData,        ARRAY,     24)
 | 
			
		||||
ARRAY_SFIELD(sfAuthAccounts, sfAuthAccount,           ARRAY,     25)
 | 
			
		||||
ARRAY_SFIELD(sfAuthorizeCredentials, sfInvalid,   ARRAY,     26)
 | 
			
		||||
ARRAY_SFIELD(sfUnauthorizeCredentials, sfInvalid, ARRAY,     27)
 | 
			
		||||
ARRAY_SFIELD(sfAcceptedCredentials, sfInvalid,    ARRAY,     28)
 | 
			
		||||
ARRAY_SFIELD(sfPermissions, sfPermission,            ARRAY,     29)
 | 
			
		||||
ARRAY_SFIELD(sfRawTransactions, sfInvalid,        ARRAY,     30)
 | 
			
		||||
ARRAY_SFIELD(sfBatchSigners, sfBatchSigner,           ARRAY,     31, SField::sMD_Default, SField::notSigning)
 | 
			
		||||
 
 | 
			
		||||
@@ -717,7 +717,19 @@ JSS(write_load);              // out: GetCounts
 | 
			
		||||
#undef LEDGER_ENTRY
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRY_DUPLICATE")
 | 
			
		||||
#undef LEDGER_ENTRY_DUPLICATE
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRY_FIELD")
 | 
			
		||||
#undef LEDGER_ENTRY_FIELD
 | 
			
		||||
#pragma push_macro("DEFINE_LEDGER_ENTRY_FIELDS")
 | 
			
		||||
#undef DEFINE_LEDGER_ENTRY_FIELDS
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRIES_BEGIN")
 | 
			
		||||
#undef LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRIES_END")
 | 
			
		||||
#undef LEDGER_ENTRIES_END
 | 
			
		||||
 | 
			
		||||
#define LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#define LEDGER_ENTRIES_END
 | 
			
		||||
#define DEFINE_LEDGER_ENTRY_FIELDS(...) ({__VA_ARGS__})
 | 
			
		||||
#define LEDGER_ENTRY_FIELD(...) {__VA_ARGS__},
 | 
			
		||||
#define LEDGER_ENTRY(tag, value, name, rpcName, fields) \
 | 
			
		||||
    JSS(name);                                          \
 | 
			
		||||
    JSS(rpcName);
 | 
			
		||||
@@ -730,6 +742,14 @@ JSS(write_load);              // out: GetCounts
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY")
 | 
			
		||||
#undef LEDGER_ENTRY_DUPLICATE
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY_DUPLICATE")
 | 
			
		||||
#undef LEDGER_ENTRY_FIELD
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY_FIELD")
 | 
			
		||||
#undef DEFINE_LEDGER_ENTRY_FIELDS
 | 
			
		||||
#pragma pop_macro("DEFINE_LEDGER_ENTRY_FIELDS")
 | 
			
		||||
#undef LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRIES_BEGIN")
 | 
			
		||||
#undef LEDGER_ENTRIES_END
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRIES_END")
 | 
			
		||||
 | 
			
		||||
#undef JSS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -132,7 +132,7 @@ getBookBase(Book const& book)
 | 
			
		||||
                                         book.out.account);
 | 
			
		||||
 | 
			
		||||
    // Return with quality 0.
 | 
			
		||||
    auto k = keylet::quality({ltDIR_NODE, index}, 0);
 | 
			
		||||
    auto k = keylet::quality({index}, 0);
 | 
			
		||||
 | 
			
		||||
    return k.key;
 | 
			
		||||
}
 | 
			
		||||
@@ -180,10 +180,10 @@ makeMptID(std::uint32_t sequence, AccountID const& account)
 | 
			
		||||
 | 
			
		||||
namespace keylet {
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltACCOUNT_ROOT>
 | 
			
		||||
account(AccountID const& id) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return Keylet{ltACCOUNT_ROOT, indexHash(LedgerNameSpace::ACCOUNT, id)};
 | 
			
		||||
    return TypedKeylet<ltACCOUNT_ROOT>{indexHash(LedgerNameSpace::ACCOUNT, id)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
@@ -192,55 +192,53 @@ child(uint256 const& key) noexcept
 | 
			
		||||
    return {ltCHILD, key};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet const&
 | 
			
		||||
TypedKeylet<ltLEDGER_HASHES> const&
 | 
			
		||||
skip() noexcept
 | 
			
		||||
{
 | 
			
		||||
    static Keylet const ret{
 | 
			
		||||
        ltLEDGER_HASHES, indexHash(LedgerNameSpace::SKIP_LIST)};
 | 
			
		||||
    static TypedKeylet<ltLEDGER_HASHES> const ret{
 | 
			
		||||
        indexHash(LedgerNameSpace::SKIP_LIST)};
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltLEDGER_HASHES>
 | 
			
		||||
skip(LedgerIndex ledger) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltLEDGER_HASHES,
 | 
			
		||||
        indexHash(
 | 
			
		||||
            LedgerNameSpace::SKIP_LIST,
 | 
			
		||||
            std::uint32_t(static_cast<std::uint32_t>(ledger) >> 16))};
 | 
			
		||||
    return {indexHash(
 | 
			
		||||
        LedgerNameSpace::SKIP_LIST,
 | 
			
		||||
        std::uint32_t(static_cast<std::uint32_t>(ledger) >> 16))};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet const&
 | 
			
		||||
TypedKeylet<ltAMENDMENTS> const&
 | 
			
		||||
amendments() noexcept
 | 
			
		||||
{
 | 
			
		||||
    static Keylet const ret{
 | 
			
		||||
        ltAMENDMENTS, indexHash(LedgerNameSpace::AMENDMENTS)};
 | 
			
		||||
    static TypedKeylet<ltAMENDMENTS> const ret{
 | 
			
		||||
        indexHash(LedgerNameSpace::AMENDMENTS)};
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet const&
 | 
			
		||||
TypedKeylet<ltFEE_SETTINGS> const&
 | 
			
		||||
fees() noexcept
 | 
			
		||||
{
 | 
			
		||||
    static Keylet const ret{
 | 
			
		||||
        ltFEE_SETTINGS, indexHash(LedgerNameSpace::FEE_SETTINGS)};
 | 
			
		||||
    static TypedKeylet<ltFEE_SETTINGS> const ret{
 | 
			
		||||
        indexHash(LedgerNameSpace::FEE_SETTINGS)};
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet const&
 | 
			
		||||
TypedKeylet<ltNEGATIVE_UNL> const&
 | 
			
		||||
negativeUNL() noexcept
 | 
			
		||||
{
 | 
			
		||||
    static Keylet const ret{
 | 
			
		||||
        ltNEGATIVE_UNL, indexHash(LedgerNameSpace::NEGATIVE_UNL)};
 | 
			
		||||
    static TypedKeylet<ltNEGATIVE_UNL> const ret{
 | 
			
		||||
        indexHash(LedgerNameSpace::NEGATIVE_UNL)};
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
book_t::operator()(Book const& b) const
 | 
			
		||||
{
 | 
			
		||||
    return {ltDIR_NODE, getBookBase(b)};
 | 
			
		||||
    return {getBookBase(b)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltRIPPLE_STATE>
 | 
			
		||||
line(
 | 
			
		||||
    AccountID const& id0,
 | 
			
		||||
    AccountID const& id1,
 | 
			
		||||
@@ -261,27 +259,22 @@ line(
 | 
			
		||||
    // two accounts (smallest then largest)  and hash them in that order:
 | 
			
		||||
    auto const accounts = std::minmax(id0, id1);
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
        ltRIPPLE_STATE,
 | 
			
		||||
        indexHash(
 | 
			
		||||
            LedgerNameSpace::TRUST_LINE,
 | 
			
		||||
            accounts.first,
 | 
			
		||||
            accounts.second,
 | 
			
		||||
            currency)};
 | 
			
		||||
    return {indexHash(
 | 
			
		||||
        LedgerNameSpace::TRUST_LINE,
 | 
			
		||||
        accounts.first,
 | 
			
		||||
        accounts.second,
 | 
			
		||||
        currency)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltOFFER>
 | 
			
		||||
offer(AccountID const& id, std::uint32_t seq) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltOFFER, indexHash(LedgerNameSpace::OFFER, id, seq)};
 | 
			
		||||
    return {indexHash(LedgerNameSpace::OFFER, id, seq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
quality(Keylet const& k, std::uint64_t q) noexcept
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
quality(TypedKeylet<ltDIR_NODE> const& k, std::uint64_t q) noexcept
 | 
			
		||||
{
 | 
			
		||||
    XRPL_ASSERT(
 | 
			
		||||
        k.type == ltDIR_NODE, "ripple::keylet::quality : valid input type");
 | 
			
		||||
 | 
			
		||||
    // Indexes are stored in big endian format: they print as hex as stored.
 | 
			
		||||
    // Most significant bytes are first and the least significant bytes
 | 
			
		||||
    // represent adjacent entries. We place the quality, in big endian format,
 | 
			
		||||
@@ -292,62 +285,57 @@ quality(Keylet const& k, std::uint64_t q) noexcept
 | 
			
		||||
    // FIXME This is ugly and we can and should do better...
 | 
			
		||||
    ((std::uint64_t*)x.end())[-1] = boost::endian::native_to_big(q);
 | 
			
		||||
 | 
			
		||||
    return {ltDIR_NODE, x};
 | 
			
		||||
    return {x};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
next_t::operator()(Keylet const& k) const
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
next_t::operator()(TypedKeylet<ltDIR_NODE> const& k) const
 | 
			
		||||
{
 | 
			
		||||
    XRPL_ASSERT(
 | 
			
		||||
        k.type == ltDIR_NODE,
 | 
			
		||||
        "ripple::keylet::next_t::operator() : valid input type");
 | 
			
		||||
    return {ltDIR_NODE, getQualityNext(k.key)};
 | 
			
		||||
    return {getQualityNext(k.key)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltTICKET>
 | 
			
		||||
ticket_t::operator()(AccountID const& id, std::uint32_t ticketSeq) const
 | 
			
		||||
{
 | 
			
		||||
    return {ltTICKET, getTicketIndex(id, ticketSeq)};
 | 
			
		||||
    return {getTicketIndex(id, ticketSeq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltTICKET>
 | 
			
		||||
ticket_t::operator()(AccountID const& id, SeqProxy ticketSeq) const
 | 
			
		||||
{
 | 
			
		||||
    return {ltTICKET, getTicketIndex(id, ticketSeq)};
 | 
			
		||||
    return {getTicketIndex(id, ticketSeq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// This function is presently static, since it's never accessed from anywhere
 | 
			
		||||
// else. If we ever support multiple pages of signer lists, this would be the
 | 
			
		||||
// keylet used to locate them.
 | 
			
		||||
static Keylet
 | 
			
		||||
static TypedKeylet<ltSIGNER_LIST>
 | 
			
		||||
signers(AccountID const& account, std::uint32_t page) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltSIGNER_LIST, indexHash(LedgerNameSpace::SIGNER_LIST, account, page)};
 | 
			
		||||
    return {indexHash(LedgerNameSpace::SIGNER_LIST, account, page)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltSIGNER_LIST>
 | 
			
		||||
signers(AccountID const& account) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return signers(account, 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltCHECK>
 | 
			
		||||
check(AccountID const& id, std::uint32_t seq) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltCHECK, indexHash(LedgerNameSpace::CHECK, id, seq)};
 | 
			
		||||
    return TypedKeylet<ltCHECK>{indexHash(LedgerNameSpace::CHECK, id, seq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDEPOSIT_PREAUTH>
 | 
			
		||||
depositPreauth(AccountID const& owner, AccountID const& preauthorized) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltDEPOSIT_PREAUTH,
 | 
			
		||||
    return TypedKeylet<ltDEPOSIT_PREAUTH>{
 | 
			
		||||
        indexHash(LedgerNameSpace::DEPOSIT_PREAUTH, owner, preauthorized)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Credentials should be sorted here, use credentials::makeSorted
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDEPOSIT_PREAUTH>
 | 
			
		||||
depositPreauth(
 | 
			
		||||
    AccountID const& owner,
 | 
			
		||||
    std::set<std::pair<AccountID, Slice>> const& authCreds) noexcept
 | 
			
		||||
@@ -357,8 +345,7 @@ depositPreauth(
 | 
			
		||||
    for (auto const& o : authCreds)
 | 
			
		||||
        hashes.emplace_back(sha512Half(o.first, o.second));
 | 
			
		||||
 | 
			
		||||
    return {
 | 
			
		||||
        ltDEPOSIT_PREAUTH,
 | 
			
		||||
    return TypedKeylet<ltDEPOSIT_PREAUTH>{
 | 
			
		||||
        indexHash(LedgerNameSpace::DEPOSIT_PREAUTH_CREDENTIALS, owner, hashes)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -367,82 +354,82 @@ depositPreauth(
 | 
			
		||||
Keylet
 | 
			
		||||
unchecked(uint256 const& key) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltANY, key};
 | 
			
		||||
    return Keylet{ltANY, key};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
ownerDir(AccountID const& id) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltDIR_NODE, indexHash(LedgerNameSpace::OWNER_DIR, id)};
 | 
			
		||||
    return TypedKeylet<ltDIR_NODE>{indexHash(LedgerNameSpace::OWNER_DIR, id)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
page(uint256 const& key, std::uint64_t index) noexcept
 | 
			
		||||
{
 | 
			
		||||
    if (index == 0)
 | 
			
		||||
        return {ltDIR_NODE, key};
 | 
			
		||||
        return TypedKeylet<ltDIR_NODE>{key};
 | 
			
		||||
 | 
			
		||||
    return {ltDIR_NODE, indexHash(LedgerNameSpace::DIR_NODE, key, index)};
 | 
			
		||||
    return TypedKeylet<ltDIR_NODE>{
 | 
			
		||||
        indexHash(LedgerNameSpace::DIR_NODE, key, index)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltESCROW>
 | 
			
		||||
escrow(AccountID const& src, std::uint32_t seq) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltESCROW, indexHash(LedgerNameSpace::ESCROW, src, seq)};
 | 
			
		||||
    return TypedKeylet<ltESCROW>{indexHash(LedgerNameSpace::ESCROW, src, seq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltPAYCHAN>
 | 
			
		||||
payChan(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltPAYCHAN,
 | 
			
		||||
    return TypedKeylet<ltPAYCHAN>{
 | 
			
		||||
        indexHash(LedgerNameSpace::XRP_PAYMENT_CHANNEL, src, dst, seq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltNFTOKEN_PAGE>
 | 
			
		||||
nftpage_min(AccountID const& owner)
 | 
			
		||||
{
 | 
			
		||||
    std::array<std::uint8_t, 32> buf{};
 | 
			
		||||
    std::memcpy(buf.data(), owner.data(), owner.size());
 | 
			
		||||
    return {ltNFTOKEN_PAGE, uint256{buf}};
 | 
			
		||||
    return TypedKeylet<ltNFTOKEN_PAGE>{uint256{buf}};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltNFTOKEN_PAGE>
 | 
			
		||||
nftpage_max(AccountID const& owner)
 | 
			
		||||
{
 | 
			
		||||
    uint256 id = nft::pageMask;
 | 
			
		||||
    std::memcpy(id.data(), owner.data(), owner.size());
 | 
			
		||||
    return {ltNFTOKEN_PAGE, id};
 | 
			
		||||
    return TypedKeylet<ltNFTOKEN_PAGE>{id};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
nftpage(Keylet const& k, uint256 const& token)
 | 
			
		||||
TypedKeylet<ltNFTOKEN_PAGE>
 | 
			
		||||
nftpage(TypedKeylet<ltNFTOKEN_PAGE> const& k, uint256 const& token)
 | 
			
		||||
{
 | 
			
		||||
    XRPL_ASSERT(
 | 
			
		||||
        k.type == ltNFTOKEN_PAGE, "ripple::keylet::nftpage : valid input type");
 | 
			
		||||
    return {ltNFTOKEN_PAGE, (k.key & ~nft::pageMask) + (token & nft::pageMask)};
 | 
			
		||||
    return {(k.key & ~nft::pageMask) + (token & nft::pageMask)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltNFTOKEN_OFFER>
 | 
			
		||||
nftoffer(AccountID const& owner, std::uint32_t seq)
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltNFTOKEN_OFFER, indexHash(LedgerNameSpace::NFTOKEN_OFFER, owner, seq)};
 | 
			
		||||
    return TypedKeylet<ltNFTOKEN_OFFER>{
 | 
			
		||||
        indexHash(LedgerNameSpace::NFTOKEN_OFFER, owner, seq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
nft_buys(uint256 const& id) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltDIR_NODE, indexHash(LedgerNameSpace::NFTOKEN_BUY_OFFERS, id)};
 | 
			
		||||
    return TypedKeylet<ltDIR_NODE>{
 | 
			
		||||
        indexHash(LedgerNameSpace::NFTOKEN_BUY_OFFERS, id)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDIR_NODE>
 | 
			
		||||
nft_sells(uint256 const& id) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltDIR_NODE, indexHash(LedgerNameSpace::NFTOKEN_SELL_OFFERS, id)};
 | 
			
		||||
    return TypedKeylet<ltDIR_NODE>{
 | 
			
		||||
        indexHash(LedgerNameSpace::NFTOKEN_SELL_OFFERS, id)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltAMM>
 | 
			
		||||
amm(Asset const& issue1, Asset const& issue2) noexcept
 | 
			
		||||
{
 | 
			
		||||
    auto const& [minI, maxI] =
 | 
			
		||||
@@ -455,129 +442,120 @@ amm(Asset const& issue1, Asset const& issue2) noexcept
 | 
			
		||||
        maxI.currency));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltAMM>
 | 
			
		||||
amm(uint256 const& id) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltAMM, id};
 | 
			
		||||
    return TypedKeylet<ltAMM>{id};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDELEGATE>
 | 
			
		||||
delegate(AccountID const& account, AccountID const& authorizedAccount) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltDELEGATE,
 | 
			
		||||
    return TypedKeylet<ltDELEGATE>{
 | 
			
		||||
        indexHash(LedgerNameSpace::DELEGATE, account, authorizedAccount)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltBRIDGE>
 | 
			
		||||
bridge(STXChainBridge const& bridge, STXChainBridge::ChainType chainType)
 | 
			
		||||
{
 | 
			
		||||
    // A door account can support multiple bridges. On the locking chain
 | 
			
		||||
    // there can only be one bridge per lockingChainCurrency. On the issuing
 | 
			
		||||
    // chain there can only be one bridge per issuingChainCurrency.
 | 
			
		||||
    auto const& issue = bridge.issue(chainType);
 | 
			
		||||
    return {
 | 
			
		||||
        ltBRIDGE,
 | 
			
		||||
        indexHash(
 | 
			
		||||
            LedgerNameSpace::BRIDGE, bridge.door(chainType), issue.currency)};
 | 
			
		||||
    return TypedKeylet<ltBRIDGE>{indexHash(
 | 
			
		||||
        LedgerNameSpace::BRIDGE, bridge.door(chainType), issue.currency)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltXCHAIN_OWNED_CLAIM_ID>
 | 
			
		||||
xChainClaimID(STXChainBridge const& bridge, std::uint64_t seq)
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltXCHAIN_OWNED_CLAIM_ID,
 | 
			
		||||
        indexHash(
 | 
			
		||||
            LedgerNameSpace::XCHAIN_CLAIM_ID,
 | 
			
		||||
            bridge.lockingChainDoor(),
 | 
			
		||||
            bridge.lockingChainIssue(),
 | 
			
		||||
            bridge.issuingChainDoor(),
 | 
			
		||||
            bridge.issuingChainIssue(),
 | 
			
		||||
            seq)};
 | 
			
		||||
    return TypedKeylet<ltXCHAIN_OWNED_CLAIM_ID>{indexHash(
 | 
			
		||||
        LedgerNameSpace::XCHAIN_CLAIM_ID,
 | 
			
		||||
        bridge.lockingChainDoor(),
 | 
			
		||||
        bridge.lockingChainIssue(),
 | 
			
		||||
        bridge.issuingChainDoor(),
 | 
			
		||||
        bridge.issuingChainIssue(),
 | 
			
		||||
        seq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltXCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID>
 | 
			
		||||
xChainCreateAccountClaimID(STXChainBridge const& bridge, std::uint64_t seq)
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltXCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID,
 | 
			
		||||
        indexHash(
 | 
			
		||||
            LedgerNameSpace::XCHAIN_CREATE_ACCOUNT_CLAIM_ID,
 | 
			
		||||
            bridge.lockingChainDoor(),
 | 
			
		||||
            bridge.lockingChainIssue(),
 | 
			
		||||
            bridge.issuingChainDoor(),
 | 
			
		||||
            bridge.issuingChainIssue(),
 | 
			
		||||
            seq)};
 | 
			
		||||
    return TypedKeylet<ltXCHAIN_OWNED_CREATE_ACCOUNT_CLAIM_ID>{indexHash(
 | 
			
		||||
        LedgerNameSpace::XCHAIN_CREATE_ACCOUNT_CLAIM_ID,
 | 
			
		||||
        bridge.lockingChainDoor(),
 | 
			
		||||
        bridge.lockingChainIssue(),
 | 
			
		||||
        bridge.issuingChainDoor(),
 | 
			
		||||
        bridge.issuingChainIssue(),
 | 
			
		||||
        seq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltDID>
 | 
			
		||||
did(AccountID const& account) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltDID, indexHash(LedgerNameSpace::DID, account)};
 | 
			
		||||
    return TypedKeylet<ltDID>{indexHash(LedgerNameSpace::DID, account)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltORACLE>
 | 
			
		||||
oracle(AccountID const& account, std::uint32_t const& documentID) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltORACLE, indexHash(LedgerNameSpace::ORACLE, account, documentID)};
 | 
			
		||||
    return TypedKeylet<ltORACLE>{
 | 
			
		||||
        indexHash(LedgerNameSpace::ORACLE, account, documentID)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltMPTOKEN_ISSUANCE>
 | 
			
		||||
mptIssuance(std::uint32_t seq, AccountID const& issuer) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return mptIssuance(makeMptID(seq, issuer));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltMPTOKEN_ISSUANCE>
 | 
			
		||||
mptIssuance(MPTID const& issuanceID) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltMPTOKEN_ISSUANCE,
 | 
			
		||||
    return TypedKeylet<ltMPTOKEN_ISSUANCE>{
 | 
			
		||||
        indexHash(LedgerNameSpace::MPTOKEN_ISSUANCE, issuanceID)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltMPTOKEN>
 | 
			
		||||
mptoken(MPTID const& issuanceID, AccountID const& holder) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return mptoken(mptIssuance(issuanceID).key, holder);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltMPTOKEN>
 | 
			
		||||
mptoken(uint256 const& issuanceKey, AccountID const& holder) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltMPTOKEN, indexHash(LedgerNameSpace::MPTOKEN, issuanceKey, holder)};
 | 
			
		||||
    return TypedKeylet<ltMPTOKEN>{
 | 
			
		||||
        indexHash(LedgerNameSpace::MPTOKEN, issuanceKey, holder)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltCREDENTIAL>
 | 
			
		||||
credential(
 | 
			
		||||
    AccountID const& subject,
 | 
			
		||||
    AccountID const& issuer,
 | 
			
		||||
    Slice const& credType) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltCREDENTIAL,
 | 
			
		||||
    return TypedKeylet<ltCREDENTIAL>{
 | 
			
		||||
        indexHash(LedgerNameSpace::CREDENTIAL, subject, issuer, credType)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltVAULT>
 | 
			
		||||
vault(AccountID const& owner, std::uint32_t seq) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return vault(indexHash(LedgerNameSpace::VAULT, owner, seq));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltPERMISSIONED_DOMAIN>
 | 
			
		||||
permissionedDomain(AccountID const& account, std::uint32_t seq) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {
 | 
			
		||||
        ltPERMISSIONED_DOMAIN,
 | 
			
		||||
    return TypedKeylet<ltPERMISSIONED_DOMAIN>{
 | 
			
		||||
        indexHash(LedgerNameSpace::PERMISSIONED_DOMAIN, account, seq)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Keylet
 | 
			
		||||
TypedKeylet<ltPERMISSIONED_DOMAIN>
 | 
			
		||||
permissionedDomain(uint256 const& domainID) noexcept
 | 
			
		||||
{
 | 
			
		||||
    return {ltPERMISSIONED_DOMAIN, domainID};
 | 
			
		||||
    return TypedKeylet<ltPERMISSIONED_DOMAIN>{domainID};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace keylet
 | 
			
		||||
 
 | 
			
		||||
@@ -39,8 +39,20 @@ LedgerFormats::LedgerFormats()
 | 
			
		||||
#undef UNWRAP
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRY")
 | 
			
		||||
#undef LEDGER_ENTRY
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRY_FIELD")
 | 
			
		||||
#undef LEDGER_ENTRY_FIELD
 | 
			
		||||
#pragma push_macro("DEFINE_LEDGER_ENTRY_FIELDS")
 | 
			
		||||
#undef DEFINE_LEDGER_ENTRY_FIELDS
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRIES_BEGIN")
 | 
			
		||||
#undef LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRIES_END")
 | 
			
		||||
#undef LEDGER_ENTRIES_END
 | 
			
		||||
 | 
			
		||||
#define LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#define LEDGER_ENTRIES_END
 | 
			
		||||
#define DEFINE_LEDGER_ENTRY_FIELDS(...) ({__VA_ARGS__})
 | 
			
		||||
#define UNWRAP(...) __VA_ARGS__
 | 
			
		||||
#define LEDGER_ENTRY_FIELD(...) {__VA_ARGS__},
 | 
			
		||||
#define LEDGER_ENTRY(tag, value, name, rpcName, fields) \
 | 
			
		||||
    add(jss::name, tag, UNWRAP fields, commonFields);
 | 
			
		||||
 | 
			
		||||
@@ -48,6 +60,14 @@ LedgerFormats::LedgerFormats()
 | 
			
		||||
 | 
			
		||||
#undef LEDGER_ENTRY
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY")
 | 
			
		||||
#undef LEDGER_ENTRY_FIELD
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY_FIELD")
 | 
			
		||||
#undef DEFINE_LEDGER_ENTRY_FIELDS
 | 
			
		||||
#pragma pop_macro("DEFINE_LEDGER_ENTRY_FIELDS")
 | 
			
		||||
#undef LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRIES_BEGIN")
 | 
			
		||||
#undef LEDGER_ENTRIES_END
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRIES_END")
 | 
			
		||||
#undef UNWRAP
 | 
			
		||||
#pragma pop_macro("UNWRAP")
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -52,6 +52,8 @@ TypedField<T>::TypedField(private_access_tag_t pat, Args&&... args)
 | 
			
		||||
#undef UNTYPED_SFIELD
 | 
			
		||||
#pragma push_macro("TYPED_SFIELD")
 | 
			
		||||
#undef TYPED_SFIELD
 | 
			
		||||
#pragma push_macro("ARRAY_SFIELD")
 | 
			
		||||
#undef ARRAY_SFIELD
 | 
			
		||||
 | 
			
		||||
#define UNTYPED_SFIELD(sfName, stiSuffix, fieldValue, ...) \
 | 
			
		||||
    SField const sfName(                                   \
 | 
			
		||||
@@ -67,6 +69,13 @@ TypedField<T>::TypedField(private_access_tag_t pat, Args&&... args)
 | 
			
		||||
        fieldValue,                                      \
 | 
			
		||||
        std::string_view(#sfName).substr(2).data(),      \
 | 
			
		||||
        ##__VA_ARGS__);
 | 
			
		||||
#define ARRAY_SFIELD(sfName, sfItemName, stiSuffix, fieldValue, ...) \
 | 
			
		||||
    SField const sfName(                                             \
 | 
			
		||||
        access,                                                      \
 | 
			
		||||
        STI_##stiSuffix,                                             \
 | 
			
		||||
        fieldValue,                                                  \
 | 
			
		||||
        std::string_view(#sfName).substr(2).data(),                  \
 | 
			
		||||
        ##__VA_ARGS__);
 | 
			
		||||
 | 
			
		||||
// SFields which, for historical reasons, do not follow naming conventions.
 | 
			
		||||
SField const sfInvalid(access, -1);
 | 
			
		||||
@@ -82,6 +91,8 @@ SField const sfIndex(access, STI_UINT256, 258, "index");
 | 
			
		||||
#pragma pop_macro("TYPED_SFIELD")
 | 
			
		||||
#undef UNTYPED_SFIELD
 | 
			
		||||
#pragma pop_macro("UNTYPED_SFIELD")
 | 
			
		||||
#undef ARRAY_SFIELD
 | 
			
		||||
#pragma pop_macro("ARRAY_SFIELD")
 | 
			
		||||
 | 
			
		||||
SField::SField(
 | 
			
		||||
    private_access_tag_t,
 | 
			
		||||
 
 | 
			
		||||
@@ -265,8 +265,8 @@ MPTTester::forObject(
 | 
			
		||||
{
 | 
			
		||||
    if (!id_)
 | 
			
		||||
        Throw<std::runtime_error>("MPT has not been created");
 | 
			
		||||
    auto const key = holder_ ? keylet::mptoken(*id_, holder_->id())
 | 
			
		||||
                             : keylet::mptIssuance(*id_);
 | 
			
		||||
    auto const key = holder_ ? keylet::mptoken(*id_, holder_->id()).untyped()
 | 
			
		||||
                             : keylet::mptIssuance(*id_).untyped();
 | 
			
		||||
    if (auto const sle = env_.le(key))
 | 
			
		||||
        return cb(sle);
 | 
			
		||||
    return false;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										142
									
								
								src/test/protocol/TypedLedgerEntries_test.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								src/test/protocol/TypedLedgerEntries_test.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
//------------------------------------------------------------------------------
 | 
			
		||||
/*
 | 
			
		||||
    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/unit_test.h>
 | 
			
		||||
#include <xrpl/protocol/STObject.h>
 | 
			
		||||
#include <xrpl/protocol/TypedLedgerEntries.h>
 | 
			
		||||
 | 
			
		||||
namespace ripple {
 | 
			
		||||
 | 
			
		||||
struct TypedLedgerEntries_test : public beast::unit_test::suite
 | 
			
		||||
{
 | 
			
		||||
    void
 | 
			
		||||
    testAccessSTArrayProxy()
 | 
			
		||||
    {
 | 
			
		||||
        testcase("testAccessSTArrayProxy");
 | 
			
		||||
        STArray innerArray;
 | 
			
		||||
        STArrayProxy<InnerObjectType<SFieldNames::field_sfSignerEntry>> array{
 | 
			
		||||
            &innerArray};
 | 
			
		||||
 | 
			
		||||
        BEAST_EXPECT(array.empty());
 | 
			
		||||
        auto item = array.createItem();
 | 
			
		||||
        item.fsfSignerWeight() = 1;
 | 
			
		||||
        array.push_back(item);
 | 
			
		||||
 | 
			
		||||
        BEAST_EXPECT(array.back().fsfSignerWeight() == 1);
 | 
			
		||||
 | 
			
		||||
        BEAST_EXPECT(array.value().back()[sfSignerWeight] == 1);
 | 
			
		||||
 | 
			
		||||
        BEAST_EXPECT(array.begin()->fsfSignerWeight() == 1);
 | 
			
		||||
        BEAST_EXPECT(std::distance(array.begin(), array.end()) == 1);
 | 
			
		||||
        BEAST_EXPECT(array.size() == 1);
 | 
			
		||||
        BEAST_EXPECT(!array.empty());
 | 
			
		||||
        BEAST_EXPECT(array.at(0).fsfSignerWeight() == 1);
 | 
			
		||||
        BEAST_EXPECT(!array.at(1).isValid());
 | 
			
		||||
        BEAST_EXPECT(array.valid());
 | 
			
		||||
        BEAST_EXPECT(
 | 
			
		||||
            !STArrayProxy<LedgerObjectType<ltSIGNER_LIST>>{nullptr}.valid());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void
 | 
			
		||||
    testGet()
 | 
			
		||||
    {
 | 
			
		||||
        testcase("testGet");
 | 
			
		||||
 | 
			
		||||
        auto object = std::make_shared<SLE>(ltSIGNER_LIST, uint256{});
 | 
			
		||||
        STArray signerEntries;
 | 
			
		||||
        STObject signerEntry{sfSignerEntry};
 | 
			
		||||
        signerEntry[sfAccount] = AccountID{1};
 | 
			
		||||
        signerEntry[sfSignerWeight] = 2;
 | 
			
		||||
        signerEntry[sfWalletLocator] = uint256{3};
 | 
			
		||||
        signerEntries.emplace_back(signerEntry);
 | 
			
		||||
 | 
			
		||||
        (*object)[sfOwnerNode] = 1UL;
 | 
			
		||||
        (*object)[sfSignerQuorum] = 2U;
 | 
			
		||||
        (*object)[sfSignerListID] = 3U;
 | 
			
		||||
        (*object)[sfPreviousTxnLgrSeq] = 4U;
 | 
			
		||||
        (*object)[sfPreviousTxnID] = uint256{5};
 | 
			
		||||
        (*object).setFieldArray(sfSignerEntries, signerEntries);
 | 
			
		||||
 | 
			
		||||
        auto entry = LedgerObjectType<ltSIGNER_LIST>::fromObject(object);
 | 
			
		||||
        BEAST_EXPECT(entry.fsfOwnerNode() == 1);
 | 
			
		||||
        BEAST_EXPECT(entry.fsfSignerQuorum() == 2);
 | 
			
		||||
        BEAST_EXPECT(entry.fsfSignerListID() == 3);
 | 
			
		||||
        BEAST_EXPECT(entry.fsfPreviousTxnLgrSeq() == 4);
 | 
			
		||||
        BEAST_EXPECT(entry.fsfPreviousTxnID() == uint256{5});
 | 
			
		||||
        BEAST_EXPECT(entry.fsfSignerEntries().size() == 1);
 | 
			
		||||
 | 
			
		||||
        BEAST_EXPECT(
 | 
			
		||||
            entry.fsfSignerEntries()[0].fsfAccount().value() == AccountID{1});
 | 
			
		||||
        BEAST_EXPECT(entry.fsfSignerEntries()[0].fsfSignerWeight() == 2);
 | 
			
		||||
        BEAST_EXPECT(
 | 
			
		||||
            entry.fsfSignerEntries()[0].fsfWalletLocator() == uint256{3});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void
 | 
			
		||||
    testSet()
 | 
			
		||||
    {
 | 
			
		||||
        testcase("testSet");
 | 
			
		||||
        auto new_object = LedgerObjectType<ltSIGNER_LIST>::create(uint256{});
 | 
			
		||||
 | 
			
		||||
        new_object.fsfOwnerNode() = 1;
 | 
			
		||||
        new_object.fsfSignerQuorum() = 2;
 | 
			
		||||
        new_object.fsfSignerListID() = 3;
 | 
			
		||||
        new_object.fsfPreviousTxnLgrSeq() = 4;
 | 
			
		||||
        new_object.fsfPreviousTxnID() = uint256{5};
 | 
			
		||||
        auto signerEntry = new_object.fsfSignerEntries().createItem();
 | 
			
		||||
        signerEntry.fsfAccount() = AccountID{1};
 | 
			
		||||
        signerEntry.fsfSignerWeight() = 2;
 | 
			
		||||
        signerEntry.fsfWalletLocator() = uint256{3};
 | 
			
		||||
        new_object.fsfSignerEntries().push_back(signerEntry);
 | 
			
		||||
 | 
			
		||||
        auto& object = *new_object.getObject();
 | 
			
		||||
 | 
			
		||||
        BEAST_EXPECT(object[sfOwnerNode] == new_object.fsfOwnerNode());
 | 
			
		||||
        BEAST_EXPECT(object[sfSignerQuorum] == new_object.fsfSignerQuorum());
 | 
			
		||||
        BEAST_EXPECT(object[sfSignerListID] == new_object.fsfSignerListID());
 | 
			
		||||
        BEAST_EXPECT(
 | 
			
		||||
            object[sfPreviousTxnLgrSeq] == new_object.fsfPreviousTxnLgrSeq());
 | 
			
		||||
        BEAST_EXPECT(object[sfPreviousTxnID] == new_object.fsfPreviousTxnID());
 | 
			
		||||
        BEAST_EXPECT(
 | 
			
		||||
            object.getFieldArray(sfSignerEntries).size() ==
 | 
			
		||||
            new_object.fsfSignerEntries().size());
 | 
			
		||||
 | 
			
		||||
        auto entries = object.getFieldArray(sfSignerEntries);
 | 
			
		||||
        BEAST_EXPECT(
 | 
			
		||||
            entries[0][sfAccount] ==
 | 
			
		||||
            new_object.fsfSignerEntries()[0].fsfAccount());
 | 
			
		||||
        BEAST_EXPECT(
 | 
			
		||||
            entries[0][sfSignerWeight] ==
 | 
			
		||||
            new_object.fsfSignerEntries()[0].fsfSignerWeight());
 | 
			
		||||
        BEAST_EXPECT(
 | 
			
		||||
            entries[0][sfWalletLocator] ==
 | 
			
		||||
            new_object.fsfSignerEntries()[0].fsfWalletLocator());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void
 | 
			
		||||
    run() override
 | 
			
		||||
    {
 | 
			
		||||
        testGet();
 | 
			
		||||
        testSet();
 | 
			
		||||
        testAccessSTArrayProxy();
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
BEAST_DEFINE_TESTSUITE(TypedLedgerEntries, protocol, ripple);
 | 
			
		||||
}  // namespace ripple
 | 
			
		||||
@@ -156,8 +156,7 @@ public:
 | 
			
		||||
            if (!sleAcct)
 | 
			
		||||
                return false;
 | 
			
		||||
 | 
			
		||||
            SeqProxy const acctSeq =
 | 
			
		||||
                SeqProxy::sequence(sleAcct->getFieldU32(sfSequence));
 | 
			
		||||
            SeqProxy const acctSeq = SeqProxy::sequence(sleAcct.fsfSequence());
 | 
			
		||||
            SeqProxy const seqProx = txn.getSeqProxy();
 | 
			
		||||
 | 
			
		||||
            if (seqProx.isSeq())
 | 
			
		||||
 
 | 
			
		||||
@@ -245,7 +245,7 @@ authorizedDepositPreauth(
 | 
			
		||||
            return tefINTERNAL;  // LCOV_EXCL_LINE
 | 
			
		||||
 | 
			
		||||
        auto [it, ins] =
 | 
			
		||||
            sorted.emplace((*sleCred)[sfIssuer], (*sleCred)[sfCredentialType]);
 | 
			
		||||
            sorted.emplace(sleCred.fsfIssuer(), sleCred.fsfCredentialType());
 | 
			
		||||
        if (!ins)
 | 
			
		||||
            return tefINTERNAL;  // LCOV_EXCL_LINE
 | 
			
		||||
        lifeExtender.push_back(std::move(sleCred));
 | 
			
		||||
 
 | 
			
		||||
@@ -34,10 +34,10 @@ accountInDomain(
 | 
			
		||||
        return false;
 | 
			
		||||
 | 
			
		||||
    // domain owner is in the domain
 | 
			
		||||
    if (sleDomain->getAccountID(sfOwner) == account)
 | 
			
		||||
    if (sleDomain.fsfOwner() == account)
 | 
			
		||||
        return true;
 | 
			
		||||
 | 
			
		||||
    auto const& credentials = sleDomain->getFieldArray(sfAcceptedCredentials);
 | 
			
		||||
    auto const& credentials = sleDomain.fsfAcceptedCredentials();
 | 
			
		||||
 | 
			
		||||
    bool const inDomain = std::any_of(
 | 
			
		||||
        credentials.begin(), credentials.end(), [&](auto const& credential) {
 | 
			
		||||
@@ -67,20 +67,19 @@ offerInDomain(
 | 
			
		||||
    // have any of the following wrong behavior
 | 
			
		||||
    if (!sleOffer)
 | 
			
		||||
        return false;  // LCOV_EXCL_LINE
 | 
			
		||||
    if (!sleOffer->isFieldPresent(sfDomainID))
 | 
			
		||||
    if (!sleOffer.fsfDomainID().has_value())
 | 
			
		||||
        return false;  // LCOV_EXCL_LINE
 | 
			
		||||
    if (sleOffer->getFieldH256(sfDomainID) != domainID)
 | 
			
		||||
    if (sleOffer.fsfDomainID() != domainID)
 | 
			
		||||
        return false;  // LCOV_EXCL_LINE
 | 
			
		||||
 | 
			
		||||
    if (sleOffer->isFlag(lsfHybrid) &&
 | 
			
		||||
        !sleOffer->isFieldPresent(sfAdditionalBooks))
 | 
			
		||||
    if (sleOffer->isFlag(lsfHybrid) && !sleOffer.fsfAdditionalBooks())
 | 
			
		||||
    {
 | 
			
		||||
        JLOG(j.error()) << "Hybrid offer " << offerID
 | 
			
		||||
                        << " missing AdditionalBooks field";
 | 
			
		||||
        return false;  // LCOV_EXCL_LINE
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return accountInDomain(view, sleOffer->getAccountID(sfAccount), domainID);
 | 
			
		||||
    return accountInDomain(view, sleOffer.fsfAccount(), domainID);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace permissioned_dex
 | 
			
		||||
 
 | 
			
		||||
@@ -215,14 +215,14 @@ ammAccountHolds(
 | 
			
		||||
    if (isXRP(issue))
 | 
			
		||||
    {
 | 
			
		||||
        if (auto const sle = view.read(keylet::account(ammAccountID)))
 | 
			
		||||
            return (*sle)[sfBalance];
 | 
			
		||||
            return sle.fsfBalance();
 | 
			
		||||
    }
 | 
			
		||||
    else if (auto const sle = view.read(
 | 
			
		||||
                 keylet::line(ammAccountID, issue.account, issue.currency));
 | 
			
		||||
             sle &&
 | 
			
		||||
             !isFrozen(view, ammAccountID, issue.currency, issue.account))
 | 
			
		||||
    {
 | 
			
		||||
        auto amount = (*sle)[sfBalance];
 | 
			
		||||
        auto amount = sle.fsfBalance();
 | 
			
		||||
        if (ammAccountID > issue.account)
 | 
			
		||||
            amount.negate();
 | 
			
		||||
        amount.setIssuer(issue.account);
 | 
			
		||||
 
 | 
			
		||||
@@ -104,7 +104,7 @@ public:
 | 
			
		||||
            ammSle && ammSle->getFieldAmount(sfLPTokenBalance) != beast::zero)
 | 
			
		||||
            ammLiquidity_.emplace(
 | 
			
		||||
                ctx.view,
 | 
			
		||||
                (*ammSle)[sfAccount],
 | 
			
		||||
                ammSle.fsfAccount(),
 | 
			
		||||
                getTradingFee(ctx.view, *ammSle, ctx.ammContext.account()),
 | 
			
		||||
                in,
 | 
			
		||||
                out,
 | 
			
		||||
@@ -1392,7 +1392,7 @@ BookStep<TIn, TOut, TDerived>::check(StrandContext const& ctx) const
 | 
			
		||||
            auto sle = view.read(keylet::line(*prev, cur, book_.in.currency));
 | 
			
		||||
            if (!sle)
 | 
			
		||||
                return terNO_LINE;
 | 
			
		||||
            if ((*sle)[sfFlags] &
 | 
			
		||||
            if ((*sle.getObject())[sfFlags] &
 | 
			
		||||
                ((cur > *prev) ? lsfHighNoRipple : lsfLowNoRipple))
 | 
			
		||||
                return terNO_RIPPLE;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -421,7 +421,7 @@ DirectIPaymentStep::check(
 | 
			
		||||
 | 
			
		||||
        if (((*sleSrc)[sfFlags] & lsfRequireAuth) &&
 | 
			
		||||
            !((*sleLine)[sfFlags] & authField) &&
 | 
			
		||||
            (*sleLine)[sfBalance] == beast::zero)
 | 
			
		||||
            sleLine.fsfBalance() == beast::zero)
 | 
			
		||||
        {
 | 
			
		||||
            JLOG(j_.warn())
 | 
			
		||||
                << "DirectStepI: can't receive IOUs from issuer without auth."
 | 
			
		||||
 
 | 
			
		||||
@@ -65,17 +65,18 @@ checkFreeze(
 | 
			
		||||
    if (view.rules().enabled(fixFrozenLPTokenTransfer))
 | 
			
		||||
    {
 | 
			
		||||
        if (auto const sleDst = view.read(keylet::account(dst));
 | 
			
		||||
            sleDst && sleDst->isFieldPresent(sfAMMID))
 | 
			
		||||
            sleDst && sleDst.fsfAMMID().has_value())
 | 
			
		||||
        {
 | 
			
		||||
            auto const sleAmm = view.read(keylet::amm((*sleDst)[sfAMMID]));
 | 
			
		||||
            auto const sleAmm =
 | 
			
		||||
                view.read(keylet::amm(sleDst.fsfAMMID().value()));
 | 
			
		||||
            if (!sleAmm)
 | 
			
		||||
                return tecINTERNAL;  // LCOV_EXCL_LINE
 | 
			
		||||
 | 
			
		||||
            if (isLPTokenFrozen(
 | 
			
		||||
                    view,
 | 
			
		||||
                    src,
 | 
			
		||||
                    (*sleAmm)[sfAsset].get<Issue>(),
 | 
			
		||||
                    (*sleAmm)[sfAsset2].get<Issue>()))
 | 
			
		||||
                    sleAmm.fsfAsset().get<Issue>(),
 | 
			
		||||
                    sleAmm.fsfAsset2().get<Issue>()))
 | 
			
		||||
            {
 | 
			
		||||
                return terNO_LINE;
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -109,7 +109,7 @@ AMMBid::preclaim(PreclaimContext const& ctx)
 | 
			
		||||
        return terNO_AMM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto const lpTokensBalance = (*ammSle)[sfLPTokenBalance];
 | 
			
		||||
    auto const lpTokensBalance = ammSle.fsfLPTokenBalance();
 | 
			
		||||
    if (lpTokensBalance == beast::zero)
 | 
			
		||||
        return tecAMM_EMPTY;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -56,7 +56,7 @@ AMMDelete::preclaim(PreclaimContext const& ctx)
 | 
			
		||||
        return terNO_AMM;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto const lpTokensBalance = (*ammSle)[sfLPTokenBalance];
 | 
			
		||||
    auto const lpTokensBalance = ammSle.fsfLPTokenBalance();
 | 
			
		||||
    if (lpTokensBalance != beast::zero)
 | 
			
		||||
        return tecAMM_NOT_EMPTY;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -220,7 +220,7 @@ AMMDeposit::preclaim(PreclaimContext const& ctx)
 | 
			
		||||
    auto balance = [&](auto const& deposit) -> TER {
 | 
			
		||||
        if (isXRP(deposit))
 | 
			
		||||
        {
 | 
			
		||||
            auto const lpIssue = (*ammSle)[sfLPTokenBalance].issue();
 | 
			
		||||
            auto const lpIssue = ammSle.fsfLPTokenBalance().issue();
 | 
			
		||||
            // Adjust the reserve if LP doesn't have LPToken trustline
 | 
			
		||||
            auto const sle = ctx.view.read(
 | 
			
		||||
                keylet::line(accountID, lpIssue.account, lpIssue.currency));
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ CancelCheck::preclaim(PreclaimContext const& ctx)
 | 
			
		||||
 | 
			
		||||
    using duration = NetClock::duration;
 | 
			
		||||
    using timepoint = NetClock::time_point;
 | 
			
		||||
    auto const optExpiry = (*sleCheck)[~sfExpiration];
 | 
			
		||||
    auto const optExpiry = sleCheck.fsfExpiration();
 | 
			
		||||
 | 
			
		||||
    // Expiration is defined in terms of the close time of the parent
 | 
			
		||||
    // ledger, because we definitively know the time that it closed but
 | 
			
		||||
@@ -73,8 +73,8 @@ CancelCheck::preclaim(PreclaimContext const& ctx)
 | 
			
		||||
        // If the check is not yet expired, then only the creator or the
 | 
			
		||||
        // destination may cancel the check.
 | 
			
		||||
        AccountID const acctId{ctx.tx[sfAccount]};
 | 
			
		||||
        if (acctId != (*sleCheck)[sfAccount] &&
 | 
			
		||||
            acctId != (*sleCheck)[sfDestination])
 | 
			
		||||
        if (acctId != sleCheck.fsfAccount() &&
 | 
			
		||||
            acctId != sleCheck.fsfDestination())
 | 
			
		||||
        {
 | 
			
		||||
            JLOG(ctx.j.warn()) << "Check is not expired and canceler is "
 | 
			
		||||
                                  "neither check source nor destination.";
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ CancelOffer::preclaim(PreclaimContext const& ctx)
 | 
			
		||||
    if (!sle)
 | 
			
		||||
        return terNO_ACCOUNT;
 | 
			
		||||
 | 
			
		||||
    if ((*sle)[sfSequence] <= offerSequence)
 | 
			
		||||
    if (sle.fsfSequence() <= offerSequence)
 | 
			
		||||
    {
 | 
			
		||||
        JLOG(ctx.j.trace()) << "Malformed transaction: "
 | 
			
		||||
                            << "Sequence " << offerSequence << " is invalid.";
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@
 | 
			
		||||
#include <xrpl/protocol/STAmount.h>
 | 
			
		||||
#include <xrpl/protocol/STLedgerEntry.h>
 | 
			
		||||
#include <xrpl/protocol/STTx.h>
 | 
			
		||||
#include <xrpl/protocol/TypedLedgerEntries.h>
 | 
			
		||||
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <optional>
 | 
			
		||||
@@ -170,6 +171,13 @@ public:
 | 
			
		||||
    virtual std::shared_ptr<SLE const>
 | 
			
		||||
    read(Keylet const& k) const = 0;
 | 
			
		||||
 | 
			
		||||
    template <LedgerEntryType Type>
 | 
			
		||||
    ConstLedgerObjectType<Type>
 | 
			
		||||
    read(TypedKeylet<Type> const& k) const
 | 
			
		||||
    {
 | 
			
		||||
        return ConstLedgerObjectType<Type>::fromObject(read(k));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Accounts in a payment are not allowed to use assets acquired during that
 | 
			
		||||
    // payment. The PaymentSandbox tracks the debits, credits, and owner count
 | 
			
		||||
    // changes that accounts make during a payment. `balanceHook` adjusts
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@
 | 
			
		||||
#include <xrpl/protocol/Quality.h>
 | 
			
		||||
#include <xrpl/protocol/TER.h>
 | 
			
		||||
#include <xrpl/protocol/TxFlags.h>
 | 
			
		||||
#include <xrpl/protocol/TypedLedgerEntries.h>
 | 
			
		||||
#include <xrpl/protocol/digest.h>
 | 
			
		||||
#include <xrpl/protocol/st.h>
 | 
			
		||||
 | 
			
		||||
@@ -260,9 +261,9 @@ isFrozen(
 | 
			
		||||
    if (issuer != account)
 | 
			
		||||
    {
 | 
			
		||||
        // Check if the issuer froze the line
 | 
			
		||||
        sle = view.read(keylet::line(account, issuer, currency));
 | 
			
		||||
        if (sle &&
 | 
			
		||||
            sle->isFlag((issuer > account) ? lsfHighFreeze : lsfLowFreeze))
 | 
			
		||||
        auto sleLine = view.read(keylet::line(account, issuer, currency));
 | 
			
		||||
        if (sleLine &&
 | 
			
		||||
            sleLine->isFlag((issuer > account) ? lsfHighFreeze : lsfLowFreeze))
 | 
			
		||||
            return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
@@ -320,29 +321,28 @@ isVaultPseudoAccountFrozen(
 | 
			
		||||
 | 
			
		||||
    auto const mptIssuance =
 | 
			
		||||
        view.read(keylet::mptIssuance(mptShare.getMptID()));
 | 
			
		||||
    if (mptIssuance == nullptr)
 | 
			
		||||
    if (mptIssuance.isValid())
 | 
			
		||||
        return false;  // zero MPToken won't block deletion of MPTokenIssuance
 | 
			
		||||
 | 
			
		||||
    auto const issuer = mptIssuance->getAccountID(sfIssuer);
 | 
			
		||||
    auto const issuer = mptIssuance.fsfIssuer();
 | 
			
		||||
    auto const mptIssuer = view.read(keylet::account(issuer));
 | 
			
		||||
    if (mptIssuer == nullptr)
 | 
			
		||||
    if (mptIssuer.isValid())
 | 
			
		||||
    {  // LCOV_EXCL_START
 | 
			
		||||
        UNREACHABLE("ripple::isVaultPseudoAccountFrozen : null MPToken issuer");
 | 
			
		||||
        return false;
 | 
			
		||||
    }  // LCOV_EXCL_STOP
 | 
			
		||||
 | 
			
		||||
    if (!mptIssuer->isFieldPresent(sfVaultID))
 | 
			
		||||
    if (!mptIssuer.fsfVaultID().has_value())
 | 
			
		||||
        return false;  // not a Vault pseudo-account, common case
 | 
			
		||||
 | 
			
		||||
    auto const vault =
 | 
			
		||||
        view.read(keylet::vault(mptIssuer->getFieldH256(sfVaultID)));
 | 
			
		||||
    if (vault == nullptr)
 | 
			
		||||
    auto const vault = view.read(keylet::vault(*mptIssuer.fsfVaultID()));
 | 
			
		||||
    if (vault.isValid())
 | 
			
		||||
    {  // LCOV_EXCL_START
 | 
			
		||||
        UNREACHABLE("ripple::isVaultPseudoAccountFrozen : null vault");
 | 
			
		||||
        return false;
 | 
			
		||||
    }  // LCOV_EXCL_STOP
 | 
			
		||||
 | 
			
		||||
    return isAnyFrozen(view, {issuer, account}, vault->at(sfAsset), depth + 1);
 | 
			
		||||
    return isAnyFrozen(view, {issuer, account}, vault.fsfAsset(), depth + 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
 
 | 
			
		||||
@@ -937,7 +937,20 @@ chooseLedgerEntryType(Json::Value const& params)
 | 
			
		||||
            std::tuple<char const*, char const*, LedgerEntryType>>({
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRY")
 | 
			
		||||
#undef LEDGER_ENTRY
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRY_FIELD")
 | 
			
		||||
#undef LEDGER_ENTRY_FIELD
 | 
			
		||||
#pragma push_macro("DEFINE_LEDGER_ENTRY_FIELDS")
 | 
			
		||||
#undef DEFINE_LEDGER_ENTRY_FIELDS
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRIES_BEGIN")
 | 
			
		||||
#undef LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#pragma push_macro("LEDGER_ENTRIES_END")
 | 
			
		||||
#undef LEDGER_ENTRIES_END
 | 
			
		||||
 | 
			
		||||
#define LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#define LEDGER_ENTRIES_END
 | 
			
		||||
 | 
			
		||||
#define DEFINE_LEDGER_ENTRY_FIELDS(...) ({__VA_ARGS__})
 | 
			
		||||
#define LEDGER_ENTRY_FIELD(...) {__VA_ARGS__},
 | 
			
		||||
#define LEDGER_ENTRY(tag, value, name, rpcName, fields) \
 | 
			
		||||
    {jss::name, jss::rpcName, tag},
 | 
			
		||||
 | 
			
		||||
@@ -945,6 +958,14 @@ chooseLedgerEntryType(Json::Value const& params)
 | 
			
		||||
 | 
			
		||||
#undef LEDGER_ENTRY
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY")
 | 
			
		||||
#undef LEDGER_ENTRY_FIELD
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRY_FIELD")
 | 
			
		||||
#undef DEFINE_LEDGER_ENTRY_FIELDS
 | 
			
		||||
#pragma pop_macro("DEFINE_LEDGER_ENTRY_FIELDS")
 | 
			
		||||
#undef LEDGER_ENTRIES_BEGIN
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRIES_BEGIN")
 | 
			
		||||
#undef LEDGER_ENTRIES_END
 | 
			
		||||
#pragma pop_macro("LEDGER_ENTRIES_END")
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        auto const& p = params[jss::type];
 | 
			
		||||
 
 | 
			
		||||
@@ -244,7 +244,7 @@ doLedgerGrpc(RPC::GRPCContext<org::xrpl::rpc::v1::GetLedgerRequest>& context)
 | 
			
		||||
                        auto sle = std::make_shared<SLE>(SerialIter{blob}, k);
 | 
			
		||||
                        if (!sle->isFieldPresent(sfOwner))
 | 
			
		||||
                        {
 | 
			
		||||
                            auto bookBase = keylet::quality({ltDIR_NODE, k}, 0);
 | 
			
		||||
                            auto bookBase = keylet::quality({k}, 0);
 | 
			
		||||
                            if (!inBase && inDesired)
 | 
			
		||||
                            {
 | 
			
		||||
                                auto firstBook =
 | 
			
		||||
 
 | 
			
		||||
@@ -95,7 +95,8 @@ doVaultInfo(RPC::JsonContext& context)
 | 
			
		||||
    auto const sleVault = lpLedger->read(keylet::vault(uNodeIndex));
 | 
			
		||||
    auto const sleIssuance = sleVault == nullptr  //
 | 
			
		||||
        ? nullptr
 | 
			
		||||
        : lpLedger->read(keylet::mptIssuance(sleVault->at(sfShareMPTID)));
 | 
			
		||||
        : lpLedger->read(
 | 
			
		||||
              keylet::mptIssuance(sleVault->at(sfShareMPTID)).untyped());
 | 
			
		||||
    if (!sleVault || !sleIssuance)
 | 
			
		||||
    {
 | 
			
		||||
        jvResult[jss::error] = "entryNotFound";
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user