Add MPTs to xrpl.org docs

This commit is contained in:
Dennis Dawson
2024-12-12 12:44:21 -08:00
parent c77a4f39b6
commit e3643aed6d
14 changed files with 792 additions and 1 deletions

View File

@@ -0,0 +1,3 @@
{% admonition type="info" name="Attention" %}
Multi-purpose Token functionality is part of the proposed XLS-33d extension to the XRP Ledger protocol. You can use these functions on test networks for now. Until there is an amendment in a stable release, the details documented on these pages are subject to change.
{% /admonition %}

View File

@@ -0,0 +1,54 @@
---
blurb: Multi-purpose tokens offer a more compact, flexible token type than trust lines.
labels:
- Tokens
- MPTs
- Multi-purpose Tokens
status: not_enabled
---
# Multi-purpose Tokens
{% partial file="/docs/_snippets/mpts-disclaimer.md" /%}
Multi-purpose tokens (MPTs) are a more compact and flexible type of fungible token.
MPTs let you take advantage of ready-to-use tokenization features with a few lines of code. You can create many token experiences from one token program itself. Notable features include:
- MPTs store their metadata directly on the XRPL blockchain.
- A 1024-byte URI field provides a metadata pointer that allows you to use an off-chain source for metadata in addition to the on-chain source. This lets your application access necessary information directly from the chain, prompting higher interoperability for tokens, without losing the ability to attach additional information.
- MPTs can have a fixed token supply where you set a cap on the maximum number of tokens that can be minted.
- You can define MPTs as non-transferable, tokens that can only be transferred back to the issuer, but not among tokenholders. Useful for cases such as issuing airline credits or loyalty rewards.
- Issuers can set transfer fees to collect on-chain revenue each time the token is traded among tokenholders.
- MPTs also have advanced compliance features:
- The ability to lock tokens held by a tokenholder to support compliance requirements.
- The ability to set a global lock for all MPT balances across all tokenholders.
- The issuer can configure MPTs that can be clawed back from tokenholder wallets, either to revoke them, or to reassign them in the case of lost wallet keys.
- An opt-in feature can allow only wallets authorized by the issuer to hold issued tokens.
## MPTs vs Trust Lines
Unlike trust lines, MPTs do not represent bidirectional debt relationships. Instead, MPTs function more like a unidirectional trust line with only one balance. This reduces the overhead to support common tokenization requirements, including non-monetary use cases such as tracking reputation points in an online game.
MPTs offer a less complicated conceptual model than trust lines.
MPTs require significantly less space than trust lines. They require roughly 52 bytes for each MPT held by a token holder, compared to at least 234 bytes for every new trust line.
They reduce the long-term infrastructure and storage burdens for node operators, increasing network resiliency.
MPTs also improve node perfomance when processing large volumes of transactions.
MPTs are unidirectional. While trust lines use "balance netting," MPTs have only a single balance.
An account can issue a maximum of 32 unique MPT issuances. If an issuer wants to support more than this number of MPTs, they can open additional accounts.
Since token holders will not acquire an MPT without first making an off-ledger trust decision, MPTs have no trust limits. For example, a common use case for an MPT is a fiat-backed stablecoin, where a token holder wouldn't purchase more stablecoins than they would feel comfortable holding.
Unlike some existing capabilities of the ledger, MPTs are not subject to rippling, and do not require configurability settings related to that functionality.
## MPTs versus IOUs
On a technical level, MPTs provide a fundamentally different way to represent fungible tokens on the ledger. While IOUs are represented by trustlines and have bilateral debt relationships, MPTs use a simpler, unilateral relationship captured by an MPToken object. This results in substantial space savings on the ledger. The representation of a fungible token as a token object instead of a trustline makes it easier to enable functionality for real-world financial assets on-chain, such as token-level metadata, fixed supply, and fixed-point balance.
On a usage level, MPTs provide a straightforward conceptual model compared to trustlines and rippling. Developers can more easily build web3 applications around `MPToken` and `MPTokenIssuance` objects, with some similarities to the conceptual model of XLS-20 NFTs. It is also simpler for ordinary users to understand what tokens are available, what tokens they have issued, and what they hold in their wallet. For both issuers and holders of MPTs, there will typically be a smaller XRP reserve compared to the equivalent representations with IOU trustlines.
MPTs are intended to be complementary to IOUs. While there might be use cases where either MPTs or IOUs might be suitable, there will likely be a need for both over the long term. There will be use cases such as credit lines for lending and borrowing that might be better represented by IOUs long term. The MPT feature set should evolve in an incremental manner to unlock more common use cases first and deliver additional feature support at a later time. During the MPT development period, some cases might still be better represented by an IOU, then later be better supported with MPTs.

View File

