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
| Field | Type | Description |
|---|---|---|
display | object | Human-readable data for rendering |
decoding | object | Technical decoding details (ABI, selector) |
policyEvaluation | object | Policy evaluation results |
resolutions | array | null | Nested resolutions for multicalls |
Display Schema
| Field | Type | Description |
|---|---|---|
intent | string | object | null | Transaction intent label |
interpolatedIntent | string | null | Human-readable summary with values filled in |
interactWith | object | null | Contract/protocol metadata |
fields | array | All fields that can be shown |
requiredFields | array | Fields that MUST be shown |
Rendering Guide
To display the Clear Sign data, follow a few best practices.
- Display the Context - which contract/protocol is being interacted with?
- Display the Intent - what is the transaction doing?
- 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.
0xae05...b516 • Ethereum
| Field | Type | Description |
|---|---|---|
contractName | string | Contract display name |
protocolId | string | Protocol identifier |
protocolName | string | Protocol display name |
protocolDescription | string | Protocol description |
contractAddress | string | Contract address |
contractChainId | number | EVM Chain ID |
Rendering the Intent
Display the intent using this priority order:
interpolatedIntent— Human-readable summary with values (e.g., "Approve Uniswap to spend 1000 USDC")intent— Static action label (e.g., "Approve")- Fallback — Show "Unknown Operation" warning; clear sign not available.
NOTE: intent can be a string or an object where keys are labels.
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.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
format | "tokenAmount" | Format type |
amount | string | Raw amount in smallest unit (wei, satoshi, etc.) |
token | object | null | Token metadata |
token.address | string | Token contract address |
token.decimals | number | null | Token decimals |
token.ticker | string | null | Token symbol |
token.name | string | null | Full token name |
addressName
Displays an Ethereum address with contextual name resolution.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
format | "addressName" | Format type |
address | string | Ethereum address |
token | object | null | Token metadata (if address is a token) |
contract | object | null | Contract metadata |
contract.name | string | Contract display name |
date
Displays a timestamp.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
format | "date" | Format type |
date | string | ISO 8601 datetime string |
raw
Displays unformatted values for miscellaneous data.
| Field | Type | Description |
|---|---|---|
label | string | Field label |
format | "raw" | Format type |
value | unknown | Value (string, number, boolean, null) |
calldata
Displays raw transaction calldata (hex-encoded).
0x095ea7b3000000...| Field | Type | Description |
|---|---|---|
label | string | Field label |
format | "calldata" | Format type |
data | string | Hex-encoded calldata |
Nested Fields
Fields can contain sub-fields for grouped data. A nested field has fields instead of format.
| Field | Type | Description |
|---|---|---|
label | string | Group label |
fields | array | Array 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.
const isBatch = resolution.resolutions && resolution.resolutions.length > 0{
"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.

