> For the complete documentation index, see [llms.txt](https://docs.axiomeinfo.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.axiomeinfo.org/developer-documentation/add-extended-cw20-token-info.md).

# Add Extended CW20 Token Info

You can enhance your CW20 token with rich metadata such as website, social links, full description, images, and legal/audit info — stored off-chain and referenced from `marketing_info.project` in your smart contract.

***

### Step 1: Prepare Extended Metadata <a href="#step-1-prepare-extended-metadata" id="step-1-prepare-extended-metadata"></a>

The extended metadata must be stored as a JSON file hosted on a publicly accessible URL. The URL will be placed in the CW20 `marketing_info.project` field **with SHA-256 checksum verification** to ensure data integrity.

**JSON Format Specification**

Here is the approved format of the metadata file:

```json
{
  "version": "1.0",
  "name": "MyToken",
  "symbol": "MTK",
  "website": "https://mytoken.example.com",
  "description": {
    "format": "markdown",
    "image_url": "https://mytoken.example.com/images/logo-large.png",
    "video_url": "https://www.youtube.com/@axiome_ru",
    "content": [
       {
         "language": "en",
         "text": "Full token description in markdown or plain text, no more then 60k symbols..."
       },
       {
         "language": "de",
         "text": "Vollständige Token-Beschreibung in Markdown- oder Klartextformat, nicht mehr als 60.000 Zeichen …"
       }
     }
  },
  "socials": {
    "X (ex. Twitter)": "https://twitter.com/mytoken",
    "Telegram": "https://t.me/mytokenchat",
    "Discord": "https://discord.gg/mytoken",
    "GitHub": "https://github.com/mytoken"
  },
  "legal": {
    "terms_url": "https://mytoken.example.com/terms",
    "privacy_url": "https://mytoken.example.com/privacy"
  },
  "audit": [
    {
      "provider": "Certik",
      "url": "https://certik.com/projects/mytoken",
      "date": "2024-12-01"
    }
  ],
  "contacts": {
    "email": "contact@mytoken.example.com",
    "support_url": "https://mytoken.example.com/support"
  }
}
```

**Notes:**

* `description.format` must be either `"markdown"` or `"text"`
* any fields except `version`, `name`, `symbol` can be set to `null` if not used
* `socials` can include any keys (e.g., TikTok, Instagram, etc.)
* `description.content` can contain either a string or an array of objects:
  * If a string is provided, it will be used directly as the token description.
  * If an array of objects is provided, each object must have the following structure:\
    `{ "language": "<2-letter code>", "text": "<description string>" }`.\
    In this case, the application or explorer will select the most appropriate translation based on the user’s selected language.\
    The selection algorithm is as follows:
    1. Attempt to find a translation matching the user’s language using a two-letter language code according to **ISO 639-1**.
    2. If no matching language is found, attempt to use the `en` (English) translation.
    3. If `en` is not available, use the first translation in the list.

***

### Step 2: Calculate SHA-256 <a href="#step-2-calculate-sha-256" id="step-2-calculate-sha-256"></a>

To ensure the metadata has not been tampered with, calculate its **SHA-256 checksum** (of the raw file content).

**On Linux/macOS:**

```json
curl -s https://cdn.example.com/exmpl.json | sha256sum
```

**On Windows (PowerShell):**

```powershell
Invoke-WebRequest -Uri "https://cdn.example.com/exmpl.json" -UseBasicParsing | % Content | `
    Out-File -Encoding ascii -FilePath metadata.json
Get-FileHash metadata.json -Algorithm SHA256
```

Suppose the result is:

```
aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899
```

***

### Step 3: Upload Project Info to the Contract <a href="#step-3-upload-project-info-to-the-contract" id="step-3-upload-project-info-to-the-contract"></a>

CW20 contracts support setting `marketing_info.project` with a URL that includes the `sha256sum` as a query parameter.

**Example `axmd` TX to set the project info:**

```sh
axmd tx wasm execute <contract_address> '{
  "update_marketing": {
    "project": "https://cdn.example.com/exmpl.json?sha256sum=aabbccddeeff00112233445566778899aabbccddeeff00112233445566778899"
  }
}' \
--from <your_wallet_name> \
--gas auto --gas-adjustment 1.3 --fees 5000uaxm \
--chain-id demo
```

Replace:

* `<contract_address>` — with the CW20 contract address
* `<your_wallet_name>` — with your wallet (keyring) name

***

#### Done! <a href="#done" id="done"></a>

Once the transaction is confirmed, your token will have a verifiable extended metadata link accessible via `marketing_info.project`.

Axiome Wallet, Axiome Explorer, and dApps can parse this JSON and render:

* Full token details
* Social links
* Brand image/video
* Contact and legal info
