# Multi-purpose tokens

Multi-purpose tokens (MPTs) are a form of fungible token on the XRP Ledger designed for greater efficiency and institutional use cases.

Ripple Custody supports both **issuer operations** for creating and managing MPTs, and **holder operations** for receiving and transferring MPTs.

For conceptual information about MPTs, see [Multi-purpose tokens concepts](/products/custody/v1.34/concepts/multi-purpose-tokens).

## Prerequisites

Before working with MPTs in Ripple Custody:

1. **Upgrade to v1.31 or later** — MPT holder operations are available from version 1.31.
2. **Upgrade to v1.32 or later** — MPT issuer operations are available from version 1.32.
3. **Authorize the MPT** before receiving it for the first time (holders).


Before accepting an MPT as collateral or for custody, verify the token's flags. Some flags (such as `lsfMPTCanClawback` or `lsfMPTLocked`) may affect the usability of the tokens. See [Token flags](/products/custody/v1.34/concepts/multi-purpose-tokens#token-flags).

MPT operations are available via API only in this release.

## Dry run MPT transactions

Before submitting MPT transactions to the ledger, you can perform a [dry run](/products/custody/v1.34/api/get-started/key-operations/update/dry-run) to simulate the operation and validate parameters. Dry runs are supported for all MPT issuer and holder operations, including:

- Issuance creation with flag and metadata validation
- Token transfers, minting, and burning
- Holder authorization and revocation
- Freeze/unfreeze operations
- Clawback and escrow transactions


Dry runs validate MPT-specific requirements such as flag settings, holder authorization status, and token balances before broadcast.

### Example: Dry run for MPT issuance creation


```json
{
    "type": "Propose",
    "author": {
        "id": "{{CURRENT_USER_ID}}",
        "domainId": "{{PRIMARY_DOMAIN_ID}}"
    },
    "expiryAt": "{{expiryDate}}",
    "targetDomainId": "{{PRIMARY_DOMAIN_ID}}",
    "id": "{{intent_id}}",
    "payload": {
        "type": "v0_CreateTransactionOrder",
        "id": "{{intent_id}}",
        "ledgerId": "xrpl-testnet",
        "accountId": "{{accountId}}",
        "parameters": {
            "type": "XRPL",
            "feeStrategy": {
                "type": "Priority",
                "priority": "High"
            },
            "maximumFee": "1000000000",
            "operation": {
                "type": "MPTokenIssuanceCreate",
                "flags": [
                    "tfMPTCanTransfer",
                    "tfMPTCanTrade",
                    "tfMPTCanClawback",
                    "tfMPTCanLock"
                ],
                "assetScale": 6,
                "transferFee": 0,
                "maximumAmount": "1000000000000000",
                "metadata": {
                    "type": "HexEncodedMetadata",
                    "value": "7B226E223A224D7920546F6B656E227D"
                }
            }
        },
        "description": "MPTokenIssuanceCreate dry run"
    }
}
```

**Response:**


```json
{
    "success": true,
    "result": {
        "type": "Success"
    },
    "estimate": {
        "minimumCostInDrops": "200",
        "fee": "50000",
        "type": "XRPL"
    },
    "type": "v0_CreateTransactionOrder"
}
```

For more dry run examples, see [Dry run](/products/custody/v1.34/api/get-started/key-operations/update/dry-run#multi-purpose-token-transactions).

## Issuer operations

Operations for accounts that create and manage their own MPT issuances.

| Operation | Description |
|  --- | --- |
| [Create issuance](/products/custody/v1.34/api/accounting/multi-purpose-tokens/issuer/create-issuance) | Define a new MPT asset with metadata and flags. |
| [Mint tokens](/products/custody/v1.34/api/accounting/multi-purpose-tokens/issuer/mint) | Issue tokens to specific holders. |
| [Burn tokens](/products/custody/v1.34/api/accounting/multi-purpose-tokens/issuer/burn) | Reduce supply when tokens are sent to the issuer. |
| [Freeze/Unfreeze](/products/custody/v1.34/api/accounting/multi-purpose-tokens/issuer/freeze) | Control token transfers at holder or global level. |
| [Clawback](/products/custody/v1.34/api/accounting/multi-purpose-tokens/issuer/clawback) | Recover tokens from holders. |
| [Authorize holder](/products/custody/v1.34/api/accounting/multi-purpose-tokens/issuer/authorize-holder) | Manage holder allowlist for authorized MPTs. |
| [Destroy issuance](/products/custody/v1.34/api/accounting/multi-purpose-tokens/issuer/destroy-issuance) | Permanently retire the MPT when supply is zero. |
| [Escrow](/products/custody/v1.34/api/accounting/multi-purpose-tokens/issuer/escrow) | Place tokens in escrow with time-based or conditional release. |


## Holder operations

Operations for accounts that receive and transfer MPTs created by others.

| Operation | Description |
|  --- | --- |
| [Authorize MPT](/products/custody/v1.34/api/accounting/multi-purpose-tokens/holder/authorize) | Opt-in to receive an MPT for the first time. |
| [Receive MPTs](/products/custody/v1.34/api/accounting/multi-purpose-tokens/holder/receive) | Accept MPT payments from other accounts. |
| [Send MPTs](/products/custody/v1.34/api/accounting/multi-purpose-tokens/holder/send) | Transfer MPTs to other authorized holders. |
| [Check balances](/products/custody/v1.34/api/accounting/multi-purpose-tokens/holder/balances) | View MPT balances with correct decimal handling. |


## Related topics

### Ripple Custody documentation

- [Multi-purpose tokens concepts](/products/custody/v1.34/concepts/multi-purpose-tokens) — MPT concepts, lifecycle, and flags.
- [Receive assets](/products/custody/v1.34/api/accounting/receive-assets) — Receiving and releasing incoming transfers.
- [Send assets](/products/custody/v1.34/api/accounting/send-assets) — Sending assets to external accounts.


### XRPL documentation

- Multi-Purpose Tokens — MPT concepts.
- MPTokenAuthorize — Authorization transaction reference.