Meta XLS: XLS Process and Guidelines #340
Replies: 4 comments 14 replies
-
|
I welcome this proposal. The categorisation of XLS types and the defined states, stages, and lifecycles are excellent. They clear up a lot of past ambiguity, and assuming GitHub can support filtering by these categories and statuses, I think this will be a very positive improvement. The level of detail required for a Draft is rigorous, which I see as mostly positive — if someone can’t meet those requirements, they are unlikely to be able to deliver the build. That said, it may be helpful to highlight a lighter path for early contributors, with the expectation that more detail is added as the spec matures. If not editors, should be prepared to help the proposer enhance their document to the point of compliance to ensure we do not unnecessarily lose contributors or their contributions due to the high bar being set by the spec. I also like the clear lifecycle states. Most of them are not permanent, which is good, though I note Withdrawn is intended to be final. One refinement might be to consider a stage between Draft and Final, to indicate when a proposal is set and actively being worked on, but not yet merged. Since “draft” often implies something unfinished, introducing a stage that signals “actively worked on / broadly agreed” could help distinguish the stage an amendment has reached, right now it would be difficult to know. On editors, I support their role as facilitators rather than decision-makers. To build confidence further, it might help to outline safeguards or escalation routes if an author feels their proposal isn’t being treated fairly. Finally, the staleness rules are a sensible way to keep the repo tidy. Since inactivity periods differ I’d suggest notifying authors as they approach the limit and giving them a simple way to extend if progress is ongoing but slower than expected. This would reduce frustration and prevent confusion. Overall, this framework is a strong step forward, and I’m very supportive. I hope my input is helpful. |
Beta Was this translation helpful? Give feedback.
-
|
Initial thoughts:
Regarding the almost-state machine (process, status) - I wonder if we can make it just a little less complex, thoughts: Idea+Discussion are actually one and the same? Anything can be a discussion, any discussion is some kind of idea? I think technically there are just four~five stages At any stage (except for final) things can become stagnant, at any stage they can be withdrawn, at any stage they can be living. I guess the other things are simply traits/flags? |
Beta Was this translation helpful? Give feedback.
-
|
Add a date format for |
Beta Was this translation helpful? Give feedback.
-
|
This spec has been updated today, 2025-09-30. Changelog:
|
Beta Was this translation helpful? Give feedback.

Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Meta XLS: XLS Process and Guidelines
title: XLS Process and Guidelines description: Formalizes the process and structure for XRP Ledger Standards author: Mayukha Vadari (@mvadari), Vito Tumas (@Tapanito) status: Proposal category: Meta created: 2025-08-29 updated: 2025-09-301. Abstract
This document formalizes the XRP Ledger Standards (XLS) process, clarifying categories of standards, defining their lifecycle, and establishing editorial responsibilities. It:
Amendment,System,Ecosystem, andMeta- to resolve ambiguity between protocol-level changes and community-driven conventions.Inspired by Ethereum’s EIP-1, this proposal adapts established standards processes to the unique needs of the XRPL ecosystem, ensuring transparency, accountability, and long-term maintainability of the standards that guide XRPL development.
2. Motivation
The existing XLS process lacks clarity and consistency. In practice, “XLS” has been used to describe both protocol-level amendments and off-chain community standards, leading to confusion within the ecosystem. Furthermore, the lack of a formalized lifecycle, staleness rules, and editorial responsibilities has made it difficult to track proposals, maintain quality, and ensure transparency. This document introduces structure to the process, aligning the XLS process with proven practices from other ecosystems (most notably Ethereum’s EIPs), while tailoring them to the needs of the XRPL community.
3. XLS Categories
The name “XLS” can often get confusing, since it can refer to something that is an amendment (e.g. XLS-20 for the NFT amendment) or something that is a community standard and does not have any on-chain enforcement (e.g. XLS-24 for the NFT metadata standard). Ethereum disambiguates these with EIPs vs ERCs, for example.
This document proposes splitting XLSes into four categories: Amendment, System, Ecosystem, and Meta. Each category will be a selectable “category” when creating a discussion.
3.1. Amendment XLSes
This category contains standards that would require an amendment. Every feature amendment must have an XLS associated with it.
Some examples:
3.2. System XLSes
This category contains standards that would not require an amendment, but do affect some other part of the XRPL protocol. This includes RPCs, the p2p protocol, or similar. This involves core-level code changes in rippled.
Every major system-level design change should have an XLS associated with it.
Some examples:
simulate)3.3. Ecosystem XLSes
This category contains standards that pertain to the community or off-chain data, such as metadata standards.
Some examples:
3.4. Meta XLSes
This category contains standards that pertain to XLSes themselves, such as this document.
4. XLS Process
Every XLS must have a status included in its heading:
FinalXLS exists in a state of finality and should only be updated to correct errata and add non-normative clarifications. For rippled-related XLSes, the XLS can only be consideredFinalonce the rippled PR has been merged. For other XLSes, there needs to be at least one project that has implemented full support of the Standard.Finalfeature may beDeprecated.Draftif inactive for a period of 6 months or greater is moved toStagnant. An XLS may be resurrected from this state by Authors or XLS Editors through moving it back to Draft.Note: the “Review” and “Last Call” statuses have been removed from those listed in EIP-1, as we do not have formal processes established for review for XLSes (e.g. Core EIPs need to be approved by all client implementations). This may be re-added in the future, if such processes are desired.
4.1. Format: Ideas
There are no formatting requirements for Ideas.
4.2. Format: Proposals
The main formatting requirement for a
Proposalis that its title must include its category - e.g.Meta XLS: XLS Process and Guidelines. It must generally be in the format of aDdraftand should contain most of the sections required forDrafts, as this will makeDraftgeneration easier later and distinguishesProposals fromIdeas, but does not need to be a full-fledgedDraft.4.3. Format: Drafts and Onward
Any XLS that wants to be considered for
Draftstatus should have the following parts:../xls-###/<filename>directory, where###refers to the XLS number. An implementation test plan is mandatory for XLSes that affect rippled. This section may be omitted for Ecosystem and Meta proposals.FinalXLS must include a link to the rippled PR(s)/commit(s).Security Considerationssection will be rejected. An XLS cannot proceed to statusFinalwithout aSecurity Considerationsdiscussion deemed sufficient by the reviewers.All sections must be filled out with reasonable completeness and effort.
4.3.1. Preamble
Each XLS must begin with an RFC 822 style header preamble, contained in a
<pre>HTML block. The headers must appear in the following order.xls: XLS number (assigned by the Editors - this field must not be included inIdeas orProposals). This field should only contain the number and nothing else.title: The XLS title is a few words, not a complete sentence. This field should only contain the title, not anXLSprefix or the XLS number.description: Description is one full (short) sentenceimplementation: A link to therippled(or other repo) PR associated with the spec, if applicable. This must be included forAmendmentandSystemproposals for them to be consideredFinal.author: The list of the author’s or authors’ name(s) and/or username(s), or name(s) and email(s).category: One ofAmendment,System,Ecosystem, orMeta.status:Draft,Final,Living,Deprecated,Stagnant,Withdrawnwithdrawal-reason: A sentence explaining why the XLS was withdrawn. (Optional field, only needed when status is Withdrawn. If this proposal was superseded by another, that can be listed here.)proposal-from: A link to theProposalassociated with this XLS. This field may be excluded from old standards (due to processes changing over time) but must be included in any new XLS (as there must be aProposalbefore a PR is created).requires: XLS number(s) (Optional field)created: The date the XLS was created on.updated: The date the XLS was last updated.Headers that permit lists must separate elements with commas.
Headers requiring dates will always do so in the format of ISO 8601 (yyyy-mm-dd).
4.4. Format: Amendment XLS
An amendment usually introduces a set of semantically coherent ledger objects and transactions. The specification must make clear the purpose, introduced ledger entries and transactions. Optionally, the amendment specification can introduce new APIs, and include an optional F.A.Q.
Note: all fields specified above in the “Drafts and Onward” section must also be included here.
4.4.1. Index
A Markdown index to make navigating a long specification easier. This field is optional and left to the author’s discretion.
4.4.2. Introduction
A section to succinctly introduce the protocol that the amendment introduces.
4.4.3. Specification
The technical specification describing the syntax and semantics of a new feature. The specification should be detailed enough to allow competing, interoperable implementations. See below for details.
This will be codified in a template later.
4.4.3.1. Serialized Types
Serialized Typesdocuments one or more new "serialized types" (or STypes) introduced or modified by the specification. Most specifications will not need such sections, as the existing types are generally enough. Each SType must be in its own numbered section, with the following subsections:4.4.3.1.1.
STypevalueEach SType has its own unique value associated with it, so that when an object is being deserialized, the deserializer knows which decoder to use. The current values are specified here.
4.4.3.1.2. JSON Representation
This subsection describes how an instance of the new SType will be represented in JSON (which is how most users will see and interact with it). For example, an
STAccountis represented as an r-addressstring.4.4.3.1.3. Additional Accepted JSON Inputs
This optional subsection describes additional JSON representations may be parsed. For example, a
UInt32can be passed in as anint, auint, or astring, even though its output is always auint.4.4.3.1.4. Binary Encoding
This subsection describes how an instance of the new SType will be encoded or serialized in binary. For example, this describes how an
STAccountis serialized.4.4.3.1.5. Example JSON and Binary Encoding
Provide JSON and binary examples for what this SType will look like.
4.4.3.2. Ledger Entries
Ledger Entriesdocuments one or more new ledger entry objects introduced or modified by the specification. Each ledger entry must be in its own numbered section, with the following subsections:4.4.3.2.1. Object Identifier
Each object on the XRP Ledger must have a unique object identifier (ID or key). The ID for a given object within the ledger is calculated using "tagged hashing". This involves hashing some object-specific parameters along with a type-specific prefix called the
key space(a 16-bit value) to ensure that different objects have different IDs, even if they use the same set of parameters The key space is given as ahexrepresentation in the specification. This section introduces the key space and the algorithm for how to calculate a unique object identifier. It is critical that the algorithm does not create collisions between two objects.4.4.3.2.2. Fields
This subsection describes the ledger entry fields in a tabular format, indicating whether a field is constant or optional, its JSON type (for reference, actual storage is binary), Internal Type, and Default Value. The field table MUST include all standard ledger entry fields (like
LedgerEntryType,Flags,PreviousTxnID,PreviousTxnLgrSeq,OwnerNode) as well as fields unique to the ledger entry. TheAccountfield is typical for objects owned by a single account.These columns must all be included in the table:
PascalCasenaming convention. For existing field names (and their associated types), please refer tosfields.macro. A rule of thumb is to reuse already existing fields whenever possible and sensible.UINT16,ACCOUNT,HASH256). Internal types must be in all capital letters. Please refer tosfields.macrofor a list of existing internal types.N/A: The field does not have a default value or is always required.The table may be followed by subsections for fields requiring further details that are too long for the Description column.
4.4.3.2.3. Ownership
All XRP Ledger objects must have an owner. The owner is an
AccountRootobject, and the ownership relationship is typically established by adding the object's ID to anOwnerDirectoryledger entry associated with the owner's account. This subsection captures whichAccountRootobject'sOwnerDirectorythe ledger entry is registered. A single ledger entry may be linked from one or more uniqueDirectoryNodepages, usually under oneOwnerDirectory.Note: there are a handful of object types (such as
FeeSettings) that don’t have an owner. If an amendment is of that ilk, that should be specified in this section.4.4.3.2.4. Reserves
Creating ledger entries typically requires an increase in the owner's XRP reserve to discourage ledger bloat and account for the cost of storage. Each new ledger entry directly owned by an account typically increments the owner reserve by one unit (currently 0.2 XRP, as of last check, but subject to change by Fee Voting). This section should confirm whether this standard behavior applies or specify any deviations.
4.4.3.2.5. Deletion
This subsection captures the conditions under which the ledger entry can be deleted from the ledger. It should specify:
AccountRoot(i.e., whether it must be deleted before the account can be deleted).4.4.3.2.6. Pseudo-Account
This section is optional. A "pseudo-account" might be associated if the newly introduced ledger entry needs to hold assets (XRP, IOUs or MPTs) or issue tokens (e.g., MPTs). A pseudo-account is a programmatically derived
Accountthat cannot submit transactions, send or receive funds directly via standard payments, or have a key pair. For further details about pseudo-accounts, refer to XLS-64 (or the relevant accepted standard). This section should specify if a pseudo-account is used, how itsAccountIDis derived, and its purpose.4.4.3.2.7. Freeze/Lock
This section is optional. If the protocol holds assets on behalf of other users, it must comply with the existing compliance features
Freeze,Deep Freezefor IOUs andLockingfor MPTs. This section describes how said freezing is handled.4.4.3.2.8. Invariants
Invariants are logical statements that MUST be true of a ledger entry's state before and after the execution of any transaction (whether successful or not). They help ensure that no transaction leads to an invalid or inconsistent ledger state. Use
<object>for the state before and<object>'(see the added grave) for the state after.4.4.3.2.9. RPC Name
In RPCs like
account_objectsandledger_data, a short,snake_caseform of the name of a ledger entry is accepted in thetypeparameter, to filter the ledger entries returned by type. This section should specify that version of the entry's name.4.4.3.2.10. Example JSON
Provide JSON examples for what the ledger object will look like.
4.4.3.3. Transactions
This section details new or modified transactions introduced by the specification.
Transaction names should be descriptive, often taking the form of
<LedgerEntryName><Verb>, where:<LedgerEntryName>is the name of the ledger entry the transaction primarily interacts with (e.g.,Example). *<Verb>identifies the action of this transaction (e.g.,Set,Delete,Invoke).One example of this naming convention is
ExampleSetandExampleDelete. Most specifications introducing new objects will have at least:<Object>Set(or<Object>Createand<Object>Updateif distinct complex logic): A transaction to create or update an object.<Object>Delete: A transaction to delete the object.The following subsections must be included in a
Transactionsection.4.4.3.3.1. Fields
This section outlines transaction fields, provides details about them, defines special logic, failure conditions, and state changes. This table should list fields specific to this transaction. Common transaction fields (e.g.,
Account,Fee,Sequence,Flags(common transaction flags),SigningPubKey,TxnSignature) are assumed unless their usage has special implications for this transaction type.The following columns should be included:
PascalCasenaming convention. For existing field names (and their associated types), please refer tosfields.macro. A rule of thumb is to reuse already existing fields whenever possible and sensible.string,number,object,array).rippledfor all internal types (e.g.,UINT16,ACCOUNT,HASH256). Internal types must be in all capital letters. Please refer tosfields.macrofor a list of existing internal types.N/Aif none or always required.4.4.3.3.2. Transaction Fee
Submitting a transaction typically requires paying a transaction fee. A typical transaction costs 10 drops as of last check (subject to change by Fee Voting). This section should confirm whether this standard behavior applies or specify any deviations.
4.4.3.3.3. Failure Conditions
This section describes the conditions under which the transaction will fail. This must be an exhaustive, descriptive list. Each condition should ideally map to a specific error code. The list should be indexed for easy reference.
When using the same transaction to create and update an object, the expected behavior is identified by the presence or absence of the object identifier (e.g.,
tx.ExampleID).In case of a transaction failure, an XRP Ledger server returns an error code indicating the outcome. These codes are crucial for clients to understand why a transaction was not successful. Please refer to the documentation for existing error codes. When defining failure conditions for a new transaction type in an XLS, reuse existing codes whenever an existing code accurately describes the failure condition. This helps maintain consistency and avoids unnecessary proliferation of codes.
If the new transaction logic introduces novel failure reasons not adequately covered by existing generic codes, a new error code (usually a
teccode) should be proposed. This new code must be clearly defined and justified and would eventually be added to rippled if the XLS is adopted. XLS authors will primarily define error codes for their specific transaction logic failures.4.4.3.3.4. State Changes
This section describes the changes made to the ledger state if the transaction executes successfully. It should omit default state changes common to all transactions (e.g., fee processing, sequence number increment, setting
PreviousTxnID/PreviousTxnLgrSeqon modified objects). Indexed for clarity. A successfully applied transaction must return atesSUCCESScode.4.4.3.3.5. Metadata Fields
This section describes any additions or modifications (synthetic or otherwise) to the transaction metadata. This section must not be included if the transaction does not make any such additions or modifications.
The following columns should be included in the table:
PascalCasenaming convention, while synthetic fields follow thesnake_casenaming convention. For existing field names (and their associated types), please refer tosfields.macroandjss.h. A rule of thumb is to reuse already existing fields whenever possible and sensible.DeliveredAmount)nftoken_id)string,number,object,array).4.4.3.3.6. Example JSON
Provide JSON examples for transaction submission.
4.4.3.4. Permissions
This section details new or modified granular account permissions introduced by the specification.
No subsections are required for this section. The section must mention what transaction type(s) this granular permission applies to, and what the scope of the granular permission is.
The new transaction type permissions are implied by the addition of the transaction.
4.4.3.5. API/RPCs
New amendments often introduce new APIs or modify existing APIs. Those API descriptions should also be outlined in a spec. APIs are how developers and users will be interacting with the new feature, so it is important to achieve consensus on the format and fields (especially since a breaking change would require bumping the API version).
For each new API added (or modified), these sections should be included:
4.4.3.5.1. Request Fields
snake_casenaming convention. For existing field names, please refer tojss.h. A rule of thumb is to reuse already existing fields whenever possible and sensible.string,number,object,array).4.4.3.4.2. Response Fields
PascalCasenaming convention. For existing field names (and their associated types), please refer tosfields.macro. A rule of thumb is to reuse already existing fields whenever possible and sensible.string,number,object,array).4.4.3.5.3. Failure Conditions
This section describes the conditions under which the API will fail. This must be an exhaustive, descriptive list. Each condition should ideally map to a specific error code. The list should be indexed for easy reference.
In case of an API failure, an XRP Ledger server returns an error code and error message indicating the outcome. These codes and messages are crucial for clients to understand why an API was not successful. Please refer to the documentation for what this looks like. When defining failure conditions for a new API in an XLS, reuse existing codes whenever an existing code accurately describes the failure condition. This helps maintain consistency and avoids unnecessary proliferation of codes.
If the new API logic introduces novel failure reasons not adequately covered by existing generic codes, a new error code should be proposed. This new code must be clearly defined and justified and would eventually be added to rippled if the XLS is adopted. XLS authors will primarily define error codes for their specific API logic failures.
4.5. Stale Proposals/Ideas
All discussions will be checked for staleness after 90 days, and if no one responds for another 30 days, the discussion will be closed and locked. The author can reach out to the repo maintainers to reopen the issue at a later date, if desired.
The repo could use this Github Action to enforce this rule automatically.
5. XLS Ownership
The XLS author writes the XLS. By default, the author is also the owner and champion, who shepherds the discussions and builds community consensus around the idea. At any time, the author can choose a different champion for the XLS.
5.1. Transferring XLS Ownership
It occasionally becomes necessary to transfer ownership of XLSes to a new champion. In general, we’d like to retain the original author as a co-author of the transferred XLS, but that’s really up to the original author. A good reason to transfer ownership is because the original author no longer has the time or interest in updating it or following through with the XLS process, or has fallen off the face of the 'net (i.e. is unreachable or isn’t responding to email). A bad reason to transfer ownership is because you don’t agree with the direction of the XLS. We try to build consensus around an XLS, but if that’s not possible, you can always submit a competing XLS.
If you are interested in assuming ownership of an XLS, send a message asking to take over, addressed to both the original author and the XLS editor. If the original author doesn’t respond to the email in a timely manner, the XLS editor will make a unilateral decision, which can be reversed if needed.
6. XLS Editors
XLS Editors are those that have at least “write” access to the XRPL-Standards repository.
6.1. XLS Editor Responsibilities
The editors don’t pass judgment on XLSes. They merely do the administrative & editorial part.
For each new XLS that comes in, an editor does the following:
Once the XLS is ready to be merged, the XLS editor will:
The following is a non-exhaustive list of what editors do and don’t:
6.1.1. What Editors Do
The editors’ mission is to serve the broad XRP Ledger community, both present and future, by:
6.1.2. What Editors Don’t Do
On the other hand, editors do not:
6.1.3. Membership
Anyone may apply to join as an XLS Editor. Specific eligibility requirements are left to individual current XLS Editors, but the general requirements are:
XLS Editors are expected to meet these requirements throughout their tenure, and not doing so is grounds for removal. Any member may delegate some or all of their responsibilities/powers to tools and/or to other people.
6.2. Current Editors
The current XLS editors are:
7. Rationale
The design of this process balances familiarity with existing standards frameworks and the specific needs of the XRPL community.
The categories ensure that it’s easy to distinguish between the very different types of XLSes. An Ecosystem XLS has very different implications compared to an Amendment XLS, and previously they were all under the same umbrella.
The more formalized statuses and process make it easier for XLS writers to understand what their specs need to look like and how to move them along the process, and make it easier for XLS readers to understand what the current status of the spec is.
Automatic closure of inactive discussions ensures the process remains active and reduces noise in the repository, while allowing authors to revive proposals at any time.
Editors are now explicitly not decision-makers but facilitators, ensuring decentralization and preventing gatekeeping.
8. Security Considerations
This proposal does not directly alter XRPL consensus or protocol behavior and therefore carries minimal direct security risks.
However, governance processes themselves can affect the security of the ecosystem. By formalizing categories, statuses, and editor responsibilities, this document mitigates risks of ambiguity, miscommunication, and fragmentation that could otherwise lead to competing or unclear implementations. Transparent rules for authorship, ownership transfer, and editor conduct further reduce the risk of malicious exploitation of unclear standards governance.
9. History
This document was derived heavily from Ethereum’s EIP-1 (written by Martin Becze and Hudson Jameson et al) and EIP-5069 (written by Pooja Ranjan, Gavin John, Sam Wilson, et al), which in turn was derived from Bitcoin’s BIP-0001 and Python’s PEP-0001. In many places text was simply copied and modified. None of the people involved with those precursors are responsible for its use in the XRP Ledger Standards process, and should not be bothered with technical questions specific to the XRPL or the XLS. Please direct all comments to the XLS editors.
Some previous conversations on this topic in this repo, in no particular order:
Appendix
Appendix A: Changelog from the Existing System
Appendix B: FAQ
B.1: How can I create a PR for a new XLS if I don’t know the number?
With EIPs, the PR author creates a PR with a document titled
eip-draft.md, and there is a bot that informs the author what number they have been assigned. This repo can implement a similar setup (e.g. createXLS-draft/README.md).The initial rollout of this system will probably involve a maintainer assigning numbers instead of a bot.
B.2: What do we do about the unused numbers in the middle, like XLS-36?
They are simply skipped. This way, XLS numbers are roughly incrementing in order of time of assignment.
B.3: What will happen to existing XLS numbers that Discussions have already claimed?
Those will remain with those discussions, to avoid confusion. The process proposed in this document will, if consensus agrees, be applied to future
Proposals andIdeas.B.4: What will happen to XLSes that have already been written and merged into the repo?
They will be grandfathered in for now. Ideally someone (perhaps with the help of an AI) will go back and update them to match the desired format.
Beta Was this translation helpful? Give feedback.
All reactions