> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ton.org/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.ton.org/feedback

```json
{
  "path": "/standard/tokens/jettons/mintless/deploy",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# How to deploy mintless Jetton

export const Aside = ({type = "note", title = "", icon = "", iconType = "regular", children}) => {
  const asideVariants = ["note", "tip", "caution", "danger"];
  const asideComponents = {
    note: {
      outerStyle: "border-sky-500/20 bg-sky-50/50 dark:border-sky-500/30 dark:bg-sky-500/10",
      innerStyle: "text-sky-900 dark:text-sky-200",
      calloutType: "note",
      icon: <svg width="14" height="14" viewBox="0 0 14 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="w-4 h-4 text-sky-500" aria-label="Note">
          <path fill-rule="evenodd" clip-rule="evenodd" d="M7 1.3C10.14 1.3 12.7 3.86 12.7 7C12.7 10.14 10.14 12.7 7 12.7C5.48908 12.6974 4.0408 12.096 2.97241 11.0276C1.90403 9.9592 1.30264 8.51092 1.3 7C1.3 3.86 3.86 1.3 7 1.3ZM7 0C3.14 0 0 3.14 0 7C0 10.86 3.14 14 7 14C10.86 14 14 10.86 14 7C14 3.14 10.86 0 7 0ZM8 3H6V8H8V3ZM8 9H6V11H8V9Z"></path>
        </svg>
    },
    tip: {
      outerStyle: "border-emerald-500/20 bg-emerald-50/50 dark:border-emerald-500/30 dark:bg-emerald-500/10",
      innerStyle: "text-emerald-900 dark:text-emerald-200",
      calloutType: "tip",
      icon: <svg width="11" height="14" viewBox="0 0 11 14" fill="currentColor" xmlns="http://www.w3.org/2000/svg" className="text-emerald-600 dark:text-emerald-400/80 w-3.5 h-auto" aria-label="Tip">
          <path d="M3.12794 12.4232C3.12794 12.5954 3.1776 12.7634 3.27244 12.907L3.74114 13.6095C3.88471 13.8248 4.21067 14 4.46964 14H6.15606C6.41415 14 6.74017 13.825 6.88373 13.6095L7.3508 12.9073C7.43114 12.7859 7.49705 12.569 7.49705 12.4232L7.50055 11.3513H3.12521L3.12794 12.4232ZM5.31288 0C2.52414 0.00875889 0.5 2.26889 0.5 4.78826C0.5 6.00188 0.949566 7.10829 1.69119 7.95492C2.14321 8.47011 2.84901 9.54727 3.11919 10.4557C3.12005 10.4625 3.12175 10.4698 3.12261 10.4771H7.50342C7.50427 10.4698 7.50598 10.463 7.50684 10.4557C7.77688 9.54727 8.48281 8.47011 8.93484 7.95492C9.67728 7.13181 10.1258 6.02703 10.1258 4.78826C10.1258 2.15486 7.9709 0.000106649 5.31288 0ZM7.94902 7.11267C7.52078 7.60079 6.99082 8.37878 6.6077 9.18794H4.02051C3.63739 8.37878 3.10743 7.60079 2.67947 7.11294C2.11997 6.47551 1.8126 5.63599 1.8126 4.78826C1.8126 3.09829 3.12794 1.31944 5.28827 1.3126C7.2435 1.3126 8.81315 2.88226 8.81315 4.78826C8.81315 5.63599 8.50688 6.47551 7.94902 7.11267ZM4.87534 2.18767C3.66939 2.18767 2.68767 3.16939 2.68767 4.37534C2.68767 4.61719 2.88336 4.81288 3.12521 4.81288C3.36705 4.81288 3.56274 4.61599 3.56274 4.37534C3.56274 3.6515 4.1515 3.06274 4.87534 3.06274C5.11719 3.06274 5.31288 2.86727 5.31288 2.62548C5.31288 2.38369 5.11599 2.18767 4.87534 2.18767Z"></path>
        </svg>
    },
    caution: {
      outerStyle: "border-amber-500/20 bg-amber-50/50 dark:border-amber-500/30 dark:bg-amber-500/10",
      innerStyle: "text-amber-900 dark:text-amber-200",
      calloutType: "warning",
      icon: <svg className="flex-none w-5 h-5 text-amber-400 dark:text-amber-300/80" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2" aria-label="Warning">
          <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path>
        </svg>
    },
    danger: {
      outerStyle: "border-red-500/20 bg-red-50/50 dark:border-red-500/30 dark:bg-red-500/10",
      innerStyle: "text-red-900 dark:text-red-200",
      calloutType: "danger",
      icon: <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" className="text-red-600 dark:text-red-400/80 w-4 h-4" aria-label="Danger">
          <path d="M17.1 292c-12.9-22.3-12.9-49.7 0-72L105.4 67.1c12.9-22.3 36.6-36 62.4-36l176.6 0c25.7 0 49.5 13.7 62.4 36L494.9 220c12.9 22.3 12.9 49.7 0 72L406.6 444.9c-12.9 22.3-36.6 36-62.4 36l-176.6 0c-25.7 0-49.5-13.7-62.4-36L17.1 292zm41.6-48c-4.3 7.4-4.3 16.6 0 24l88.3 152.9c4.3 7.4 12.2 12 20.8 12l176.6 0c8.6 0 16.5-4.6 20.8-12L453.4 268c4.3-7.4 4.3-16.6 0-24L365.1 91.1c-4.3-7.4-12.2-12-20.8-12l-176.6 0c-8.6 0-16.5 4.6-20.8 12L58.6 244zM256 128c13.3 0 24 10.7 24 24l0 112c0 13.3-10.7 24-24 24s-24-10.7-24-24l0-112c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z"></path>
        </svg>
    }
  };
  let variant = type;
  let gotInvalidVariant = false;
  if (!asideVariants.includes(type)) {
    gotInvalidVariant = true;
    variant = "danger";
  }
  const iconVariants = ["regular", "solid", "light", "thin", "sharp-solid", "duotone", "brands"];
  if (!iconVariants.includes(iconType)) {
    iconType = "regular";
  }
  return <>
      <div className={`callout my-4 px-5 py-4 overflow-hidden rounded-2xl flex gap-3 border ${asideComponents[variant].outerStyle}`} data-callout-type={asideComponents[variant].calloutType}>
        <div className="mt-0.5 w-4" data-component-part="callout-icon">
          {}
          {icon === "" ? asideComponents[variant].icon : <Icon icon={icon} iconType={iconType} size={14} />}
        </div>
        <div className={`text-sm prose min-w-0 w-full ${asideComponents[variant].innerStyle}`} data-component-part="callout-content">
          {gotInvalidVariant ? <p>
              <span className="font-bold">
                Invalid <code>type</code> passed!
              </span>
              <br />
              <span className="font-bold">Received: </span>
              {type}
              <br />
              <span className="font-bold">Expected one of: </span>
              {asideVariants.join(", ")}
            </p> : <>
              {title && <p className="font-bold">{title}</p>}
              {children}
            </>}
        </div>
      </div>
    </>;
};

## Introduction

Mintless jettons represent a revolutionary approach to token distribution on the TON blockchain. This guide provides a comprehensive walkthrough for deploying mintless jettons, from initial setup to production deployment and ongoing maintenance.

<Aside>
  Before deploying a mintless jetton, ensure you understand the [basic concepts](/standard/tokens/jettons/mintless) and have experience with standard jetton deployment.
</Aside>

**Prerequisites**

Before starting the deployment process, ensure you have:

* A TON wallet with sufficient funds for deployment
* Understanding of Merkle trees and cryptographic proofs
* Access to hosting infrastructure for off-chain data
* List of airdrop recipients with their allocated amounts
* Development environment set up for TON smart contracts

## Step-by-Step Deployment Guide

Deploying a mintless jetton involves several critical steps:

### 1. Prepare the Merkle Tree

The foundation of any mintless jetton is a properly constructed Merkle tree containing all airdrop data.

#### Data Collection

* **Compile recipient list**: Gather all wallet addresses eligible for the airdrop
* **Determine allocations**: Assign token amounts to each recipient based on your distribution criteria
* **Set time constraints**: Define `start_from` and `expired_at` timestamps for claim availability

#### Tree Generation Process

```
AirdropItem Structure:
- amount: Coins (allocated tokens)
- start_from: uint48 (Unix timestamp for claim start)
- expired_at: uint48 (Unix timestamp for claim expiry)
```

* Generate a Merkle tree with all airdrop recipients and their respective amounts
* Each leaf contains an `AirdropItem` with amount, start time, and expiry
* Compute the root `merkle_hash` that will be stored on-chain

#### Best Practices

* **Validate addresses**: Ensure all recipient addresses are valid TON addresses
* **Check allocations**: Verify total allocation doesn't exceed intended supply
* **Test tree generation**: Use small datasets first to validate your tree construction process

### 2. Deploy the Jetton Master Contract

The jetton master contract must be extended to support mintless functionality.

#### Contract Requirements

* Include the `merkle_hash` in the contract's storage
* Implement the `get_mintless_airdrop_hashmap_root` get-method
* Ensure compatibility with [TEP-177](https://github.com/ton-blockchain/TEPs/pull/177) standard
* Use the [mintless jetton standard implementation](https://github.com/ton-community/mintless-jetton) as a reference

#### Storage Extensions

```
Standard jetton storage + {
  merkle_hash: uint256  // Root hash of the Merkle tree
}
```

#### Deployment Checklist

* [ ] Contract includes merkle\_hash in storage
* [ ] All standard jetton methods are implemented
* [ ] Mintless-specific get-methods are available
* [ ] Contract has been thoroughly tested
* [ ] Deployment transaction has sufficient gas

### 3. Set Up Off-Chain Infrastructure

Mintless jettons require robust off-chain infrastructure to serve Merkle proofs and tree data.

#### Merkle Tree Hosting

* **Storage options**: TON Storage, IPFS, AWS S3, or other reliable hosting
* **File format**: Store complete tree as BoC (Bag of Cells) file
* **Accessibility**: Ensure high availability and fast access times
* **Redundancy**: Consider multiple hosting locations for reliability

#### Custom Payload API Implementation

Implement an API endpoint that provides:

* Individual Merkle proofs for specific addresses
* Initialization data for Jetton wallet deployment
* Verification of claim eligibility

**API Endpoints:**

```
GET /api/v1/proof/{address}
Response: {
  "proof": "base64_encoded_merkle_proof",
  "init_data": "base64_encoded_init_data",
  "amount": "1000000000",
  "start_from": 1699123200,
  "expired_at": 1699209600
}
```

#### Performance Considerations

* **Caching**: Implement aggressive caching for frequently requested proofs
* **Load balancing**: Use CDN or load balancers for high-traffic scenarios
* **Rate limiting**: Protect against abuse while ensuring legitimate access

### 4. Configure Metadata

Update your jetton's metadata to include mintless-specific fields.

#### Required Metadata Fields

According to the [metadata standard](https://github.com/ton-blockchain/TEPs/blob/master/text/0064-token-data-standard.md):

```json theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
{
  "name": "Your Mintless Token",
  "symbol": "YMT",
  "decimals": "9",
  "description": "Description of your token",
  "image": "https://example.com/token-logo.png",
  "mintless_merkle_dump_uri": "https://example.com/merkle-tree.boc",
  "custom_payload_api_uri": "https://example.com/api/v1/"
}
```

#### Key Considerations

* **mintless\_merkle\_dump\_uri**: Direct link to the complete Merkle tree data
* **custom\_payload\_api\_uri**: Base URL for the custom payload API
* **Hosting reliability**: Ensure these URIs remain accessible long-term
* **HTTPS requirement**: Use secure connections for all external resources

## Development Tools and Utilities

Several specialized tools can assist with mintless jetton development and auditing.

### mintless-proof-generator (TON Core)

Official utility from the TON blockchain core team for Merkle proof generation and verification.

#### Installation

1. **Clone and build**:

```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
git clone https://github.com/ton-blockchain/ton
cd ton
git checkout testnet
mkdir build && cd build
cmake ../
make mintless-proof-generator
```

The compiled utility is located at `build/crypto/mintless-proof-generator`.

#### Usage

**Parse and verify Merkle tree:**

```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
build/crypto/mintless-proof-generator parse <input-boc> <output-file>
```

This command:

* Prints the mintless Merkle dump cell hash
* Stores the airdrop list in `<output-file>`
* Format: `<address> <amount> <start_from> <expired_at>` (one per line)

**Generate all Merkle proofs:**

```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
build/crypto/mintless-proof-generator make_all_proofs <input-boc> <output-file>
```

Use this for creating the complete proof set needed for `custom_payload_api_uri`.

### mintless-toolbox (Tonkeeper)

Community-developed utility from the Tonkeeper team with additional features.

#### Installation

```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
git clone https://github.com/tonkeeper/mintless-toolbox.git
cd mintless-toolbox
make
```

#### Usage

**Dump airdrop data:**

```bash theme={"theme":{"light":"github-light-default","dark":"dark-plus"},"languages":{"custom":["/resources/grammars/tolk.tmLanguage.json","/resources/grammars/tlb.tmLanguage.json","/resources/grammars/fift.tmLanguage.json","/resources/grammars/tasm.tmLanguage.json","/resources/grammars/func.tmLanguage.json"]}}
./bin/mintless-cli dump <airdrop-filename>
```

This utility:

* Reads airdrop files in various formats
* Outputs data in CSV format: `address,amount,start_from,expired_at`
* Provides additional validation and formatting options