@@ -48,6 +48,8 @@ In addition to the general fields above, you must specify *exactly 1* of the fol
- [Get DepositPreauth Object](#get-depositpreauth-object) - [Get DepositPreauth Object](#get-depositpreauth-object)
- [Get Ticket Object](#get-ticket-object) - [Get Ticket Object](#get-ticket-object)
- [Get NFT Page](#get-nft-page) - [Get NFT Page](#get-nft-page)
- [Get MPT Issuance Object](#get-mpt-issuance-object)
- [Get MPToken Object](#get-mptoken-object)
- [Response Format](#response-format) - [Response Format](#response-format)
- [Possible Errors](#possible-errors) - [Possible Errors](#possible-errors)
@@ -921,6 +923,200 @@ An example of a successful response:
{% /tabs %} {% /tabs %}
### Get MPT Issuance Object
Return an `MPTokenIssuance` object.
| Field | Type | Description |
|:------------------------|:---------------------------|:----------------------|
| `mpt_issuance` | String | The 192-bit `MPTokenIssuanceID` that's associated with the MPTokenIssuance. |
<!-- MULTICODE_BLOCK_START -->
*WebSocket*
```json
{
"id": "example_get_mpt_issuance",
"command": "ledger_entry",
"mpt_issuance": "000004C463C52827307480341125DA0577DEFC38405B0E3E",
"ledger_index": "validated"
}
```
*JSON-RPC*
```json
{
"method": "ledger_entry",
"params": [{
"mpt_issuance": "000004C463C52827307480341125DA0577DEFC38405B0E3E",
"ledger_index": "validated"
}]
}
```
*Commandline*
```sh
rippled json ledger_entry '{ "mpt_issuance": "000004C463C52827307480341125DA0577DEFC38405B0E3E", "ledger_index": "validated" }'
```
### Get MPToken Object
Return an `MPToken` object.
| Field | Type | Description |
|:------------------------|:---------------------------|:----------------------|
| `mptoken` | Object or String | If a string, interpret as ledger entry ID of the MPToken to retrieve. If an object, requires the sub-fields account and mpt_issuance_id to unique identify the MPToken. |
| mptoken.mpt_issuance_id | String | (Required if the `MPToken` is specified as an object) The 192-bit MPTokenIssuanceID that's associated with the MPTokenIssuance. |
| mptoken.account | String | (Required if the `MPToken` is specified as an object) The account that owns the MPToken. |
<!-- MULTICODE_BLOCK_START -->
*WebSocket*
```json
{
"id": "example_get_mpt_issuance",
"command": "ledger_entry",
"mpt_issuance": "000004C463C52827307480341125DA0577DEFC38405B0E3E",
"ledger_index": "validated"
}
```
*JSON-RPC*
```json
{
"method": "ledger_entry",
"params": [{
"mpt_issuance": "000004C463C52827307480341125DA0577DEFC38405B0E3E",
"ledger_index": "validated"
}]
}
```
*Commandline*
```sh
rippled json ledger_entry '{ "mpt_issuance": "000004C463C52827307480341125DA0577DEFC38405B0E3E", "ledger_index": "validated" }'
```
<!-- MULTICODE_BLOCK_END -->
[Try it! >](https://xrpl.org/resources/dev-tools/websocket-api-tool.html#ledger_entry-mpt_issuance)
## Response Format
The response follows the [standard format](https://xrpl.org/docs/references/http-websocket-apis/api-conventions/response-formatting/), with a successful result containing the following fields:
| Field | Type | Description |
|:---------------|:-----------------|:-----------------------------------------|
| `index` | String | The unique ID of this [ledger entry](https://xrpl.org/docs/references/protocol/ledger-data/ledger-entry-types/). |
| `ledger_index` | Unsigned Integer | The [ledger index](https://xrpl.org/docs/references/protocol/data-types/basic-data-types/#ledger-index) of the ledger that was used when retrieving this data. |
| `node` | Object | _(Omitted if `"binary": true` specified.)_ Object containing the data of this ledger entry, according to the [ledger format](https://xrpl.org/docs/references/protocol/ledger-data/ledger-entry-types/). |
| `node_binary` | String | _(Omitted unless `"binary":true` specified)_ The [binary representation](https://xrpl.org/docs/references/protocol/binary-format/) of the ledger object, as hexadecimal. |
An example of a successful response:
<!-- MULTICODE_BLOCK_START -->
*WebSocket*
```json
{
"id": "example_get_accountroot",
"result": {
"index": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"ledger_hash": "31850E8E48E76D1064651DF39DF4E9542E8C90A9A9B629F4DE339EB3FA74F726",
"ledger_index": 61966146,
"node": {
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"AccountTxnID": "4E0AA11CBDD1760DE95B68DF2ABBE75C9698CEB548BEA9789053FCB3EBD444FB",
"Balance": "424021949",
"Domain": "6D64756F31332E636F6D",
"EmailHash": "98B4375E1D753E5B91627516F6D70977",
"Flags": 9568256,
"LedgerEntryType": "AccountRoot",
"MessageKey": "0000000000000000000000070000000300",
"OwnerCount": 12,
"PreviousTxnID": "4E0AA11CBDD1760DE95B68DF2ABBE75C9698CEB548BEA9789053FCB3EBD444FB",
"PreviousTxnLgrSeq": 61965653,
"RegularKey": "rD9iJmieYHn8jTtPjwwkW2Wm9sVDvPXLoJ",
"Sequence": 385,
"TransferRate": 4294967295,
"index": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8"
},
"validated": true
},
"status": "success",
"type": "response"
}
```
*JSON-RPC*
```json
200 OK
{
"result": {
"index": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"ledger_hash": "395946243EA36C5092AE58AF729D2875F659812409810A63096AC006C73E656E",
"ledger_index": 61966165,
"node": {
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"AccountTxnID": "4E0AA11CBDD1760DE95B68DF2ABBE75C9698CEB548BEA9789053FCB3EBD444FB",
"Balance": "424021949",
"Domain": "6D64756F31332E636F6D",
"EmailHash": "98B4375E1D753E5B91627516F6D70977",
"Flags": 9568256,
"LedgerEntryType": "AccountRoot",
"MessageKey": "0000000000000000000000070000000300",
"OwnerCount": 12,
"PreviousTxnID": "4E0AA11CBDD1760DE95B68DF2ABBE75C9698CEB548BEA9789053FCB3EBD444FB",
"PreviousTxnLgrSeq": 61965653,
"RegularKey": "rD9iJmieYHn8jTtPjwwkW2Wm9sVDvPXLoJ",
"Sequence": 385,
"TransferRate": 4294967295,
"index": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8"
},
"status": "success",
"validated": true
}
}
```
*Commandline*
```json
{
"result": {
"index": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8",
"ledger_hash": "395946243EA36C5092AE58AF729D2875F659812409810A63096AC006C73E656E",
"ledger_index": 61966165,
"node": {
"Account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn",
"AccountTxnID": "4E0AA11CBDD1760DE95B68DF2ABBE75C9698CEB548BEA9789053FCB3EBD444FB",
"Balance": "424021949",
"Domain": "6D64756F31332E636F6D",
"EmailHash": "98B4375E1D753E5B91627516F6D70977",
"Flags": 9568256,
"LedgerEntryType": "AccountRoot",
"MessageKey": "0000000000000000000000070000000300",
"OwnerCount": 12,
"PreviousTxnID": "4E0AA11CBDD1760DE95B68DF2ABBE75C9698CEB548BEA9789053FCB3EBD444FB",
"PreviousTxnLgrSeq": 61965653,
"RegularKey": "rD9iJmieYHn8jTtPjwwkW2Wm9sVDvPXLoJ",
"Sequence": 385,
"TransferRate": 4294967295,
"index": "13F1A95D7AAB7108D5CE7EEAF504B2894B8C674E6D68499076441C4837282BF8"
},
"status": "success",
"validated": true
}
}
```
<!-- MULTICODE_BLOCK_END -->
## Possible Errors ## Possible Errors

View File

@@ -0,0 +1,164 @@
---
blurb: Get the holders for a given `MPTokenIssuanceID` and ledger sequence.
labels:
- Accounts
- XRP
---
# mpt_holders
{% partial file="/docs/_snippets/mpts-disclaimer.md" /%}
For a given `MPTokenIssuanceID` and ledger sequence, `mpt_holders` returns all holders of that MPT and their balance. This method likely returns very large data sets, so you should expect to implement paging via the `marker` field.
## Request Format
*Websocket*
```json
{
"command": "mpt_holders",
"mpt_id": "00070C4495F14B0E44F78A264E41713C64B5F89242540EE255534400000000000000",
"ledger_index": "validated"
}
```
*JSON-RPC*
```json
{
"method": "mpt_holders",
"params": [
{
"mpt_id": "00070C4495F14B0E44F78A264E41713C64B5F89242540EE255534400000000000000",
"ledger_index": "validated"
}
]
}
```
The request contains the following parameters:
| Field | Type | Required? | Description |
|:------------------|:---------------------|:----------|-------------|
| `mpt_issuance_id` | string | Yes | The `MPTokenIssuance` to query. |
| `ledger_index` | string or number (positive integer) | No | The ledger index of the max ledger to use, ora shortcut string to choose a ledger automatically. You must specify either ledger_index or ledger_hash. |
| `ledger_hash` | string | No | A 20-byte hex string for the ma ledger version to use. You must specify either ledger_index or ledger_hash. |
| `marker` | string | No | Used to continue your query where it left off in paginating. |
| `limit` | number (positive integer) | No | Specify a limit to the number of MPTs returned. |
## Response Format
```json
{
"mpt_issuance_id": "000004C463C52827307480341125DA0577DEFC38405B0E3E",
"limit":50,
"ledger_index": 2,
"mptokens": [{
"account": "rEiNkzogdHEzUxPfsri5XSMqtXUixf2Yx",
"flags": 0,
"mpt_amount": "20",
"locked_amount": "1",
"mptoken_index": "36D91DEE5EFE4A93119A8B84C944A528F2B444329F3846E49FE921040DE17E65"
},
{
"account": "rrnAZCqMahreZrKMcZU3t2DZ6yUndT4ubN",
"flags": 0,
"mpt_amount": "1",
"mptoken_index": "D137F2E5A5767A06CB7A8F060ADE442A30CFF95028E1AF4B8767E3A56877205A"
}],
"validated": true
}
```
### Response Fields
The response follows the [standard format](https://xrpl.org/docs/references/http-websocket-apis/api-conventions/response-formatting/), with the result containing the following fields:
| Field | Type | Description |
|:-----------------------|:--------|:------------------------------------------|
| `mpt_issuance_id` | string | The `MPTokenIssuance` queried |
| `mptokens` | array | An array of mptokens. Includes all relevant fields in the underlying MPToken object. |
| `marker` | string | Used to continue querying where we left off when paginating. Omitted if there are no more entries after this result. |
| `limit` | number | The limit, as specfied in the request
| `ledger_index` | number | The index of the ledger used. |
An `mptoken` object has the following parameters:
| Field | Type | Description |
|:-----------------------|:--------|:------------------------------------------|
| `account` | string | The account address of the holder who owns the `MPToken`. |
| `flags` | number | The flags assigned to the`MPToken` object. |
| `mpt_amount` | string | Base 10-encoded amount of the holder's balance. |
| `locked_amount` | string | Base 10-encoded amount of the locked balance. (Can be omitted if the value is 0.) |
| `mptoken_index` | string | Key of the `MPToken` object. |
#### Synthetic mpt_issuance_id field
`MPTokenIssuanceID` is an identifier that allows you to specify an `MPTokenIssuance` in RPCs. The server adds a synthetically parsed `mpt_issuance_id` field to API responses to avoid the need for client-side parsing of the `MPTokenIssuanceID`.
##### Transaction Metadata
An `mpt_issuance_id` field is provided in JSON transaction metadata (not available for binary) for all successful `MPTokenIssuanceCreate` transactions. The following APIs are impacted: `tx`, `account_tx`, `subscribe` and `ledger`.
##### Example
Example of a `tx` response:
```json
{
"result": {
"Account": "rBT9cUqK6UvpvZhPFNQ2qpUTin8rDokBeL",
"AssetScale": 2,
"Fee": "10",
"Flags": 64,
"Sequence": 303,
"SigningPubKey": "ED39955DEA2D083C6CBE459951A0A84DB337925389ACA057645EE6E6BA99D4B2AE",
"TransactionType": "MPTokenIssuanceCreate",
"TxnSignature": "80D7B7409980BE9854F7217BB8E836C8A2A191E766F24B5EF2EA7609E1420AABE6A1FDB3038468679081A45563B4D0B49C08F4F70F64E41B578F288A208E4206",
"ctid": "C000013100000000",
"date": 760643692,
"hash": "E563D7942E3E4A79AD73EC12E9E4C44B7C9950DF7BF5FDB75FAD0F5CE0554DB3",
"inLedger": 305,
"ledger_index": 305,
"meta": {
"AffectedNodes": [...],
"TransactionIndex": 0,
"TransactionResult": "tesSUCCESS",
"mpt_issuance_id": "0000012F72A341F09A988CDAEA4FF5BE31F25B402C550ABE"
},
"status": "success",
"validated": true
}
}
```
##### Object
An `mpt_issuance_id` field is provided in JSON MPTokenIssuance objects (not available for binary). The following APIs are impacted: `ledger_data` and `account_objects`.
##### Example
Example of an `account_objects` response:
```json
{
"result": {
"account": "rBT9cUqK6UvpvZhPFNQ2qpUTin8rDokBeL",
"account_objects": [
{
"AssetScale": 2,
"Flags": 64,
"Issuer": "rBT9cUqK6UvpvZhPFNQ2qpUTin8rDokBeL",
"LedgerEntryType": "MPTokenIssuance",
"OutstandingAmount": "5a",
"OwnerNode": "0",
"PreviousTxnID": "BDC5ECA6B115C74BF4DA83E36325A2F55DF9E2C968A5CC15EB4D009D87D5C7CA",
"PreviousTxnLgrSeq": 308,
"Sequence": 303,
"index": "75EC6F2939ED6C5798A5F369A0221BC4F6DDC50F8614ECF72E3B976351057A63",
"mpt_issuance_id": "0000012F72A341F09A988CDAEA4FF5BE31F25B402C550ABE"
}
],
"ledger_current_index": 309,
"status": "success",
"validated": false
}
}
```

View File

@@ -0,0 +1,64 @@
---
blurb: Describes the XRPL multi-purpose token object.
labels:
- Multi-purpose Tokens, MPTs, Tokens
---
# MPToken
{% partial file="/docs/_snippets/mpts-disclaimer.md" /%}
The `MPToken` object represents a number of tokens held by an account that is not the token issuer. MPTs are acquired via ordinary payment or DEX transactions, and can optionally be redeemed or exchanged using these same types of transactions. The object key of the MPToken is derived from hashing the space key, the holder's address, and the `MPTokenIssuanceID`.
<!-- _(Added by the [MPTokenV1_1 amendment][].)_ -->
## Example MPToken JSON
```json
{
"LedgerEntryType": "MPToken",
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"MPTokenIssuanceID": "000004C463C52827307480341125DA0577DEFC38405B0E3E",
"Flags": 0,
"MPTAmount": "100000000",
"OwnerNode": 1
}
```
## MPTokenID
The `MPTokenID` is the result of SHA512-Half of the following values, concatenated in order:
- The `MPToken` space key (0x0074).
- The `MPTokenIssuanceID` for the issuance being held.
- The `AccountID` of the token holder.
## MPToken Fields
`MPToken` objects have the following fields.
| Field Name | JSON Type | Internal Type | Description |
|:------------------|:----------|:--------------|:------------|
| `LedgerEntryType` | number | UInt16 | The value 0x007F, mapped to the string `MPToken`, indicates that this object describes an individual account's holding of an MPT. |
| `Account` | string | AccountID | The owner of the MPT. |
| `MPTokenIssuanceID` | string | UInt192 | The `MPTokenIssuance` identifier. |
| `MPTAmount` | string | UInt64 | This value specifies a positive amount of tokens currently held by the owner. Valid values for this field are between 0x0 and 0xFFFFFFFFFFFFFFFF. |
| `Flags` | number | UInt32 | (Default) See [MPToken Flags](#mptoken-flags) |
| `PreviousTxnID` | string | Hash256 | Transaction ID of the transaction that most recently modified this object. |
| `PreviousTxnLgrSeq` | number | UInt32 | The sequence of the ledger that contains the transaction that most recently modified this object. |
| `OwnerNode` | number | UInt64 | (Default) The page in the owner's directory where this item is referenced. |
### MPToken Flags
Flags are properties or other options associated with the `MPToken` object.
| Flag Name | Flag Value | Description |
|:------------------|:-----------|:--------------------------------------------|
| `lsfMPTLocked` | `0x00000001` | If enabled, indicates that the MPT owned by this account is currently locked and cannot be used in any XRP transactions other than sending value back to the issuer. When this flag is set, the LockedAmount must equal the MPTAmount value. |
| `lsfMPTAuthorized` | `0x00000002` | (Only applicable for allow-listing) If set, indicates that the issuer has authorized the holder for the MPT. This flag can be set using a `MPTokenAuthorize` transaction; it can also be "un-set" using a `MPTokenAuthorize` transaction specifying the `tfMPTUnauthorize` flag. |
<!--{# common link defs #}-->
<!-- Uncomment for xrpl.org
{% include '_snippets/rippled-api-links.md' %}
{% include '_snippets/tx-type-links.md' %}
{% include '_snippets/rippled_versions.md' %} -->

View File

@@ -0,0 +1,84 @@
---
blurb: Introduction to XRPL MPTs.
labels:
- Multi-purpose Tokens, MPTs, Tokens
---
# MPTokenIssuance
{% partial file="/docs/_snippets/mpts-disclaimer.md" /%}
The `MPTokenIssuance` object represents a single MPT issuance and holds data associated with the issuance itself. Token issuances are created using the `MPTokenIssuanceCreate` transaction and can be destroyed by the `MPTokenIssuanceDestroy` transaction.
<!-- _(Added by the [MPTokenV1_1 amendment][].)_ -->
## Example MPTokenIssuance JSON
```json
{
"LedgerEntryType": "MPTokenIssuance",
"Flags": 131072,
"Issuer": "rsA2LpzuawewSBQXkiju3YQTMzW13pAAdW",
"AssetScale": "2",
"MaximumAmount": "100000000",
"OutstandingAmount": "3e8",
"TransferFee": 50000,
"MPTokenMetadata": "",
"OwnerNode": "74"
}
```
## MPTokenIssuanceID
The key of an `MPTokenIssuance` object is the result of SHA512-Half of the following values, concatenated in order:
- The `MPTokenIssuance` space key (0x007E).
- The transaction sequence number.
- The `AccountID` of the issuer.
The `MPTokenIssuanceID` is a 192-bit integer, concatenated in order:
- The transaction sequence number.
- The AccountID of the issuer.
## MPTokenIssuance Fields
`MPTokenIssuance` objects have the following fields.
| Field Name | JSON Type | Internal Type | Description |
|:------------------|:----------|:--------------|:------------|
| LedgerEntryType | number | UInt16 | The value 0x007E, mapped to the string MPTokenIssuance, indicates that this object describes a Multi-Purpose Token (MPT). |
| `Flags` | number | UInt32 | See [MPTokenIssuance Flags](#mptokenissuance-flags) |
| `Issuer` | string | AccountID | The address of the account that controls both the issuance amounts and characteristics of a particular fungible token. |
| `AssetScale` | number | UInt8 | An asset scale is the difference, in orders of magnitude, between a standard unit and a corresponding fractional unit. More formally, the asset scale is a non-negative integer (0, 1, 2, …) such that one standard unit equals 10^(-scale) of a corresponding fractional unit. If the fractional unit equals the standard unit, then the asset scale is 0. |
| `MaximumAmount` | string | UInt64 | This value is an unsigned number that specifies the maximum number of MPTs that can be distributed to non-issuing accounts (i.e., minted). For issuances that do not have a maximum limit, this value should be set to 0xFFFFFFFFFFFFFFFF. |
| `OutstandingAmount` | string | UInt64 | Specifies the sum of all token amounts that have been minted to all token holders. This value can be stored on ledger as a default type so that when its value is 0 it takes up less space on ledger. This value is increased whenever an issuer pays MPTs to a non-issuer account, and decreased whenever a non-issuer pays MPTs into the issuing account. |
| `TransferFee` | number | UInt16 | This value specifies the fee, in tenths of a basis point, charged by the issuer for secondary sales of the token, if such sales are allowed at all. Valid values for this field are between 0 and 50,000 inclusive. A value of 1 is equivalent to 1/10 of a basis point or 0.001%, allowing transfer rates between 0% and 50%. A `TransferFee` of 50,000 corresponds to 50%. The default value for this field is 0. Any decimals in the transfer fee are rounded down. The fee can be rounded down to zero if the payment is small. Issuers should make sure that their MPT's `AssetScale` is large enough. |
| `MPTokenMetadata` | string | Blob | Arbitrary metadata about this issuance, in hex format. The limit for this field is 1024 bytes. |
| `PreviousTxnID` | string | Hash256 | Transaction ID of the transaction that most recently modified this object. |
| `PreviousTxnLgrSeq` | number | UInt32 | The sequence of the ledger that contains the transaction that most recently modified this object. |
| `OwnerNode` | number | UInt64 | The page in the owner's directory where this item is referenced. |
| `Sequence` | number | UInt32 | A 32-bit unsigned integer that is used to ensure issuances from a given sender can only ever exist once, even if an issuance is later deleted. Whenever a new issuance is created, this value must match the account's current `Sequence` number. `Tickets` make some exceptions from these rules so that it is possible to send transactions out of the normal order. `Tickets` represent sequence numbers reserved for later use; a transaction can use a `Ticket` instead of a normal account Sequence number. Whenever a transaction to create an MPT is included in a ledger, it uses up a sequence number (or Ticket), regardless of whether the transaction executed successfully or failed with a tec-class error code. Other transaction failures don't get included in ledgers, so they don't change the sender's sequence number (or have any other effects). It is possible for multiple unconfirmed MPT-creation transactions to have the same Issuer and sequence number. Such transactions are mutually exclusive, and at most one of them can be included in a validated ledger. (Any others ultimately have no effect.) |
### MPTokenIssuance Flags
Flags are properties or other options associated with the `MPToken` object. Except for `lsfMPTLocked`, which can be mutated via `MPTokenIssuanceSet` transactions, these flags are immutable: they can only be set during the `MPTokenIssuanceCreate` transaction and cannot be changed later.
| Flag Name | Flag Value | Description |
|:--------------------|:-----------|:------------------------------------------------|
| `lsfMPTLocked` | `0x00000001` | If set, indicates that all balances are locked. |
| `lsfMPTCanLock` | `0x00000002` | If set, indicates that the issuer can lock an individual balance or all balances of this MPT. If not set, the MPT cannot be locked in any way. |
| `lsfMPTRequireAuth` | `0x00000004` | If set, indicates that individual holders must be authorized. This enables issuers to limit who can hold their assets. |
| `lsfMPTCanEscrow` | `0x00000008` | If set, indicates that individual holders can place their balances into an escrow. |
| `lsfMPTCanTrade` | `0x00000010` | If set, indicates that individual holders can trade their balances using the XRP Ledger DEX or AMM. |
| `lsfMPTCanTransfer` | `0x00000020` | If set, indicates that tokens held by non-issuers can be transferred to other accounts. If not set, indicates that tokens held by non-issuers cannot be transferred except back to the issuer; this enables use cases such as store credit. |
| `lsfMPTCanClawback` | `0x00000040` | If set, indicates that the issuer may use the `Clawback` transaction to claw back value from individual holders. |
<!--{# common link defs #}-->
<!-- uncomment for xrpl.org
{% include '_snippets/rippled-api-links.md' %}
{% include '_snippets/tx-type-links.md' %}
{% include '_snippets/rippled_versions.md' %} -->

View File

@@ -35,8 +35,11 @@ Clawback is disabled by default. To use clawback, you must send an [AccountSet t
| Field | JSON Type | [Internal Type][] | Description | | Field | JSON Type | [Internal Type][] | Description |
|:-------------------|:----------|:------------------|:------------------| |:-------------------|:----------|:------------------|:------------------|
| `Amount` | [Currency Amount][] | Amount |Indicates the amount being clawed back, as well as the counterparty from which the amount is being clawed back. The quantity to claw back, in the `value` sub-field, must not be zero. If this is more than the current balance, the transaction claws back the entire balance. The sub-field `issuer` within `Amount` represents the token holder's account ID, rather than the issuer's.| | `Amount` | [Currency Amount][] | Amount |Indicates the amount being clawed back, as well as the counterparty from which the amount is being clawed back. The quantity to claw back, in the `value` sub-field, must not be zero. If this is more than the current balance, the transaction claws back the entire balance. The sub-field `issuer` within `Amount` represents the token holder's account ID, rather than the issuer's.|
| `MPTokenHolder` | string | AccountID | (Optional) Specifies the holder's address from which to claw back. The holder must already own an `MPToken` object with a non-zero balance. |
{% admonition type="info" name="Note" %}In the XRP Ledger, the party that created a token is called the _issuer_, but trust lines are bidirectional and, under some configurations, both sides can be seen as the issuer. In this transaction, the token issuer's address is in the `Account` field, and the token holder's address is in the `Amount` field's `issuer` sub-field.{% /admonition %} {% admonition type="info" name="Note" %}For an IOU (trust line) in the XRP Ledger, the party that created a token is called the _issuer_, but trust lines are bidirectional and, under some configurations, both sides can be seen as the issuer. In this transaction, the token issuer's address is in the `Account` field, and the token holder's address is in the `Amount` field's `issuer` sub-field.{% /admonition %}
{% admonition type="info" name="Note" %}To claw back funds from an MPT holder, the issuer must have specified that the MPT allows clawback by setting the `tfMPTCanClawback` flag when creating the MPT using the `MPTokenIssuanceCreate` transaction. Assuming an MPT was created with this flag set, clawbacks are allowed using the `Clawback` transaction.{% /admonition %}
## Error Cases ## Error Cases

View File

@@ -0,0 +1,34 @@
---
html: mptokenauthorize.html
parent: transaction-types.html
blurb: Allow an account to hold an amount of a particular MPT.
labels:
- Multi-purpose Tokens, MPTs
---
# MPTokenAuthorize
{% partial file="/docs/_snippets/mpts-disclaimer.md" /%}
This transaction enables an account to hold an amount of a particular MPT issuance. When applied successfully, it creates a new `MPToken` object with an initial zero balance, owned by the holder account.
If the issuer has set `lsfMPTRequireAuth` (allow-listing) on the `MPTokenIssuance`, the issuer must submit an `MPTokenAuthorize` transaction as well in order to give permission to the holder. If `lsfMPTRequireAuth` is not set and the issuer attempts to submit this transaction, it will fail.
## MPTokenAuthorize Fields
<!-- {% include '_snippets/tx-fields-intro.md' %} -->
| Field | JSON Type | [Internal Type][] | Description |
|:--------------------|:--------------------|:------------------|:-------------------|
| `Account` | string | `AccountID` | This address can indicate either an issuer or a potential holder of a MPT. |
| `TransactionType` | object | `UInt16` | Indicates the new transaction type MPTokenAuthorize. The integer value is 29. |
| `MPTokenIssuanceID` | string | `UIn192` | Indicates the ID of the MPT involved. |
| `Holder` | string | `AccountID` | (Optional) Specifies the holder's address that the issuer wants to authorize. Only used for authorization/allow-listing; must be empty if submitted by the holder. |
| `Flags` | number | `UInt32` | See [MPTokenAuthorize Flags](#mptokenauthorize-flags). |
### MPTokenAuthorize Flags
Transactions of the MPTokenAuthorize type support additional values in the Flags field, as follows:
| Flag Name | Hex Value | Decimal Value | Description |
|:-------------------|:-------------|:--------------|:------------------------------|
| `tfMPTUnauthorize` | `0x00000001` | 1 | If set, and transaction is submitted by a holder, it indicates that the holder no longer wants to hold the `MPToken`, which will be deleted as a result. If the holder's `MPToken` has a non-zero balance while trying to set this flag, the transaction fails. On the other hand, if set, and transaction is submitted by an issuer, it would mean that the issuer wants to unauthorize the holder (only applicable for allow-listing), which would unset the `lsfMPTAuthorized` flag on the `MPToken`. |

View File

@@ -0,0 +1,63 @@
---
html: mptokenissuancecreate.html
parent: transaction-types.html
blurb: Issue a new Multi-purpose Token.
labels:
- Multi-purpose Tokens, MPTs
---
# MPTokenIssuanceCreate
[[Source]](https://github.com/XRPLF/rippled/blob/master/src/ripple/app/tx/impl/MPTokenIssuanceCreate.cpp "Source")
{% partial file="/docs/_snippets/mpts-disclaimer.md" /%}
The `MPTokenIssuanceCreate` transaction creates an MPTokenIssuance <!--[MPTokenIssuance](mptokenissuance.html)--> object and adds it to the relevant directory node of the creator account. This transaction is the only opportunity an issuer has to specify any token fields that are defined as immutable (for example, MPT Flags).
If the transaction is successful, the newly created token is owned by the account (the creator account) that executed the transaction.
Whenever your query returns an `MPTokenIssuance` transaction response, there will always be an `mpt_issuance_id` field on the Transaction Metadata page.
## Example MPTokenIssuanceCreate JSON
This example assumes that the issuer of the token is the signer of the transaction.
```json
Example MPTokenIssuanceCreate transaction
{
"TransactionType": "MPTokenIssuanceCreate",
"Account": "rajgkBmMxmz161r8bWYH7CQAFZP5bA9oSG",
"AssetScale": "2",
"TransferFee": 314,
"MaximumAmount": "50000000",
"Flags": 83659,
"MPTokenMetadata": "FOO",
"Fee": 10
}
```
## MPTokenIssuanceCreate Fields
<!-- {% include '_snippets/tx-fields-intro.md' %} -->
| Field | JSON Type | [Internal Type][] | Description |
|:----------------|:--------------------|:------------------|:-------------------|
| `TransactionType` | object | UInt16 | Indicates the new transaction type MPTokenIssuanceCreate. |
| `AssetScale` | number | UInt8 | (Optional) An asset scale is the difference, in orders of magnitude, between a standard unit and a corresponding fractional unit. More formally, the asset scale is a non-negative integer (0, 1, 2, …) such that one standard unit equals 10^(-scale) of a corresponding fractional unit. If the fractional unit equals the standard unit, then the asset scale is 0. Note that this value is optional, and will default to 0 if not supplied. |
| `Flags` | number | UInt16 | Specifies the flags for this transaction. See [MPTokenIssuanceCreate Flags](#mptokenissuancecreate-flags). |
| `TransferFee` | number | UInt16 | (Optional) The value specifies the fee to charged by the issuer for secondary sales of the Token, if such sales are allowed. Valid values for this field are between 0 and 50,000 inclusive, allowing transfer rates of between 0.000% and 50.000% in increments of 0.001. The field _must not_ be present if the tfMPTCanTransfer flag is not set. If it is, the transaction should fail and a fee should be claimed. |
| `MaximumAmount` | string | UInt64 | (Optional) The maximum asset amount of this token that should ever be issued, as a base 10 encoded string. For issuances that do not have a maximum limit, set this value to 9,223,372,036,854,775,807 (2^63-1). |
| `MPTokenMetadata` | string | Blob | Arbitrary metadata about this issuance, in hex format. The limit for this field is 1024 bytes. |
## MPTokenIssuanceCreate Flags
Transactions of the MPTokenIssuanceCreate type support additional values in the `Flags` field <!-- [`Flags` field](transaction-common-fields.html#flags-field)-->, as follows:
| Flag Name | Hex Value | Decimal Value | Description |
|:-------------------|:-------------|:--------------|:------------------------------|
| `tfMPTCanLock` | `0x00000002` | `2` | If set, indicates that the MPT can be locked both individually and globally. If not set, the MPT cannot be locked in any way. |
| `tfMPTRequireAuth` | `0x00000004` | `4` | If set, indicates that individual holders must be authorized. This enables issuers to limit who can hold their assets. |
| `tfMPTCanEscrow` | `0x00000008` | `8` | If set, indicates that individual holders can place their balances into an escrow. |
| `tfMPTCanTrade` | `0x00000010` | `16` | If set, indicates that individual holders can trade their balances using the XRP Ledger DEX. |
| `tfMPTCanTransfer` | `0x00000020` | `32` | If set, indicates that tokens can be transferred to other accounts that are not the issuer. |
| `tfMPTCanClawback` | `0x00000040` | `64` | If set, indicates that the issuer can use the Clawback transaction to claw back value from individual holders. |

View File

@@ -0,0 +1,33 @@
---
html: mptokenissuancedestroy.html
parent: transaction-types.html
blurb: Remove a Multi-purpose Token from the ledger.
labels:
- Multi-purpose Tokens, MPTs
---
# MPTokenIssuanceDestroy
{% partial file="/docs/_snippets/mpts-disclaimer.md" /%}
The `MPTokenIssuanceDestroy` transaction is used to remove an `MPTokenIssuance` object from the directory node in which it is being held, effectively removing the token from the ledger ("destroying" it).
If this operation succeeds, the corresponding `MPTokenIssuance` is removed and the owners reserve requirement is reduced by one. This operation must fail if there are any holders of the MPT in question.
## Example MPTokenIssuanceDestroy JSON
```json
{
"TransactionType": "MPTokenIssuanceDestroy",
"Fee": 10,
"MPTokenIssuanceID": "00070C4495F14B0E44F78A264E41713C64B5F89242540EE255534400000000000000"
}
```
## MPTokenIssuanceDestroy Fields
<!-- {% include '_snippets/tx-fields-intro.md' %} -->
| Field | JSON Type | [Internal Type][] | Description |
|:--------------------|:--------------------|:------------------|:-------------------|
| `TransactionType` | string | UInt16 | Indicates the new transaction type MPTokenIssuanceDestroy. |
| `MPTokenIssuanceID` | string | UInt192 | Identifies the `MPTokenIssuance` object to be removed by the transaction. |

View File

@@ -0,0 +1,43 @@
---
html: mptokenissuanceset.html
parent: transaction-types.html
blurb: Set mutable properties for an MPT.
labels:
- Multi-purpose Tokens, MPTs
---
# MPTokenIssuanceSet
{% partial file="/docs/_snippets/mpts-disclaimer.md" /%}
Use this transaction to update a mutable property for a Multi-purpose Token.
## Example
```json
{
"TransactionType": "MPTokenIssuanceSet",
"Fee": 10,
"MPTokenIssuanceID": "00070C4495F14B0E44F78A264E41713C64B5F89242540EE255534400000000000000",
"Flags": 1
}
```
## MPTokenIssuanceSet Fields
<!-- {% include '_snippets/tx-fields-intro.md' %} -->
| Field | JSON Type | [Internal Type][] | Description |
|:-------------------|:--------------------|:------------------|:-------------------|
| `TransactionType` | object | UInt16 | Indicates the new transaction type `MPTokenIssuanceSet`. |
| `MPTokenIssuanceID`| string | UInt192 | The `MPTokenIssuance` identifier. |
| `Holder` | string | AccountID | (Optional) XRPL Address of an individual token holder balance to lock/unlock. If omitted, this transaction applies to all any accounts holding MPTs. |
| `Flag` | string | UInt64 | Specifies flags for this transaction. See [MPTokenIssuanceSet Flags](#mptokenissuanceset-flags). |
### MPTokenIssuanceSet Flags
Transactions of the `MPTokenIssuanceSet` type support additional values in the `Flags` field, as follows:
| Flag Name | Hex Value | Decimal Value | Description |
|:-------------------|:-------------|:--------------|:------------------------------|
| `tfMPTLock` | `0x00000001` | 1 | If set, indicates that all MPT balances for this asset should be locked. |
| `tfMPTUnlock` | `0x00000002` | 2 | If set, indicates that all MPT balances for this asset should be unlocked. |

View File

@@ -63,6 +63,7 @@ The `Payment` transaction type functions differently depending on how you fill i
| [Cross-currency Payment][] | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Usually required | No | Send tokens from one holder to another. The `Amount` or `SendMax` can be XRP or tokens, but can't both be XRP. These payments [ripple through](../../../../concepts/tokens/fungible-tokens/rippling.md) the issuer and can take longer [paths](../../../../concepts/tokens/fungible-tokens/paths.md) through several intermediaries if the transaction specifies a path set. [Transfer fees](../../../../concepts/tokens/transfer-fees.md) set by the issuer(s) apply to this type of transaction. These transactions consume offers in the [decentralized exchange](../../../../concepts/tokens/decentralized-exchange/index.md) to connect different currencies, or currencies with the same currency code and different issuers. | | [Cross-currency Payment][] | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Usually required | No | Send tokens from one holder to another. The `Amount` or `SendMax` can be XRP or tokens, but can't both be XRP. These payments [ripple through](../../../../concepts/tokens/fungible-tokens/rippling.md) the issuer and can take longer [paths](../../../../concepts/tokens/fungible-tokens/paths.md) through several intermediaries if the transaction specifies a path set. [Transfer fees](../../../../concepts/tokens/transfer-fees.md) set by the issuer(s) apply to this type of transaction. These transactions consume offers in the [decentralized exchange](../../../../concepts/tokens/decentralized-exchange/index.md) to connect different currencies, or currencies with the same currency code and different issuers. |
| [Partial payment][] | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Usually required | No | Sends _up to_ a specific amount of any currency. Uses the [`tfPartialPayment` flag](#payment-flags). May include a `DeliverMin` amount specifying the minimum that the transaction must deliver to be successful; if the transaction does not specify `DeliverMin`, it can succeed by delivering _any positive amount_. | | [Partial payment][] | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Usually required | No | Sends _up to_ a specific amount of any currency. Uses the [`tfPartialPayment` flag](#payment-flags). May include a `DeliverMin` amount specifying the minimum that the transaction must deliver to be successful; if the transaction does not specify `DeliverMin`, it can succeed by delivering _any positive amount_. |
| Currency conversion | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Required | Yes | Consumes offers in the [decentralized exchange](../../../../concepts/tokens/decentralized-exchange/index.md) to convert one currency to another, possibly taking [arbitrage](https://en.wikipedia.org/wiki/Arbitrage) opportunities. The `Amount` and `SendMax` cannot both be XRP. Also called a _circular payment_ because it delivers money to the sender. This type of transaction may be classified as an "exchange" and not a "payment". | | Currency conversion | Object (non-XRP) / String (XRP) | Object (non-XRP) / String (XRP) | Required | Yes | Consumes offers in the [decentralized exchange](../../../../concepts/tokens/decentralized-exchange/index.md) to convert one currency to another, possibly taking [arbitrage](https://en.wikipedia.org/wiki/Arbitrage) opportunities. The `Amount` and `SendMax` cannot both be XRP. Also called a _circular payment_ because it delivers money to the sender. This type of transaction may be classified as an "exchange" and not a "payment". |
| MPT Payment | Object | Omitted | Omitted | Yes | Send MPTs to a holder. See [MPT Payments](#mpt-payments). |
[Direct XRP Payment]: ../../../../concepts/payment-types/direct-xrp-payments.md [Direct XRP Payment]: ../../../../concepts/payment-types/direct-xrp-payments.md
[Creating or redeeming tokens]: ../../../../concepts/tokens/index.md [Creating or redeeming tokens]: ../../../../concepts/tokens/index.md
@@ -138,4 +139,27 @@ The `tfLimitQuality` flag is most useful when combined with [partial payments](.
In the above example with a ¥95/$15 offer and a ¥5/$2 offer, the situation is different if my transaction has both `tfPartialPayment` and `tfLimitQuality` enabled. If we keep my `SendMax` of 20 USD and a destination `Amount` of 100 CNY, then the limit quality is still `5`. However, because I am doing a partial payment, the transaction sends as much as it can instead of failing if the full destination amount cannot be sent. This means that my transaction consumes the ¥95/$15 offer, whose quality is about `6.3`, but it rejects the ¥5/$2 offer because that offer's quality of `2.5` is worse than the quality limit of `5`. In the end, my transaction only delivers ¥95 instead of the full ¥100, but it avoids wasting money on poor exchange rates. In the above example with a ¥95/$15 offer and a ¥5/$2 offer, the situation is different if my transaction has both `tfPartialPayment` and `tfLimitQuality` enabled. If we keep my `SendMax` of 20 USD and a destination `Amount` of 100 CNY, then the limit quality is still `5`. However, because I am doing a partial payment, the transaction sends as much as it can instead of failing if the full destination amount cannot be sent. This means that my transaction consumes the ¥95/$15 offer, whose quality is about `6.3`, but it rejects the ¥5/$2 offer because that offer's quality of `2.5` is worse than the quality limit of `5`. In the end, my transaction only delivers ¥95 instead of the full ¥100, but it avoids wasting money on poor exchange rates.
## MPT Payments
When you send a payment using MPTs, the _Amount_ field requires only the `mpt_issuance_id` and the `value`. The `MPTokenIssuanceID` is used to uniquely identify the MPT for the transaction.
### Sample MPT Payment transaction
```json
{
"Account": "rLWSJKbwYSzG32JuGissYd66MFTvfMk4Bt",
"Amount": {
"mpt_issuance_id": "006419063CEBEB49FC20032206CE0F203138BFC59F1AC578",
"value": "100"
},
"DeliverMax": {
"mpt_issuance_id": "006419063CEBEB49FC20032206CE0F203138BFC59F1AC578",
"value": "100"
},
"Destination": "raZ3wTTKiMHn3BiStvz4ET9rbCHfU1DMak",
"Fee": "120",
"Flags": 0,
}
```
{% raw-partial file="/docs/_snippets/common-links.md" /%} {% raw-partial file="/docs/_snippets/common-links.md" /%}

18
package-lock.json generated
View File

@@ -1601,6 +1601,24 @@
"semver": "bin/semver.js" "semver": "bin/semver.js"
} }
}, },
"node_modules/@redocly/realm/node_modules/node-fetch": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz",
"integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==",
"license": "MIT",
"dependencies": {
"data-uri-to-buffer": "^4.0.0",
"fetch-blob": "^3.1.4",
"formdata-polyfill": "^4.0.10"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/node-fetch"
}
},
"node_modules/@redocly/replay": { "node_modules/@redocly/replay": {
"version": "0.5.18", "version": "0.5.18",
"resolved": "https://registry.npmjs.org/@redocly/replay/-/replay-0.5.18.tgz", "resolved": "https://registry.npmjs.org/@redocly/replay/-/replay-0.5.18.tgz",

View File

@@ -112,6 +112,7 @@
- page: docs/concepts/tokens/fungible-tokens/stablecoins/configuration.md - page: docs/concepts/tokens/fungible-tokens/stablecoins/configuration.md
- page: docs/concepts/tokens/fungible-tokens/stablecoins/precautions.md - page: docs/concepts/tokens/fungible-tokens/stablecoins/precautions.md
- page: docs/concepts/tokens/fungible-tokens/stablecoins/compliance-guidelines.md - page: docs/concepts/tokens/fungible-tokens/stablecoins/compliance-guidelines.md
- page: docs/concepts/tokens/fungible-tokens/multi-purpose-tokens.md
- page: docs/concepts/tokens/fungible-tokens/clawing-back-tokens.md - page: docs/concepts/tokens/fungible-tokens/clawing-back-tokens.md
- page: docs/concepts/tokens/fungible-tokens/freezes.md - page: docs/concepts/tokens/fungible-tokens/freezes.md
expanded: false expanded: false
@@ -313,6 +314,8 @@
- page: docs/references/protocol/data-types/base58-encodings.md - page: docs/references/protocol/data-types/base58-encodings.md
- page: docs/references/protocol/data-types/currency-formats.md - page: docs/references/protocol/data-types/currency-formats.md
- page: docs/references/protocol/data-types/nftoken.md - page: docs/references/protocol/data-types/nftoken.md
- page: docs/references/protocol/data-types/mptoken.md
- page: docs/references/protocol/data-types/mptokenissuance.md
- page: docs/references/protocol/ledger-data/index.md - page: docs/references/protocol/ledger-data/index.md
expanded: false expanded: false
items: items:
@@ -368,6 +371,10 @@
- page: docs/references/protocol/transactions/types/escrowcancel.md - page: docs/references/protocol/transactions/types/escrowcancel.md
- page: docs/references/protocol/transactions/types/escrowcreate.md - page: docs/references/protocol/transactions/types/escrowcreate.md
- page: docs/references/protocol/transactions/types/escrowfinish.md - page: docs/references/protocol/transactions/types/escrowfinish.md
- page: docs/references/protocol/transactions/types/mptokenauthorize.md
- page: docs/references/protocol/transactions/types/mptokenissuancecreate.md
- page: docs/references/protocol/transactions/types/mptokenissuancedestroy.md
- page: docs/references/protocol/transactions/types/mptokenissuanceset.md
- page: docs/references/protocol/transactions/types/nftokenacceptoffer.md - page: docs/references/protocol/transactions/types/nftokenacceptoffer.md
- page: docs/references/protocol/transactions/types/nftokenburn.md - page: docs/references/protocol/transactions/types/nftokenburn.md
- page: docs/references/protocol/transactions/types/nftokencanceloffer.md - page: docs/references/protocol/transactions/types/nftokencanceloffer.md
@@ -485,6 +492,7 @@
- page: docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/nft_sell_offers.md - page: docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/nft_sell_offers.md
- page: docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/path_find.md - page: docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/path_find.md
- page: docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/ripple_path_find.md - page: docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/ripple_path_find.md
- page: docs/references/http-websocket-apis/public-api-methods/path-and-order-book-methods/mpt_holders.md
- page: docs/references/http-websocket-apis/public-api-methods/payment-channel-methods/index.md - page: docs/references/http-websocket-apis/public-api-methods/payment-channel-methods/index.md
expanded: false expanded: false
items: items: