XChain Platform Action - ISSUE
This action creates or updates a TICK.
Wallet issuer flow. The xchain-wallet ships a Manage Token surface (per-token admin page reachable from My Tokens) that wraps the issuer actions:
ISSUE,MINT,DESTROY,DIVIDEND,AIRDROP,BROADCAST, supply/description locks, ownership transfer, dispenser creation, in a guided UI with owner-gate and confirm-prelude steps. The protocol-level fields below are the canonical source; the wallet is one of several clients that can build these transactions.
PARAMS
| Name | Type | Description |
|---|---|---|
VERSION |
String | Format Version |
TICK |
String | Ticker name or Ticker ID |
MAX_SUPPLY |
String | Maximum token supply |
MAX_MINT |
String | Maximum amount of supply a MINT transaction can issue |
DECIMALS |
String | Number of decimal places token should have (max: 18, default: 0) |
DESCRIPTION |
String | Description of token (249 chars max) |
MINT_SUPPLY |
String | Amount of token supply to mint in immediately (default:0) |
TRANSFER |
String | Address to transfer ownership of the TICK to (owner can perform future actions on token) |
TRANSFER_SUPPLY |
String | Address to transfer MINT_SUPPLY to (mint initial supply and transfer to address) |
LOCK_MAX_SUPPLY |
String | Lock MAX_SUPPLY permanently (cannot increase MAX_SUPPLY) |
LOCK_MAX_MINT |
String | Lock MAX_MINT permanently (cannot edit MAX_MINT) |
LOCK_MINT |
String | Lock TICK against MINT command |
LOCK_MINT_SUPPLY |
String | Lock TICK against issuing additional supply via MINT_SUPPLY |
LOCK_DESCRIPTION |
String | Lock TICK against DESCRIPTION changes |
LOCK_SLEEP |
String | Lock TICK against SLEEP command |
LOCK_CALLBACK |
String | Lock TICK against CALLBACK command |
CALLBACK_BLOCK |
String | Enable CALLBACK command at or after CALLBACK_BLOCK |
CALLBACK_TICK |
String | TICK that users get when CALLBACK command is used |
CALLBACK_AMOUNT |
String | CALLBACK_TICK amount that users get when CALLBACK command is used |
ALLOW_LIST |
String | ACTION_INDEX of a LIST of addresses allowed to interact with this token |
BLOCK_LIST |
String | ACTION_INDEX of a LIST of addresses NOT allowed to interact with this token |
MINT_ADDRESS_MAX |
String | Maximum amount of supply any address can mint via MINT transactions |
MINT_START_BLOCK |
String | First BLOCK_INDEX at which MINT transactions are allowed (begin mint, inclusive) |
MINT_STOP_BLOCK |
String | Last BLOCK_INDEX at which MINT transactions are allowed (end mint, inclusive) |
CONTROLLER |
String | ACTION_INDEX of a deployed contract whose guard gates one ACTION_CLASS of this token (see Controller-Bound Tokens) |
ACTION_CLASS |
String | Which class the binding gates: transfer, trade, burn, mint, stake, ownership, or the catch-all all (fallback for any class with no specific binding; most-specific-wins) |
COOLDOWN_BLOCKS |
String | Drop-cooldown committed at bind time: blocks of friction before a later UNBIND takes effect |
UNBIND |
String | 1 drops the live binding for ACTION_CLASS; 0 binds |
BRIDGE_CHAINS |
String | Comma list of destination coins this TICK may bridge to via XBRIDGE, or - for none; empty means unchanged |
MIN_DEPTH |
String | Confirmation depth the federation must honour for this TICK’s bridge locks, raise-only over the platform default; empty means unchanged |
LOCK_BRIDGE |
String | 1 permanently locks BRIDGE_CHAINS and MIN_DEPTH |
MEMO |
String | An optional memo to include |
Formats
Version 0
VERSION|TICK|MAX_SUPPLY|MAX_MINT|DECIMALS|DESCRIPTION|MINT_SUPPLY|TRANSFER|TRANSFER_SUPPLY|LOCK_MAX_SUPPLY|LOCK_MAX_MINT|LOCK_DESCRIPTION|LOCK_SLEEP|LOCK_CALLBACK|CALLBACK_BLOCK|CALLBACK_TICK|CALLBACK_AMOUNT|ALLOW_LIST|BLOCK_LIST|MINT_ADDRESS_MAX|MINT_START_BLOCK|MINT_STOP_BLOCK|LOCK_MINT|LOCK_MINT_SUPPLY|MEMO
Version 1 - Edit DESCRIPTION
VERSION|TICK|DESCRIPTION|MEMO
Version 2 - Edit MINT PARAMS
VERSION|TICK|MAX_MINT|MINT_SUPPLY|TRANSFER_SUPPLY|MINT_ADDRESS_MAX|MINT_START_BLOCK|MINT_STOP_BLOCK|MEMO
Version 3 - Edit LOCK PARAMS
VERSION|TICK|LOCK_MAX_SUPPLY|LOCK_MAX_MINT|LOCK_DESCRIPTION|LOCK_SLEEP|LOCK_CALLBACK|LOCK_MINT|LOCK_MINT_SUPPLY|MEMO
Version 4 - Edit CALLBACK PARAMS
VERSION|TICK|CALLBACK_BLOCK|CALLBACK_TICK|CALLBACK_AMOUNT|MEMO
Version 5 - Edit LIST PARAMS
VERSION|TICK|ALLOW_LIST|BLOCK_LIST|MEMO
Version 6 - Bind/unbind a CONTROLLER for one ACTION_CLASS
VERSION|TICK|CONTROLLER|ACTION_CLASS|COOLDOWN_BLOCKS|UNBIND|MEMO
Version 7 - Bridge opt-in
VERSION|TICK|BRIDGE_CHAINS|MIN_DEPTH|LOCK_BRIDGE|MEMO
Examples
ISSUE|0|JDOG
This example issues a JDOG token
ISSUE|0|JDOG|1||||1|||1
This example issues a JDOG token with MAX_SUPPLY set to 1, Mints 1 token via MINT_SUPPLY, and has LOCK_MAX_SUPPLY set to 1 to permanently lock the MAX_SUPPLY
ISSUE|0|JDOG|0|0|0|http://example.com/images/JDOG_icon.png
This example issues a JDOG token with a DESCRIPTION which points to an icon
ISSUE|0|JDOG|0|0|0|http://example.com/images/JDOG_icon.png|0|1ExampleAddressXXXXXXXXXXXXXXXXXXX
This example issues a JDOG token with a DESCRIPTION which points to an icon, and transfers token ownership to 1ExampleAddressXXXXXXXXXXXXXXXXXXX
ISSUE|0|JDOG|1000|1|0
This example issues a JDOG token with a max supply of 1000, and a maximum mint of 1 JDOG per mint
ISSUE|0|JDOG|1000|1|0|BTNS Tokens Are Cool!
This example issues a JDOG token with a max supply of 1000, and a DESCRIPTION of 'BTNS Tokens are Cool!'
ISSUE|0|BRRR|10000000000000000000|10000000000000|0|https://example.com/json/JDOG.json|100
This example issues a BRRR token with a max supply of 1 Quandrillion supply and a maximum mint of 1 Trillion BRRR per mint, associates a JSON file with the token, and immediately mints 100 BRRR to the broadcasting address.
ISSUE|0|TEST|100|1|0||1|1ExampleAddressXXXXXXXXXXXXXXXXXXX|1ExampleAddressXXXXXXXXXXXXXXXXXXX
This example issues a TEST token with a max supply of 100, and a maximum mint of 1 TEST per mint. This also mints 1 TEST token, and transfers ownership AND initial token supply to 1ExampleAddressXXXXXXXXXXXXXXXXXXX
Rules
TICKmust be 1 to 250 characters in lengthTICKcharacters allowed are :- Alphanumeric characters : a-zA-Z0-9
- Special characters: ~!@#$%^&*()_±={}[]:<>.?
TICKcharacters NOT allowed are :- pipe
|(used as field separator) - semicolon
;(used as command separator) - backslash
\(reserved) - slash
/(used as directory indicator) ^(caret) cannot be used as first character in aTICKname (used as ticker id indicator)
- pipe
- Period
.is allowed inside aTICKname as the parent/child separator (e.g.JDOG.SUB1), but aTICKmay not begin or end with a period - First
ISSUEwithvalidstatus will be the owner of theTICK - Additional
ISSUEtransactions after first validISSUE, will be considered invalid and ignored, unless broadcast fromTICKowners address DECIMALScan not be changed afterTICKsupply is issued and/or mintedMAX_SUPPLYmax value is 1,000,000,000,000,000,000,000 (1 Sextillion)MAX_SUPPLYcan not be set below existing supplyLOCK_MAX_SUPPLYcan only be set to1when the token’sMAX_SUPPLYis set (MIN_TOKEN_SUPPLYor greater), declared in the sameISSUEor already on the token record. Minted supply is NOT required: a fair-mint token may declare itsMAX_SUPPLYand permanently lock it at issuance, before any supply exists. SettingLOCK_MAX_SUPPLYwith noMAX_SUPPLYdeclared is invalid.- On any chain other than BTC, a broadcast
ISSUEof theXCHAIN(GAS) tick is refused withinvalid: TICK (BTC-only), from every source including the GAS address, on every network including regtest; the reserved-tick check is case-folded (btc,BTC,Btc, … are all reserved everywhere), closing a gap where an exact-case check let a mismatched-case ticker through. System-injected creation of the tick (theXBRIDGEv2/v5 settle leg creating a chain’s first shadow row) is exempt from this refusal: it is not a broadcastISSUE. See Cross-Chain Bridge and Token Bridge. - Reserving room for chains XChain integrates later. Behind
TICK_NAMESPACE_ACTIVATION, two further rules protect the short and chain-code namespace before a squatter can take it: a top-levelISSUEthat would CREATE a brand-new tick shorter than four characters is refused withinvalid: TICK (length)(editing or re-issuing an existing tick, including the^idform, is unaffected, so anything issued before the flag keeps its owner and supply); and a fixed list of future chain codes (RESERVED_FUTURE_ROOTS, e.g.ETH,SOL,AVAX, …; see Flag-Day Values for the exact list) is reserved the same wayBTC,LTCandDOGEalready are, refused withinvalid: TICK (reserved). Both rules apply to top-level creation only; a subasset such asABCD.Xis unaffected by the length floor. Below the activation the handler is unchanged. - Coin-qualified ticker namespace. At or above
LIST_TICK_COIN_ACTIVATION, a new top-levelTICKwhose name begins with a coin root (BTC,LTCorDOGE, case-folded) followed by a colon, or with aRESERVED_FUTURE_ROOTSentry followed by a colon, is refused withinvalid: TICK (reserved), unless a token of that name already exists. Existing tickers and the^idform are unaffected. Below the gate the handler is unchanged. - Format
7refusals, in addition to the field checks above: a destination not inCOINSother than this chain isinvalid: BRIDGE_CHAINS; a format7on a row withLOCK_BRIDGEalready set isinvalid: BRIDGE_CHAINS (locked); a non-emptyBRIDGE_CHAINSnaming a native tick that contains a dot isinvalid: TICK (subassets are not bridgeable yet); a non-emptyBRIDGE_CHAINSon a token carrying a liveALLOW_LIST,BLOCK_LISTor controller binding isinvalid: TICK (policy-bound tokens are not bridgeable yet); a non-emptyBRIDGE_CHAINSwhoseALLOW_LISTorBLOCK_LISTmembership exceedsXPOLICY_MAX_MEMBERS(10,000) isinvalid: TICK (policy list exceeds XPOLICY_MAX_MEMBERS). BehindTOKEN_POLICY_INHERITANCE_ACTIVATIONthe policy-bound refusal lifts (see Token Bridge); the controller refusal and the membership ceiling never lift on their own. - Formats
5and6on a bridged token. While a row’sBRIDGE_CHAINSis non-empty or itsbridgedbit is set (the bit is set by the first applied bridge lock and never cleared), a format5(list edit) or format6(controller bind/unbind), and a format0re-issue carrying a non-emptyALLOW_LISTorBLOCK_LIST, are refused withinvalid: TICK (bridged tokens cannot be policy-bound yet). EmptyingBRIDGE_CHAINSafterward does not reopen the door while bridged copies are outstanding. BehindTOKEN_POLICY_INHERITANCE_ACTIVATION, formats5and a listed format0on a bridged token apply and propagate to every bridged copy (see Token Bridge); a controller bind (format6) on a bridged token stays refused either way. - Format
6refusals (controller bind/unbind) are listed in Bind and unbind rejections. A class whose unbind is still inside itsCOOLDOWN_BLOCKScooldown refuses both a new bind (invalid: ACTION_CLASS (already bound)) and a second unbind (invalid: ACTION_CLASS (already unbinding)), so replacing a controller means unbind, wait out the cooldown, then bind.
Notes
ISSUETICKwithMAX_SUPPLYandMINT_SUPPLYset to any non0value, to mint supply untilMAX_SUPPLYis reached (owner can mint beyondMAX_MINT)ISSUETICKwithMAX_SUPPLYandMAX_MINTset to any non0value, to enable user minting (fair minting)ISSUETICKwithLOCK_MAX_SUPPLYset to1to permanently lockMAX_SUPPLYISSUETICKwithLOCK_MAX_MINTset to1to permanently lockMAX_MINTISSUETICKwithLOCK_MINTset to1to permanently prevent use of theMINTcommandISSUETICKwithLOCK_SLEEPset to1to permanently prevent use of theSLEEPcommandISSUETICKwithLOCK_CALLBACKset to1to permanently prevent use of theCALLBACKcommandDESCRIPTIONcan contain a URL to a an icon to use for this token (48x48 standard size)DESCRIPTIONcan contain a URL to a JSON file with additional informationDESCRIPTIONcan NOT contain any pipe|or semi-colon;characters, as these are reservedCALLBACK_BLOCK,CALLBACK_TICK, andCALLBACK_AMOUNTcan be edited viaISSUEaction ifTICKsupply is NOT distributed- Note on BRC20/SRC20 familiarity: In BRC20 and SRC20, a
DEPLOYcommand defines a new token. In XChain,ISSUEfills that role. XChain also has a separateDEPLOYaction, but that action deploys a smart contract to the XChain VM; it is not an alias forISSUEand does not create a token. Clients migrating from BRC20/SRC20 should useISSUEwhere they previously usedDEPLOY. - By default any
ADDRESScan interact with aTICK, useALLOW_LISTandBLOCK_LISTto change this behavior CONTROLLERbinds theTICKto a deployed contract (itsACTION_INDEX) on the same chain for oneACTION_CLASS(transfer/trade/burn/…). Once bound, the indexer runs that contract’sguardmethod before guarded native actions of that class settle: enabling enforced royalties, transfer policies, and other programmable rules. The contract must exist and be active when bound; a missing/throwingguardis fail-closed (denies the action). Bindings are append-only (use version6to bind or, withUNBIND=1, to drop one); theCOOLDOWN_BLOCKScommitted at bind time is the friction on a later unbind, so holders can gauge how durable the rules are. Full semantics: Controller-Bound TokensMINT_ADDRESS_MAXcan be used to limit the maximumTICKAMOUNTthat a single address canMINTMINT_START_BLOCKandMINT_STOP_BLOCKcan be used to determine period(s) whenMINTtransactions are allowedMINT_START_BLOCKandMINT_STOP_BLOCKmust be at or after the block theISSUEconfirms in; at/above theISSUE_INHERITED_MINT_WINDOWactivation (see Flag-Day Values) that check applies only when theISSUEexplicitly sets the field, so an owner can re-issue to update other parameters (for exampleMAX_MINT) after the mint window has opened without restating or moving the windowMIN_TOKEN_SUPPLYvalue is 0.000000000000000001- Use
^(caret) as prefix when passingTICK_IDforTICKfields (^1234 =TICK_ID1234) - Use
^(caret) as prefix when passing anADDRESS_IDfor address fields (TRANSFER,TRANSFER_SUPPLY) (^57 =ADDRESS_ID57); see Index ID References ISSUEwithDECIMALS0andLOCK_MAX_SUPPLY1is the standard non-fungible token (NFT) pattern: uniques, editions, and parent/child collections are defined in the NFT Standard
Copyright © 2025–2026 Dankest, LLC
Based on XChain Platform by Dankest, LLC – https://dankest.llc
Licensed under the GNU Affero General Public License v3.0 (AGPL-3.0-or-later) with a commercial license available for proprietary use.
You may use, modify, and distribute this material under the terms of the License. See LICENSE and NOTICE for full terms. See the licensing overview.