{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["amendment-disclaimer"]},"redocly_category":"Documentation","type":"markdown"},"seo":{"title":"Mutable MPTs","siteUrl":"https://xrpl.org/","llmstxt":{"hide":false,"title":"XRPL Developer Portal & Documentation","description":"Explore XRP Ledger documentation, blogs, and other blockchain developer resources needed to start building and integrating with the ledger.","details":{"content":"XRP Ledger concepts, use cases, tutorials, references, and other blockchain developer resources. Also, stay up to date with release announcements and more through the XRPL Blog."},"sections":[{"title":"Introduction","description":"A high-level introduction to the XRP Ledger.","includeFiles":["docs/introduction/**/*.*","about/faq.md"],"excludeFiles":["docs/introduction/index.md"]},{"title":"Use Cases","description":"Real-world applications and business scenarios for the XRP Ledger.","includeFiles":["docs/use-cases/**/*.*"],"excludeFiles":["docs/use-cases/index.md","docs/use-cases/defi/index.md"]},{"title":"Agentic Transactions","description":"XRPL AI Starter Kit to help autonomous agents discover, set up, and execute agentic transactions on the XRP Ledger.","includeFiles":["docs/agents/**/*.*"],"excludeFiles":[]},{"title":"Concepts","description":"Core concepts including accounts, tokens, transactions, consensus, and more.","includeFiles":["docs/concepts/**/*.*"],"excludeFiles":["docs/concepts/index.md","docs/concepts/decentralized-storage/index.md","docs/concepts/payment-types/index.md"]},{"title":"Tutorials","description":"Step-by-step guides for building on the XRP Ledger in JavaScript, Python, Go, and more.","includeFiles":["docs/tutorials/**/*.*"],"excludeFiles":[]},{"title":"References","description":"Protocol specification, transaction types, ledger entries, and API methods.","includeFiles":["docs/references/**/*.*"],"excludeFiles":["docs/references/xrp-api.md","docs/references/data-api.md","docs/references/protocol/index.md","docs/references/protocol/ledger-data/ledger-entry-types/index.md","docs/references/protocol/transactions/index.md","docs/references/protocol/transactions/types/index.md","docs/references/http-websocket-apis/api-conventions/index.md","docs/references/http-websocket-apis/public-api-methods/*/index.md","docs/references/http-websocket-apis/admin-api-methods/*/index.md"]},{"title":"Infrastructure","description":"Install, configure, and troubleshoot xrpld and Clio servers.","includeFiles":["docs/infrastructure/**/*.*"],"excludeFiles":["docs/infrastructure/index.md","docs/infrastructure/*/index.md","docs/infrastructure/installation/build-run-xrpld-in-reporting-mode.md","docs/infrastructure/configuration/data-retention/index.md","docs/infrastructure/configuration/server-modes/index.md"]},{"title":"Blog (2023+)","description":"Recent XRPL Blog posts (showing 2023 and newer).","includeFiles":["blog/2023/**/*.*","blog/2024/**/*.*","blog/2025/**/*.*","blog/2026/**/*.*"],"excludeFiles":[]},{"title":"Resources","description":"Developer resources and contribution guidelines.","includeFiles":["resources/**/*.*"],"excludeFiles":["resources/index.md"]}],"excludeFiles":[]},"description":"The DynamicMPT amendment lets issuers create an MPT with mutable properties, so they can be updated later as business needs evolve."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"mutable-mpts","__idx":0},"children":["Mutable MPTs"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/resources/known-amendments#dynamicmpt"},"children":["DynamicMPT amendment"]}," extends ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/concepts/tokens/fungible-tokens/multi-purpose-tokens"},"children":["Multi-Purpose Tokens (MPTs)"]}," by making specific properties of an MPT mutable by ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["default"]},": the on-chain metadata, the transfer fee, and the ability to enable ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/ledger-data/ledger-entry-types/mptokenissuance#mptokenissuance-flags"},"children":["MPT issuance flags"]},". This allows issuers to update the specified properties later as business needs evolve. For example, an issuer might need to adjust the transfer fee based on market conditions, update token metadata, or enable trading functionality."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Issuers can make these properties ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["immutable"]}," by explicitly declaring which of them can't be modified, either when they create the MPT issuance or later. Any of the properties not declared immutable stay mutable. All other data set at issuance, such as the asset scale and maximum amount, is fixed and can't be changed for the life of the token."]},{"$$mdtype":"Tag","name":"AmendmentDisclaimer","attributes":{"name":"DynamicMPT","compact":false,"statusOnly":false,"mode":""},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"modifying-mpt-properties","__idx":1},"children":["Modifying MPT Properties"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Issuers can change mutable properties with the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/transactions/types/mptokenissuanceset"},"children":["MPTokenIssuanceSet transaction"]},", which allows them to update token metadata, change the transfer fee, and enable one or more MPT issuance flags at once."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Each MPT issuance flag adds a capability, such as allowing holders to trade the token or letting the issuer claw back tokens. Enabling an MPT issuance flag is a ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["one-way"]}," operation, which means once an MPT issuance flag is enabled, no subsequent transaction can disable it."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"making-mpt-properties-immutable","__idx":2},"children":["Making MPT Properties Immutable"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To make a property immutable, the issuer declares it in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImmutableFlags"]}," field. An issuer can do this when creating the MPT issuance with the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/transactions/types/mptokenissuancecreate"},"children":["MPTokenIssuanceCreate transaction"]},", or at a later time with the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/transactions/types/mptokenissuanceset"},"children":["MPTokenIssuanceSet transaction"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImmutableFlags"]}," is additive. Each declaration adds to the properties already fixed on the issuance, never replaces them, and can never be cleared. This lets an issuer figure out a token's design in stages. For example, an issuer could make the metadata immutable once its content is final, while leaving the transfer fee open to change for longer."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The issuer can enable an MPT issuance flag and make it immutable in the same transaction. For the full list of fields and flags that can be made immutable, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/ledger-data/ledger-entry-types/mptokenissuance#mptokenissuance-immutable-flags"},"children":["MPTokenIssuance Immutable Flags"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"security-considerations","__idx":3},"children":["Security Considerations"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A few rules govern how an MPT's properties can change:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Only the issuer of the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/ledger-data/ledger-entry-types/mptokenissuance"},"children":["MPTokenIssuance entry"]}," can modify its properties, enable MPT issuance flags, or declare fields and flags immutable."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Because the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImmutableFlags"]}," field is never cleared, a property made immutable by an ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/transactions/types/mptokenissuanceset"},"children":["MPTokenIssuanceSet transaction"]}," stays immutable regardless of who submits subsequent transactions."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["MPT issuance flags are one-way and can't be disabled once enabled. Enabling a flag and immediately making it immutable via ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ImmutableFlags"]}," in the same transaction is supported and introduces no additional risk: the flag was already permanent once enabled, so making it immutable merely records that fact rather than changing what is achievable."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"see-also","__idx":4},"children":["See Also"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Concepts:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/concepts/tokens/fungible-tokens/multi-purpose-tokens"},"children":["Multi-Purpose Tokens"]}]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Tutorials:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/tutorials/tokens/mpts/issue-a-multi-purpose-token"},"children":["Issue a Multi-Purpose Token"]}]}]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["References:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/transactions/types/mptokenissuancecreate"},"children":["MPTokenIssuanceCreate transaction"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/transactions/types/mptokenissuanceset"},"children":["MPTokenIssuanceSet transaction"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/docs/references/protocol/ledger-data/ledger-entry-types/mptokenissuance"},"children":["MPTokenIssuance entry"]}]}]}]}]}]},"headings":[{"value":"Mutable MPTs","id":"mutable-mpts","depth":1},{"value":"Modifying MPT Properties","id":"modifying-mpt-properties","depth":2},{"value":"Making MPT Properties Immutable","id":"making-mpt-properties-immutable","depth":2},{"value":"Security Considerations","id":"security-considerations","depth":2},{"value":"See Also","id":"see-also","depth":2}],"frontmatter":{"seo":{"description":"The DynamicMPT amendment lets issuers create an MPT with mutable properties, so they can be updated later as business needs evolve.","title":"Mutable MPTs"},"labels":["Tokens","MPTs","Multi-purpose Tokens"],"status":"not_enabled"},"editPage":{"to":"https://github.com/XRPLF/xrpl-dev-portal/tree/master/docs/concepts/tokens/fungible-tokens/mutable-mpts.md"},"lastModified":"2026-07-24T11:26:34.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/docs/concepts/tokens/fungible-tokens/mutable-mpts","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}