Create a new MPT issuance.
token.issue(
params: TokenIssueParams,
options?: TokenWriteOptions,
): Promise<SubmissionResult<TokenIssueIntent>>| Parameter | Type | Required | Description |
|---|---|---|---|
metadata | MPTokenMetadata | string | Yes | Token metadata: a structured object (encoded per the XLS-89 standard) or a raw string (UTF-8 hex-encoded as-is). Validated against XLS-89; non-compliant metadata is rejected before submission. |
assetScale | number | No | Decimal places between the display value and base units. Defaults to 2. |
maximumAmount | string | No | Maximum issuable amount, in base units. |
transferFee | number | No | Transfer fee on secondary sales, as a percentage (0.5 = 0.5%, range 0–50). Defaults to 0. |
flags | TokenIssueFlags | No | Capability flags (see below). |
The flags object accepts:
| Flag | Type | Required | Description |
|---|---|---|---|
canLock | boolean | No | The issuer can lock the token (globally or per-holder). |
requireAuth | boolean | No | Holders must be authorized before they can hold the token. |
canEscrow | boolean | No | The token can be used in escrows. |
canTrade | boolean | No | The token can be traded on the DEX. |
canTransfer | boolean | No | The token can be transferred between holders. |
canClawback | boolean | No | The issuer can claw back the token. |
issue() applies opinionated, overridable defaults so a bare call yields a usable token: canLock, canEscrow, canTrade, canTransfer, and canClawback are all enabled, and requireAuth is off. Pass any flag explicitly to override it. MPT capability flags are permanent once the issuance exists.
options is an optional second argument that sets the source account and overrides the fee.
| Option | Type | Required | Description |
|---|---|---|---|
from | AccountSelector | No | The account to act as — an r-address string, or an object { address } or { signer, account? }. Defaults to the primary signer's primary account. (For IOU operations, this is the issuer.) |
fee | FeeIntent | No | Fee override — a priority tier and/or a maxFeeDrops cap. |
idempotencyKey | string | No | A prior submission's idempotencyKey, to retry to the same intent instead of creating a duplicate. Auto-generated when omitted. |
Resolves to a SubmissionResult<TokenIssueIntent>.
Every simpleXRPL write resolves to a SubmissionResult<T> — a union tagged by source, with the backend's raw response preserved verbatim. Its common fields are:
| Field | Type | Description |
|---|---|---|
intent | T | The operation-specific output — see the operation's own return fields. |
source | 'xrpld' | 'custody' | 'palisade' | Which backend produced the result; discriminates response. |
response | TxResponse | custody record | Palisade record | The backend's raw response, preserved verbatim. |
txHash | string (optional) | The XRPL transaction hash, once the transaction is on-ledger. |
intentId | string (optional) | The custodian intent id, when the path produced one. Hold onto this to resume via client.intent. |
idempotencyKey | string (optional) | The UUIDv7 this submission carried. Pass it back as a later call's idempotencyKey to retry to the same intent rather than creating a duplicate. |
For Token.issue, the intent (TokenIssueIntent) carries:
| Field | Type | Description |
|---|---|---|
mptIssuanceId | string | The id of the newly created MPT issuance. |
Builds and submits a single MPTokenIssuanceCreate transaction.
const { intent } = await client.token.issue({
metadata: {
ticker: 'TBILL',
name: 'Acme T-Bill Token',
icon: 'https://acme.example/icon.png',
asset_class: 'rwa',
asset_subclass: 'treasury',
issuer_name: 'Acme Inc',
},
})
console.log(intent.mptIssuanceId)