Skip to content

Descriptors

Metadata files that tell Gatekeeper how to decode and display transactions.

What are Descriptors?

Descriptors are JSON files following the ERC-7730 specification. They map raw transaction calldata to human-readable intents by defining:

  • Context — Which contracts and chains the descriptor applies to
  • Metadata — Protocol and contract display names
  • Display formats — How to render each function's parameters

When Gatekeeper receives a transaction, it matches the target contract and function selector against available descriptors to produce structured display data.

Example Descriptor

A descriptor for Aave Horizon Pool's deposit and withdraw functions:

{
  "$schema": "https://eips.ethereum.org/assets/eip-7730/erc7730-v1.schema.json",
  "context": {
    "$id": "aave-ethereum-horizon-pool",
    "contract": {
      "deployments": [
        { "chainId": 1, "address": "0xae05cd22df81871bc7cc2a04becfb516bfe332c8" }
      ]
    }
  },
  "metadata": {
    "owner": "Aave",
    "contractName": "Aave Horizon Pool",
    "info": { "url": "https://aave.com" }
  },
  "display": {
    "formats": {
      "deposit(address asset, uint256 amount, address onBehalfOf, uint16 referralCode)": {
        "intent": "Deposit",
        "interpolatedIntent": "Deposit {#.amount}",
        "fields": [
          {
            "path": "#.asset",
            "label": "Asset",
            "format": "addressName",
            "params": { "types": ["token"] }
          },
          {
            "path": "#.amount",
            "label": "Amount",
            "format": "tokenAmount",
            "params": { "tokenPath": "#.asset" }
          },
          {
            "path": "#.onBehalfOf",
            "label": "Position Owner",
            "format": "addressName",
            "params": { "types": ["wallet", "eoa"] }
          }
        ]
      },
      "withdraw(address asset, uint256 amount, address to)": {
        "intent": "Withdraw",
        "interpolatedIntent": "Withdraw {#.amount}",
        "fields": [
          {
            "path": "#.asset",
            "label": "Asset",
            "format": "addressName",
            "params": { "types": ["token"] }
          },
          {
            "path": "#.amount",
            "label": "Amount",
            "format": "tokenAmount",
            "params": {
              "tokenPath": "#.asset",
              "threshold": "115792089237316195423570985008687907853269984665640564039457584007913129639935",
              "message": "MAX"
            }
          },
          {
            "path": "#.to",
            "label": "Recipient",
            "format": "addressName",
            "params": { "types": ["wallet", "eoa"] }
          }
        ]
      }
    }
  }
}

Key elements:

  • context.contract.deployments — Binds the descriptor to specific contract addresses per chain
  • display.formats — Maps function signatures to display instructions
  • fields[].format — Specifies how to render values (tokenAmount, addressName, etc.)
  • params.tokenPath — Dynamically resolves token metadata from another field
  • params.threshold/message — Displays "MAX" instead of uint256.max

Descriptor Sources

Gatekeeper uses descriptors from:

  • Narval's curated registry — Pre-configured descriptors for supported DeFi protocols
  • Public registries — Official ERC-7730 registry (coming soon)
  • Custom registry — Private registry configured for a self-hosted Gatekeeper instance

Further Reading

For the complete specification on writing descriptors, see the ERC-7730 standard.