Skip to content

Clear Sign Display Guide

Reference for rendering Gatekeeper display data to Clear Sign in your application.

Overview

Gatekeeper returns a resolution object containing structured data for rendering transaction details to users.

This page covers the display schema and how to render each field type.

Response Structure

The resolution is returned as part of the evaluation response:

{
  "data": {
    "action": "eth_sendTransaction",
    "whitelisted": true,
    "resolution": {
      "display": { 
        "intent": "Approve", 
        "interpolatedIntent": "Approve Uniswap V2 Router to spend 1000000 USDC", 
        "interactWith": { 
          "contractName": "USDC Token", 
          "contractAddress": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", 
          "contractChainId": 1
        }, 
        "fields": [ ... ], 
        "requiredFields": [ "Amount", "Spender" ] 
      }, 
      "decoding": {
        "hexSignature": "0x095ea7b3",
        "descriptor": { ... }
      },
      "policyEvaluation": {
        "expectedBehavior": true,
        "matchedPresets": [ ... ]
      },
      "resolutions": null
    },
    "protocolPresets": [ ... ],
    "attestation": { ... }
  }
}

Resolution Schema

FieldTypeDescription
displayobjectHuman-readable data for rendering
decodingobjectTechnical decoding details (ABI, selector)
policyEvaluationobjectPolicy evaluation results
resolutionsarray | nullNested resolutions for multicalls

Display Schema

FieldTypeDescription
intentstring | object | nullTransaction intent label
interpolatedIntentstring | nullHuman-readable summary with values filled in
interactWithobject | nullContract/protocol metadata
fieldsarrayAll fields that can be shown
requiredFieldsarrayFields that MUST be shown

Rendering Guide

To display the Clear Sign data, follow a few best practices.

  1. Display the Context - which contract/protocol is being interacted with?
  2. Display the Intent - what is the transaction doing?
  3. Display the individual fields - what are the values of each field?

Rendering the Context

This data is returned in the resolution.display.interactWith field.

It will be null for personal_sign messages.

Aave Horizon Pool• Aave

0xae05...b516 • Ethereum

FieldTypeDescription
contractNamestringContract display name
protocolIdstringProtocol identifier
protocolNamestringProtocol display name
protocolDescriptionstringProtocol description
contractAddressstringContract address
contractChainIdnumberEVM Chain ID

Rendering the Intent

Display the intent using this priority order:

  1. interpolatedIntent — Human-readable summary with values (e.g., "Approve Uniswap to spend 1000 USDC")
  2. intent — Static action label (e.g., "Approve")
  3. Fallback — Show "Unknown Operation" warning; clear sign not available.

NOTE: intent can be a string or an object where keys are labels.

interpolatedIntent
Approve Uniswap V2 Router to spend 1000 USDC
intent (string)
Approve
intent (object)
Type: Transfer
Action: Send

Field Formats

Each field in fields[] is either a terminal field (has format) or a nested field (has fields).

tokenAmount

Displays a token amount with proper decimal formatting.

Amount
1 USDC
FieldTypeDescription
labelstringField label
format"tokenAmount"Format type
amountstringRaw amount in smallest unit (wei, satoshi, etc.)
tokenobject | nullToken metadata
token.addressstringToken contract address
token.decimalsnumber | nullToken decimals
token.tickerstring | nullToken symbol
token.namestring | nullFull token name

addressName

Displays an Ethereum address with contextual name resolution.

Spender
Gauntlet USDC Prime0xdd0f...490d
FieldTypeDescription
labelstringField label
format"addressName"Format type
addressstringEthereum address
tokenobject | nullToken metadata (if address is a token)
contractobject | nullContract metadata
contract.namestringContract display name

date

Displays a timestamp.

Deadline
October 17, 2025, 03:30 PM
FieldTypeDescription
labelstringField label
format"date"Format type
datestringISO 8601 datetime string

raw

Displays unformatted values for miscellaneous data.

Fee
100
FieldTypeDescription
labelstringField label
format"raw"Format type
valueunknownValue (string, number, boolean, null)

calldata

Displays raw transaction calldata (hex-encoded).

Data
0x095ea7b3000000...
FieldTypeDescription
labelstringField label
format"calldata"Format type
datastringHex-encoded calldata

Nested Fields

Fields can contain sub-fields for grouped data. A nested field has fields instead of format.

Authorization
Authorizer
0x311C...0d6B
Authorized
ERC20 General Adapter
Deadline
July 25, 2025
FieldTypeDescription
labelstringGroup label
fieldsarrayArray of child display fields

Nested Resolutions (Batch Transactions)

For batched transactions (multicalls), resolution.resolutions contains an array of nested resolution objects. Each has the same structure as the top-level resolution.

Detecting Batch Transactions:
const isBatch = resolution.resolutions && resolution.resolutions.length > 0
Example multicall response:
{
  "resolution": {
    "display": {
      "intent": "Multicall",
      "interpolatedIntent": null,
      "interactWith": {
        "contractName": "Morpho Bundler 3",
        "contractAddress": "0x6566194141eefa99Af43Bb5Aa71460Ca2Dc90245"
      },
      "fields": [ ... ]
    },
    "resolutions": [
      {
        "display": {
          "intent": null,
          "interpolatedIntent": "Approve Gauntlet USDC Prime to spend 100 USDC",
          "interactWith": { "contractName": "USDC Token" },
          "fields": [ ... ]
        }
      },
      {
        "display": {
          "intent": "Deposit",
          "interpolatedIntent": "Deposit 100 USDC against gtUSDC for you",
          "interactWith": { "contractName": "Gauntlet USDC Prime" },
          "fields": [ ... ]
        }
      }
    ]
  }
}

Full Example: Morpho Multicall

A complete rendering example using the Morpho BundlerV3 multicall.

Multicall
Morpho Bundler 3Morpho
0x6566...0245