---
title: JSON Builder
category: how-to
---

# How to create metadata with the JSON Builder

Generate Clear Signing metadata for your smart contracts in under 10 minutes using the ERC-7730 JSON Builder.

## Prerequisites

Before you start, have the following ready:

- Your smart contract **address** on a supported EVM chain
- Your contract's **ABI** (available on Etherscan or from your deployment artifacts)
- Your **dApp name** and public URL

> **Note:** The JSON Builder works best for single-contract deployments with standard function signatures. If your contract uses EIP-712 messages, nested tuples, proxy patterns, or custom encoding, use the [Manual Implementation](./manual-implementation) guide instead.

## Create your metadata file

### Open the JSON Builder

Go to the [ERC-7730 JSON Builder](https://get-clear-signed.ledger.com/).

![The ERC-7730 JSON Builder interface showing the contract address input field and chain selector](/clear-signing/json-builder-tool.png)

The JSON Builder fetches your ABI automatically when you enter a verified contract address

### Enter your contract details

Paste your checksummed contract address into the **Contract address** field and select the chain it is deployed on. The tool fetches your ABI automatically from Etherscan.

If automatic ABI fetching fails—for example because the contract is not verified—paste your ABI JSON directly into the **ABI** field. You can copy it from your deployment artifacts, Hardhat build output, or your block explorer.

### Add your dApp information

Enter your **dApp name** (shown to users during signing) and your **dApp URL**. These values populate the `owner` and `info.url` fields in the generated metadata.

### Select the functions to describe

The tool lists every public and external function from your ABI. Select the functions users will call directly when interacting with your dApp—for example `transfer`, `swap`, or `approve`. You do not need to include internal, pure, or owner-only functions that users will never sign.

### Configure the display for each function

For each selected function, define the following:

- **Intent** – a short verb phrase shown to the user on their signer (for example, "Send" or "Swap tokens")
- **Field labels** – human-readable names for each parameter (for example, rename `_to` to "Recipient")
- **Field formats** – how each value is displayed (for example, `tokenAmount` for ERC-20 values, `addressOrName` for Ethereum addresses, `date` for timestamps)

To choose the right format for each field, refer to the [Format types reference](../reference/specifications#format-types).

> **Warning:** Every parameter in the function signature must either be assigned a display format or explicitly excluded. The validator will reject the file if any parameter is left unaccounted for.

### Preview the result

Click **Preview** to see how your metadata will appear on a Ledger signer. Verify that each field shows the correct label and value. If a field displays raw hex data instead of a readable value, check that the format and its required parameters are correctly configured.

### Export the JSON file

Click **Export** to download your metadata file. The file is now ready for validation and submission to the registry.

## What the exported file looks like

The JSON Builder produces a file in the ERC-7730 format. Here is an example for an ERC-20 `transfer` function:

```json
{
  "$schema": "https://eips.ethereum.org/assets/eip-7730/erc7730-v1.schema.json",
  "context": {
    "contract": {
      "abi": "https://api.etherscan.io/api?module=contract&action=getabi&address=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
      "deployments": [
        { "chainId": 1, "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" }
      ]
    }
  },
  "metadata": {
    "owner": "Circle",
    "info": { "url": "https://www.circle.com/" }
  },
  "display": {
    "formats": {
      "transfer(address,uint256)": {
        "intent": "Send",
        "fields": [
          { "path": "_to", "label": "Recipient", "format": "addressOrName" },
          {
            "path": "_value",
            "label": "Amount",
            "format": "tokenAmount",
            "params": { "tokenPath": "@.to" }
          }
        ],
        "required": ["_to", "_value"],
        "excluded": []
      }
    }
  }
}
```

## Troubleshooting

ABI fetch fails or returns an empty result

This happens when the contract is not verified on Etherscan, or when the contract is deployed on a chain where automatic ABI fetching is not supported.



A function does not appear in the function list

The tool lists only external and public functions. Internal, private, and view functions are not shown.



The preview shows raw values instead of formatted labels

A field format may be missing a required parameter. For example, tokenAmount requires either tokenPath or a direct token address.



Your metadata file is ready. The next step is to validate it and submit it to the registry.

## Next steps

[<div className="font-semibold mb-2">Validate & Submit →</div>
<div className="text-sm text-gray-400">Test your metadata file and open a pull request to the registry</div>](./validate-submit)

[<div className="font-semibold mb-2">Manual Implementation →</div>
<div className="text-sm text-gray-400">Write metadata manually for EIP-712 messages, multi-chain deployments, or complex contracts</div>](./manual-implementation)

> **Note:** To help improve the JSON Builder, <a href="https://tally.so/r/mObbWM" target="_blank" className="text-orange-400 hover:text-orange-300">fill in the feedback form</a>.
