<!-- GENERATED by scripts/gen-ai-docs.mjs from ai/capability-pack.json — do not edit by hand; edit the JSON and rerun. -->

# Reference: Capabilities (what ChainRender can do, and how)

Every capability an app can use, with the mechanism, the arguments, the trust grade it earns and when to reach for it. This is the same capability pack the visual builder gives its AI, from the same file (`ai/capability-pack.json`), so an AI reading this page and the builder's AI see identical guidance.

Two companion pages are exact by construction: **[All Resolver Kinds](./resolver-kinds.md)** (every kind's arguments and encoding, and where its contract is deployed) and **[Deployed Addresses](./addresses.md)** (every address, per chain). Take arguments and addresses from those pages, never from an example below.

## Workflow

- TARGET: the builder tells you to produce a component | miniapp | standalone (see outputTargets). Structure your output to match. If not told, infer from complexity; default to component.
- Compose a Node tree using ONLY the nodeTypes below.
- For live data, use a slot/image with a resolver 'bind' from resolverKinds.
- For user actions (write/mint/claim), use a button with a declared action {to, sig, value?, args}.
- Keep it Grade A: on-chain reads + on-chain art, no off-chain fetch. Rich media (p5/three) is ⚙, honestly labeled.
- The output is graded + validated + compiled by ChainRender — you don't need to be trusted, your output is checked.

## Node types

| Type | What it is |
|---|---|
| `box` | container; direction row\|column; holds children; the layout primitive. Layout/spacing/surface style tokens are client 0.20 Enhanced mode (VERSION_5): its interpreter is deployed, but the viewer does not style them yet (docs/202 phase 3), so do not use them. |
| `text` | text/heading/status/label/note (role attr); the content primitive |
| `button` | a clickable that carries a declared action (or is inert); NEVER arbitrary code |
| `input` | a form field (text/number); its value feeds action args via $name |
| `icon` | a named on-chain icon glyph |
| `link` | an anchor (href) |
| `slot` | binds live on-chain DATA via a resolver (renders a value/region) |
| `image` | binds on-chain MEDIA/art via a resolver (renders SVG/data-URI) |
| `ref` | references another registered component by hash (composition) |

## Capability bits (declare what the app does)

| Bit | When to declare it |
|---|---|
| `READ_CHAIN` | the universal baseline; any on-chain read. Grade A. |
| `WRITE_CHAIN` | declare when the app has a state-changing action (button that writes). |
| `TRANSFER_VALUE` | declare when an action carries ETH value (e.g. payable mint). Value-smuggle is refused if undeclared. |
| `SIGN_MESSAGE` | declare for EIP-712 typed signing. |
| `BATCH_EXECUTE` | declare for batched actions (one signature, N gated calls). |
| `CLIENT_FETCH` | declare for an off-chain fetch (drops grade to C unless it's a fail-closed enhancement over a floor). |
| `GPU_EXECUTE` | declare for GPU/rich-media enhancement (SDF ray-march, p5/three) — must have an on-chain poster floor. |

## Output targets

The builder tells you WHICH target to produce (a user choice). Structure your output to match it. If unspecified, infer from complexity: a single piece → component; a self-contained embeddable widget → mini-app; a multi-screen app with navigation → standalone. Default to 'component' when ambiguous.

| Target | What | Produce | Compiled by | Use when |
|---|---|---|---|---|
| `component` | A single reusable node tree — one registered component, one content hash. | Return ONE Node tree (a box with children). No views, no composition. | compileComponent(tree) → { hash, hex } | a card, a chart, a mint widget, a profile badge — a piece meant to stand alone or be embedded/referenced elsewhere. |
| `miniapp` | A composition: a scene/shell + N placed components in a declared arrangement. Forkable, embeddable, capability envelope = UNION of placed components. | Return an array of component trees + an arrangement (which component goes where). Each component is compiled, then combined via buildComposition. | buildComposition({ components, arrangement }) → forkable manifest | a self-contained widget others can fork or place — a Farcaster frame, an embeddable dashboard, a composed studio. Smaller than a full app, more than one component. |
| `standalone` | A full app: multiple VIEWS with in-app navigation + its own capability envelope + (optional) a persistent shell. | Return an array of view trees (each a Node tree) + the nav type (tabs/wizard/master-detail/modal) + an optional shell. Each view compiles to a hash; combine with buildTabs/buildWizard/buildMasterDetail/buildModal. | buildTabs([viewHashes], {shell}) (or buildWizard/buildMasterDetail/buildModal) → app root hash | a multi-screen app — Mint/Gallery/My-NFTs; Quote/Venues/Route; a wizard flow. The flagship pattern. |

## Capabilities by category

72 capabilities in 25 categories:

Data / live reads (12) · Identity / ENS (7) · Privacy / credentials (2) · Privacy / attestation (1) · Visual / on-chain art (6) · Visual / rich media (1) · Visual / effects (2) · Visual / media (1) · Charts (1) · Structure / UI (5) · Actions / write (3) · Actions / sign (1) · Actions / verify (1) · Composition (3) · Presentation / theming (1) · Naming / ENS subnames (2) · Naming / versioning (1) · Trust (1) · DeFi / positions & trade (7) · RWA / compliance (3) · Reputation / social (4) · DeFi / intent & programmatic orders (3) · RWA / tokenized vaults (2) · Multiplayer / games (1) · Backend / app contract (1)

### Data / live reads

#### Chainlink price

| | |
|---|---|
| **How** | slot bind 'oracle-feed' |
| **Arguments** | feed:address, fracDigits:uint8, maxStaleSeconds:uint256 |
| **Grade** | A |
| **Use when** | show a live token price from a Chainlink feed; stale feeds are badged, never faked |
| **Example** | slot bind=oracle-feed arg=encode(feedAddr, 4, 3600) |
| **See** | [reference/data-sources](../reference/data-sources.md) |

#### Chainlink history chart

| | |
|---|---|
| **How** | image bind "chart" with argValues {feed, points, chartType, title, decimals}; the builder fills ChartSlotAdapter + ChainlinkChartSource (chart.chainlinkHistoryChartArgs) |
| **Grade** | A |
| **Use when** | a live price-history line chart driven by a Chainlink feed's on-chain rounds |
| **See** | [reference/data-sources](../reference/data-sources.md) |

#### Uniswap V3 price

| | |
|---|---|
| **How** | slot bind via UniswapV3PriceResolver |
| **Grade** | A |
| **Use when** | live spot/TWAP price from a Uniswap V3 pool |
| **See** | [reference/data-sources](../reference/data-sources.md) |

#### Aave reserve

| | |
|---|---|
| **How** | slot via AaveReserveResolver |
| **Grade** | A |
| **Use when** | live lending-pool rate/reserve data |
| **See** | [reference/data-sources](../reference/data-sources.md) |

#### ERC-20 balance

| | |
|---|---|
| **How** | slot via Erc20BalanceResolver |
| **Grade** | A |
| **Use when** | a wallet's token balance, formatted with the token's own decimals |
| **See** | [reference/data-sources](../reference/data-sources.md) |

#### The viewer's own wallet (balance, token balance, ENS name, identicon)

| | |
|---|---|
| **How** | a client slot whose account arg is "$viewer": { "type": "slot", "bind": "erc20balance", "argValues": { "token": "0x…", "account": "$viewer" } } (identicon / gidenticon on an image node). Leave out resolver and arg. |
| **Arguments** | balance / balanceWei {account}, erc20balance / erc20balanceRaw {token, account}, ensName {who}, identicon / gidenticon {account} — the account arg is "$viewer" |
| **Grade** | ⚙ above the floor: the on-chain render shows the fallback text to everyone; a ChainRender viewer fills it with this chain's own resolver only after the person chooses to show their data in this app |
| **Use when** | show the connected person their own balance, token balance, primary ENS name or identicon. Not for anything that decides what the app shows or does: "$viewer" never goes into an action, a signature or a condition. No other kind can read it (no portfolio total). |
| **See** | [guides/viewer-reads](../guides/viewer-reads.md) |

#### Transfer history (client-side, from logs)

| | |
|---|---|
| **How** | a client slot bound to "transfers": { "type": "slot", "bind": "transfers", "argValues": { "kind": "token-transfers", "account": "$viewer", "token": "0x…", "blocks": "5000", "limit": "20" } } |
| **Arguments** | kind (token-transfers, erc20-transfers, nft-transfers, native-transfers), account ("$viewer" or an address) and/or token (an address), blocks 1..45000 (default 5000), limit 1..50 (default 20) |
| **Grade** | ⚙ above the floor: the viewer reads the chain's logs (paged eth_getLogs) and states the block window it read; zero-value and dust transfers are hidden and counted, look-alike addresses are flagged, tokens the app did not name are marked unverified |
| **Use when** | recent transfers for the viewer (needs their choice to show their data) or for a fixed address or token. Say next to it that it covers a recent block window, not all time. |
| **See** | [guides/viewer-reads](../guides/viewer-reads.md) |

#### ERC-721 metadata

| | |
|---|---|
| **How** | image bind 'nftImage' + Erc721/NftImageResolver |
| **Grade** | A |
| **Use when** | render an NFT's on-chain art/metadata from its tokenURI |
| **See** | [guides/nft-collection-frontend](../guides/nft-collection-frontend.md) |

#### Generic view read (CallResolver)

| | |
|---|---|
| **How** | slot bind 'staticread' → CallResolver |
| **Arguments** | target, callData, returnType, format |
| **Grade** | A |
| **Use when** | READ ANY view function on ANY contract (the developer's own contract) — the most important reader for custom backends |
| **Example** | read totalSupply()/mintPrice()/balanceOf(addr) on a custom ERC-721 |
| **See** | [reference/data-sources](../reference/data-sources.md) |

#### Multi-call read

| | |
|---|---|
| **How** | MultiCallResolver (join/sum/reduce) |
| **Grade** | A |
| **Use when** | combine several view reads into one value/list |
| **See** | [reference/data-sources](../reference/data-sources.md) |

#### Computed read

| | |
|---|---|
| **How** | ComputeResolver |
| **Grade** | A |
| **Use when** | a derived value from a small on-chain computation over reads |
| **See** | [reference/data-sources](../reference/data-sources.md) |

#### Event reads / live regions

| | |
|---|---|
| **How** | slot marked live (DataBinder) |
| **Grade** | A |
| **Use when** | a value that re-reads each block (a ticking counter, a live rate) |
| **See** | [guides/live-data-and-events](../guides/live-data-and-events.md) |

### Identity / ENS

#### ENS name

| | |
|---|---|
| **How** | slot bind 'ensName' |
| **Arguments** | node:bytes32 (namehash) |
| **Grade** | A |
| **Use when** | reverse-resolve an address to its ENS name (forward-verified, anti-spoof) |
| **See** | [guides/ens-integration](../guides/ens-integration.md) |

#### ENS text record

| | |
|---|---|
| **How** | slot bind 'ensText' |
| **Arguments** | node:bytes32, key:string |
| **Grade** | A |
| **Use when** | read an ENS text record (avatar, url, description) |
| **See** | [guides/ens-integration](../guides/ens-integration.md) |

#### ENS address

| | |
|---|---|
| **How** | slot bind 'ensAddr' |
| **Arguments** | node:bytes32 |
| **Grade** | A |
| **Use when** | resolve an ENS name to its address |

#### ENS v2 (CCIP/offchain-aware)

| | |
|---|---|
| **How** | slot bind 'ensV2' |
| **Arguments** | dnsName:bytes, call:bytes |
| **Grade** | A |
| **Use when** | universal-resolver path; offchain records surface as 'off-chain (CCIP)' |

#### ENS profile (identicon/avatar)

| | |
|---|---|
| **How** | image bind 'gidenticon' (on-chain identicon). An ENS avatar is an off-chain pointer: read the `avatar` text record with 'enstext', and any image fetched from it is CLIENT_FETCH |
| **Grade** | A (identicon) / C (fetched avatar) |
| **Use when** | a profile picture — on-chain identicon (A) or ENS avatar (needs CLIENT_FETCH → C) |

#### ENS app manifest

| | |
|---|---|
| **How** | slot bind 'ensApp' (ENS text key chainrender.app) |
| **Arguments** | node:bytes32 (ENS namehash) |
| **Grade** | A |
| **Use when** | read a name app-manifest text key (chainrender.app) and render/launch the on-chain app it names — ENS as the naming layer for ChainRender apps (dogfood chainrender.eth); works wherever ENS text resolves |
| **See** | [guides/ens-integration](../guides/ens-integration.md) |

#### ENSIP-19 multichain primary name

| | |
|---|---|
| **How** | slot bind 'ensNameChain' (per-coinType verified reverse) |
| **Arguments** | who:address, coinType:uint256 (ENSIP-11: 0x80000000 \| chainId; mainnet=60) |
| **Grade** | A |
| **Use when** | the primary ENS name an address resolves to ON A GIVEN CHAIN (chain-aware identity), forward-verified addr(node,coinType)==who. Renders a live name only where an ENSIP-19 reverse registrar for that coinType is populated |
| **See** | [guides/ens-integration](../guides/ens-integration.md) |

### Privacy / credentials

#### Selective-disclosure credential

| | |
|---|---|
| **How** | slot bind 'credential' |
| **Arguments** | statementId:bytes32, a/b/c (Groth16 proof), pub:uint256[] |
| **Grade** | A |
| **Use when** | prove membership of a set (allowlist/DAO) WITHOUT revealing which member; a valid proof renders the checkmarked statement, a bad one renders 'Unverified' |
| **See** | [concepts/privacy](../concepts/privacy.md) |

#### Bound single-use credential

| | |
|---|---|
| **How** | slot bind 'credential-bound' + NullifierRegistry |
| **Arguments** | statementId, proof, pub:uint256[4] |
| **Grade** | A |
| **Use when** | a non-transferable, single-use credential (nullifier prevents replay; consuming it is a separate WRITE) |
| **See** | [concepts/privacy](../concepts/privacy.md) |

### Privacy / attestation

#### Attested identity claim (EAS)

| | |
|---|---|
| **How** | slot bind 'identityVerified' / 'identityClaim' |
| **Arguments** | subject:address, schema:bytes32, uid:bytes32 |
| **Grade** | A |
| **Use when** | render 'subject holds attestation X from attester Y' via EAS |
| **See** | [concepts/privacy](../concepts/privacy.md) |

### Visual / on-chain art

#### Generative art

| | |
|---|---|
| **How** | image bind 'genart' |
| **Arguments** | seed |
| **Grade** | A |
| **Use when** | deterministic on-chain generative SVG art from a seed |
| **See** | [concepts/visual-media](../concepts/visual-media.md) |

#### Gradient identicon

| | |
|---|---|
| **How** | image bind 'gidenticon' |
| **Arguments** | account |
| **Grade** | A |
| **Use when** | a unique on-chain identicon/logo for an address |
| **See** | [concepts/visual-media](../concepts/visual-media.md) |

#### Vector art

| | |
|---|---|
| **How** | image bind 'vecart' |
| **Arguments** | seed |
| **Grade** | A |
| **Use when** | high-fidelity on-chain vector art |
| **See** | [concepts/visual-media](../concepts/visual-media.md) |

#### SDF 2D/3D scene

| | |
|---|---|
| **How** | image bind 'sdfscene' (provenance computed or computed-gpu) |
| **Arguments** | seed |
| **Grade** | A (poster) / ⚙ (GPU) |
| **Use when** | signed-distance-field geometry; on-chain poster floor + optional GPU ray-march enhancement |
| **See** | [guides/building-a-scene](../guides/building-a-scene.md) |

#### Point cloud

| | |
|---|---|
| **How** | image bind pointcloud |
| **Grade** | A (poster) / ⚙ (WebGL) |
| **Use when** | point-based scene; on-chain poster + WebGL enhancement |
| **See** | [concepts/advanced-scenes](../concepts/advanced-scenes.md) |

#### On-chain cartography

| | |
|---|---|
| **How** | geoatlas renderer |
| **Grade** | A |
| **Use when** | a fully on-chain world map (Real-Earth atlas, equirectangular) |
| **See** | [concepts/visual-media](../concepts/visual-media.md) |

### Visual / rich media

#### p5.js / three.js interactive

| | |
|---|---|
| **How** | image bind 'p5'/'three' scene binding (libHash + seed + entry) |
| **Grade** | ⚙ |
| **Use when** | a playable/interactive sketch (game, physics toy, dataviz); library + sketch stored on-chain, runs client-side over a poster floor, fails closed. Requires GPU_EXECUTE + a poster floor. |
| **See** | [concepts/rich-media-p5-three](../concepts/rich-media-p5-three.md) |

### Visual / effects

#### Post-processing effects

| | |
|---|---|
| **How** | EffectPresetRegistry (CRT/glass/vignette/scanlines/grain) |
| **Grade** | A (SVG-filter floor) |
| **Use when** | stack visual effects over a scene; each has an on-chain SVG-filter floor |
| **See** | [guides/applying-effects](../guides/applying-effects.md) |

#### Declarative SVG animation

| | |
|---|---|
| **How** | SvgAnim (TIME-driven) |
| **Grade** | A |
| **Use when** | declarative animation (no script loop) |
| **See** | [concepts/visual-media](../concepts/visual-media.md) |

### Visual / media

#### On-chain NFT media + provenance

| | |
|---|---|
| **How** | NftImageResolver / media provenance |
| **Grade** | A |
| **Use when** | render an NFT's on-chain media with verified provenance (off-chain pointers refused) |
| **See** | [guides/nft-collection-frontend](../guides/nft-collection-frontend.md) |

### Charts

#### Chart (line/area/bar/scatter/pie/donut)

| | |
|---|---|
| **How** | image bind chart + ChartSlotAdapter + IChartData source (chart.encodeChartSlotArgs); a Chainlink price history is authored from argValues (see "Chainlink history chart") |
| **Grade** | A |
| **Use when** | a data chart, static or bound to a live on-chain source; fails closed to axes-only |
| **See** | [guides/add-chart](../guides/add-chart.md) |

### Structure / UI

#### Responsive layout

| | |
|---|---|
| **How** | box layout {kind: stack\|grid\|flow, columns, breakpoints} |
| **Grade** | A |
| **Use when** | responsive grids/stacks/flow with container-query breakpoints |
| **See** | [concepts/render-pipeline](../concepts/render-pipeline.md) |

#### Multi-view app

| | |
|---|---|
| **How** | buildTabs / buildWizard / buildMasterDetail / buildModal (compile views → combine) |
| **Grade** | A |
| **Use when** | in-app navigation: tabs, ordered wizard, list→detail, or a modal overlay; reachability enforced (no stranded views) |
| **Example** | buildTabs([quoteHash, venuesHash, routeHash], {shell}) |
| **See** | [guides/multi-view-app](../guides/multi-view-app.md) |

#### Data table

| | |
|---|---|
| **How** | TableRenderer (static/bound/paginated) |
| **Grade** | A |
| **Use when** | a semantic table; rows can be pulled live from an ITableSource; paginated for large sets |
| **See** | [reference/feature-catalog](../reference/feature-catalog.md) |

#### Interactive controls

| | |
|---|---|
| **How** | ControlRenderer (toggle/select/slider/search) |
| **Grade** | A |
| **Use when** | controls that bind to a display PARAMETER (never a consequence); interaction adds no capability |
| **See** | [reference/feature-catalog](../reference/feature-catalog.md) |

#### Source-code component

| | |
|---|---|
| **How** | SourceRenderer + SourceStore |
| **Grade** | A |
| **Use when** | display on-chain source, line-numbered + escaped (adversarial source can't break out) |

### Actions / write

#### Declared action (button)

| | |
|---|---|
| **How** | button action {to, sig, value?, args} |
| **Grade** | A |
| **Use when** | any state-changing call (mint/claim/swap/transfer) — the runtime constructs EXACTLY the declared calldata; the button can't call anything else or smuggle value |
| **Example** | button action={to:0xNFT, sig:'mint(uint256)', value:'0x...', args:'$qty'} |
| **See** | [guides/declare-action](../guides/declare-action.md) |

#### Batched action

| | |
|---|---|
| **How** | batch of declared actions |
| **Grade** | A |
| **Use when** | one signature, N gated calls; each member must be in the bound interface (no smuggling) |
| **See** | [guides/declare-action](../guides/declare-action.md) |

#### Funds held by a rule (escrow)

| | |
|---|---|
| **How** | your own escrow contract in the GoalEscrow shape (per-item parameters, pull payments, outcome from on-chain facts only) |
| **Arguments** | create(...); contribute(id) payable; payOut(id); refund(id) |
| **Grade** | A (custody and release enforced by your contract); anything decided off-chain must name who attests it |
| **Use when** | hold funds until a rule releases them. The settlement framework (SettlementChannel, LoanChannel, AgreementRegistry) is built but NOT deployed — check Deployed Addresses |
| **Example** | GoalEscrow: all-or-nothing fundraising with refunds |
| **See** | [guides/payments-escrow-settlement](../guides/payments-escrow-settlement.md) |

### Actions / sign

#### Typed signing (EIP-712)

| | |
|---|---|
| **How** | declared sign action |
| **Grade** | A |
| **Use when** | gather an EIP-712 signature (permits, votes, orders); chainId-checked. The message is signed exactly as written: no `$name` inputs, literal values that fit their types (review rule sign-message) |
| **See** | [guides/wallet-and-signing](../guides/wallet-and-signing.md) |

### Actions / verify

#### Signature verification (1271/6492)

| | |
|---|---|
| **How** | SignatureVerifier (bind 'verifysig') |
| **Grade** | A |
| **Use when** | verify a signature on-chain, incl. smart-account (ERC-1271) and pre-deploy (6492) |

### Composition

#### Mini-app / composition

| | |
|---|---|
| **How** | CompositionRouter + ref nodes (sockets) |
| **Grade** | A |
| **Use when** | compose multiple components/scenes into one app; capability envelope is the UNION of children (no escalation) |
| **See** | [concepts/composition](../concepts/composition.md) |

#### App DNA / forking

| | |
|---|---|
| **How** | AppRegistry / CompositionRegistry lineage |
| **Grade** | A |
| **Use when** | fork an app manifest or a composition; the parent is recorded on-chain (traceable lineage). A single component has no parent record: the builder's Fork (builder/?fork=<hash>&chain=<id>) reopens it and any change deploys as a new component |
| **See** | [concepts/composition](../concepts/composition.md) |

#### Farcaster mini-app

| | |
|---|---|
| **How** | miniapp adapter (buildManifest/buildEmbed) |
| **Grade** | A |
| **Use when** | package an app as a Farcaster mini-app / Frame |
| **See** | [guides/farcaster-miniapp](../guides/farcaster-miniapp.md) |

### Presentation / theming

#### Design tokens + theming

| | |
|---|---|
| **How** | ThemeTokens (defaultTokens/darkDefaults/highContrastDefaults) → CSS |
| **Grade** | A |
| **Use when** | theme an app; render-time (zero gas, no redeploy); light/dark/high-contrast; contrast invariants enforced |
| **See** | [guides/authoring-themes](../guides/authoring-themes.md) |

### Naming / ENS subnames

#### Register a subname (open floor)

| | |
|---|---|
| **How** | action → SubnameStakeRegistrarV2.register(label, componentHash) payable(stake) |
| **Grade** | A |
| **Use when** | claim myapp.chainrender.eth anonymously — permissionless, gated only by a REFUNDABLE anti-spam stake; label must pass the on-chain charset gate (lowercase a-z0-9-, no confusables) |
| **See** | [guides/registering-a-name](../guides/registering-a-name.md) |

#### Register verified (own the ENS name)

| | |
|---|---|
| **How** | action → registerVerified(label, componentHash, ensNode) |
| **Grade** | A |
| **Use when** | claim label VERIFIED — enforces you own <label>.eth (anti-impersonation: can only claim 'uniswap' if you hold uniswap.eth) |
| **See** | [guides/registering-a-name](../guides/registering-a-name.md) |

### Naming / versioning

#### Versioned name

| | |
|---|---|
| **How** | SubnameVersionRegistry (append-only + timelock + freeze) |
| **Grade** | A |
| **Use when** | safe app updates through a name; version history is immutable, timelocks only grow, freeze seals it |
| **See** | [concepts/versioning](../concepts/versioning.md) |

### Trust

#### Trust grade + enforcer

| | |
|---|---|
| **How** | grade() + validateApp() (automatic) |
| **Grade** | n/a |
| **Use when** | ALWAYS runs on the composed app: A/B/C letter + itemized deviations; the enforcer REFUSES unsafe apps (arbitrary-code escape hatch, dishonest capability envelope, unknown vocabulary). You don't invoke it — it's the safety net over your output. |
| **See** | [concepts/trust-grade](../concepts/trust-grade.md) |

### DeFi / positions & trade

#### Uniswap V4 price

| | |
|---|---|
| **How** | slot bind 'uniV4Price' (StateView lens) |
| **Arguments** | stateView:address, poolId:bytes32, dec0:uint8, dec1:uint8, invert:bool |
| **Grade** | A |
| **Use when** | live V4 pool spot price via StateView.getSlot0; additive to V3, not a replacement |
| **See** | [concepts/rendering-uniswap-hooks](../concepts/rendering-uniswap-hooks.md) |

#### Uniswap V3 LP position

| | |
|---|---|
| **How** | slot bind 'uniV3Position' |
| **Arguments** | positionManager:address, tokenId:uint256, field:uint8 (0=summary 1=liquidity 2/3=feesOwed 5/6=tickLower/Upper) |
| **Grade** | A |
| **Use when** | render an LP NFT's pair/fee/tick-range/liquidity/fees owed |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

#### Aave position / health factor

| | |
|---|---|
| **How** | slot bind 'aavePosition' |
| **Arguments** | pool:address, user:address, field:uint8 (0=summary 1=collateralUsd 2=debtUsd 3=availableUsd 4=healthFactor 5=liqThresholdPct 6=ltvPct) |
| **Grade** | A |
| **Use when** | a lending position with collateral/debt/borrowing-power and the liquidation-risk HEALTH FACTOR (field 4; shows infinity when no debt) |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

#### Uniswap pre-trade quote

| | |
|---|---|
| **How** | slot bind 'uniQuote' (QuoterV2, staticcalled) |
| **Arguments** | quoter:address, tokenIn:address, tokenOut:address, amountIn:uint256, fee:uint24, outDecimals:uint8, field:uint8 (0=formatted 1=raw 2=gasEstimate) |
| **Grade** | A |
| **Use when** | expected swap output BEFORE signing; ESTIMATE only — the swap action must still carry its own min-out |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

#### Approval-state gate

| | |
|---|---|
| **How** | slot bind 'approvalState' (ERC-20 allowance) |
| **Arguments** | token:address, owner:address, spender:address, needed:uint256, field:uint8 (0=word 1=raw allowance 2=bool covered) |
| **Grade** | A |
| **Use when** | Approve-vs-Swap gating — show whether an owner has approved a spender for enough of a token before offering the action |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

#### Curve pool quote

| | |
|---|---|
| **How** | slot bind 'curvePool' (get_dy) |
| **Arguments** | pool:address, i:int128, j:int128, dx:uint256, outDecimals:uint8, field:uint8 (0=get_dy formatted 1=raw 2=balance(i) 3=coin(i)) |
| **Grade** | A |
| **Use when** | Curve stable-pool quote/balances, broadening AMM coverage beyond Uniswap; get_dy is an ESTIMATE |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

#### Portfolio total

| | |
|---|---|
| **How** | slot bind 'portfolio' (sum of reads) |
| **Arguments** | reads:tuple(address target,bytes callData,uint8 mulScale,uint8 divScale)[], outDecimals:uint8, field:uint8 (0=formatted total 1=raw 2=count succeeded) |
| **Grade** | A |
| **Use when** | an aggregated TOTAL summing many numeric on-chain reads (complements multiread which joins); fail-closed per read (partial total) |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

### RWA / compliance

#### Proof-of-Reserve coverage

| | |
|---|---|
| **How** | slot bind 'por-coverage' (siblings 'por-reserves' / 'por-supply') |
| **Arguments** | reserveFeed:address, token:address, fracDigits:uint8, maxStaleSeconds:uint256 |
| **Grade** | A |
| **Use when** | coverage% = attested reserves / token totalSupply, with provenance (feed, round) + freshness and a backed / under-collateralized badge |
| **See** | [concepts/rwa-capabilities](../concepts/rwa-capabilities.md) |

#### ERC-3643 (T-REX) compliance display

| | |
|---|---|
| **How** | slot bind 'erc3643-status' (siblings 'erc3643-verified' / 'erc3643-frozen' / 'erc3643-can-transfer') |
| **Arguments** | token:address, holder:address (can-transfer: token, from, to, amount) |
| **Grade** | ≤ C |
| **Use when** | DISPLAY a holder's ERC-3643 compliance (verified/frozen) or a canTransfer preview — never enforcement; a real transfer re-checks on chain. Identity registry is agent-mutable → ≤ C (DEP_MUTABLE), even though the read is on-chain |
| **See** | [concepts/rwa-capabilities](../concepts/rwa-capabilities.md) |

#### Credential lifecycle

| | |
|---|---|
| **How** | slot bind 'cred-status' (sibling 'cred-valid') |
| **Arguments** | registry:address, credentialId:bytes32, expectedIssuer:address (address(0) disables the issuer-key check) |
| **Grade** | A |
| **Use when** | issuer-bound credential status VALID / EXPIRED / REVOKED / UNKNOWN with issuer-key provenance; cred-valid collapses it to a one-word gate |
| **See** | [concepts/rwa-capabilities](../concepts/rwa-capabilities.md) |

### Reputation / social

#### EFP relationship (Ethereum Follow Protocol)

| | |
|---|---|
| **How** | slot bind 'efp-state' (siblings 'efp-follows' / 'efp-tag' / 'efp-list-size') |
| **Arguments** | listRecords:address, slot:uint256, target:address (efp-tag adds tag:string) |
| **Grade** | A |
| **Use when** | does a caller-named EFP list currently follow / block / mute / tag a target (FORWARD read, bounded scan). Follower counts / reverse lookups are OFF-CHAIN (indexer) → grade ≤ C, never render them as an on-chain fact |
| **See** | [concepts/reputation-capabilities](../concepts/reputation-capabilities.md) |

#### Delegated address vouch

| | |
|---|---|
| **How** | slot bind 'rep-vouch' (sibling 'rep-tally' = transparent k-of-n) |
| **Arguments** | registry:address, attester:address, subject:address, topic:bytes32 (rep-tally: registry, attesters[], subject, topic) |
| **Grade** | ≤ C |
| **Use when** | one attester's vouch (vouched/expired/revoked/unknown) or a k-of-n over a CALLER-supplied attester set. Delegated to a mutable attester → ≤ C. Never a global score; change the set, change the answer |
| **See** | [concepts/reputation-capabilities](../concepts/reputation-capabilities.md) |

#### Cross-source reputation aggregate

| | |
|---|---|
| **How** | slot bind 'rep-aggregate' (IReputationSource adapters) |
| **Arguments** | subject:address, sources:address[], ctxs:bytes[] (per-source abi-encoded context) |
| **Grade** | = weakest source |
| **Use when** | transparent k-of-n across caller-supplied sources (EFP, vouches, EAS, ERC-725, future), rendered 'k/n (grade X)' where X is capped at the weakest source. An A EFP follow can't launder a C vouch into trustlessness |
| **See** | [concepts/reputation-capabilities](../concepts/reputation-capabilities.md) |

#### ERC-725Y / ERC-735 account claim (same-chain)

| | |
|---|---|
| **How** | slot bind 'staticread' (CallResolver) at the account's ERC-725Y data key — STATICCALL against a co-located contract on the resolver's chain (typed Erc725ClaimResolver planned) |
| **Arguments** | target:address (the ERC-725Y/735 account, on the resolver's chain), callData (getData(key)), returnType, format |
| **Grade** | ≤ C |
| **Use when** | read an ERC-725Y data key or ERC-735 claim from an account co-located on the resolver's chain (Sepolia/Robinhood/Arc) — the standard behind LUKSO Universal Profiles, but LUKSO's chain is NOT integrated (a STATICCALL can't reach a UP that lives only on LUKSO). Owned/mutable source → ≤ C, rendered as 'the current claim of authority Y', never as proof |
| **See** | [concepts/reputation-capabilities](../concepts/reputation-capabilities.md) |

### DeFi / intent & programmatic orders

#### CoW conditional order (live)

| | |
|---|---|
| **How** | slot bind 'cowOrder' (ComposableCoW.getTradeableOrderWithSignature, staticcalled) |
| **Arguments** | composableCow:address, owner:address, handler:address, salt:bytes32, staticInput:bytes, offchainInput:bytes, proof:bytes32[], sellDec:uint8, buyDec:uint8, field:uint8 (0=status 1=sellAmount 2=buyAmount 3=validTo 4=partiallyFillable) |
| **Grade** | A |
| **Use when** | render the DISCRETE order a CoW Composable-CoW conditional order (TWAP/StopLoss/GoodAfterTime/…) would emit THIS block, with no server; a revert = no valid order now -> 'not active' (fail-closed). The first intent-DeFi resolver: a trustless, serverless order monitor |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

#### CoW TWAP schedule

| | |
|---|---|
| **How** | slot bind 'cowTwap' (pure decode of TWAP.Data + block.timestamp; no external call) |
| **Arguments** | staticInput:bytes (the TWAP.Data blob), sellDec:uint8, buyDec:uint8, field:uint8 (0=summary 1=partSellAmount 2=minPartLimit 3=currentPart 4=totalParts 5=secondsToNext 6=status 7=interval) |
| **Grade** | A |
| **Use when** | render a TWAP order's schedule progress — 'part 3/10 - live', next-slice countdown, per-part sell/min-limit, status pending/active/gap/finished. Renders the DEFINITION's schedule (not proof of registration) — pair with 'cowOrder' for live tradeability |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

#### CoW app-data integrity (what am I signing)

| | |
|---|---|
| **How** | slot bind 'cowIntent' (on-chain keccak256 of the app-data document) |
| **Arguments** | fullAppData:bytes (the stringified app-data doc shown to the user), expectedAppData:bytes32 (order appData, e.g. from cowOrder), field:uint8 (0=verdict verified/app-data mismatch 1=computed hash hex) |
| **Grade** | A |
| **Use when** | anti-phishing 'verify what you sign': prove a presented CoW app-data document (carrying the order metadata + pre/post hooks) is byte-identical to the hash the order committed (keccak256(fullAppData)). Tamper one byte -> app-data mismatch. The human-readable hook plan is a CLIENT decode over these hash-verified bytes (pair with cowOrder) |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

### RWA / tokenized vaults

#### ERC-4626 vault (NAV / totals)

| | |
|---|---|
| **How** | slot bind 'vault4626' (ERC-4626 view reads, staticcalled) |
| **Arguments** | vault:address, assetDec:uint8, shareDec:uint8, field:uint8 (0=NAV per share in asset units 1=totalAssets 2=totalSupply shares 3=shares per 1 asset) |
| **Grade** | A |
| **Use when** | render a tokenized vault's NAV per share, total assets, share supply — the tokenized-treasury surface; convertToAssets is the vault's OWN accounting (state the trust boundary). Composes with por-coverage + oracle-feed for a full vault panel |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

#### ERC-7540 async vault (redemption queue)

| | |
|---|---|
| **How** | slot bind 'vault7540' (ERC-7540 request-state view reads, staticcalled) |
| **Arguments** | vault:address, controller:address, requestId:uint256 (0 for single-slot), assetDec:uint8, shareDec:uint8, field:uint8 (0=pending redeem shares 1=claimable redeem shares 2=pending deposit assets 3=claimable deposit assets) |
| **Grade** | A |
| **Use when** | render the async request/settle queue (pending/claimable redeem & deposit) for a controller — the redemption queue RWA/T-bill funds hide behind a dashboard, read trustlessly |
| **See** | [concepts/defi-capabilities](../concepts/defi-capabilities.md) |

### Multiplayer / games

#### Two-player game: on-chain lobby + settlement

| | |
|---|---|
| **How** | GameLobbyV2 (waiting room, escrowed stakes) + GameChannelV2 (settles signed peer-to-peer moves through your IGameRulesV2; force-move; equivocation proofs) |
| **Arguments** | createOffer(rules, stake, guard, responseWindow, signer) payable(stake); join(offerId) payable(stake); joinWithSigner(offerId, signer) |
| **Grade** | A for the lobby floor and the settlement; the game screen (signing moves, transport) is a client page, labelled as such |
| **Use when** | a turn-based two-player game with an on-chain waiting room and an enforced result (tic-tac-toe, commit-reveal games). NOT for real-time games (racing, physics): the rules cannot check them — no stakes on those. Exactly two players. |
| **Example** | floor: staticread slots on GameLobbyV2.offerCount()/offerStake(id) + a button action {to: GameLobbyV2, sig: 'join(uint256)', value: '<stake wei>', args: '$offerId'}; rules: TicTacToeRules or RockPaperScissorsRulesV2 |
| **See** | [guides/multiplayer-and-lobbies](../guides/multiplayer-and-lobbies.md) |

### Backend / app contract

#### Your own app contract (backend in Solidity)

| | |
|---|---|
| **How** | an ownerless contract with single-value views (read by 'staticread' via CallResolver) and functions called by declared actions |
| **Arguments** | views: one value per function (e.g. raisedOf(uint256)); actions: {to, sig, value?, args} |
| **Grade** | A when the contract is ownerless and every displayed value is read on-chain |
| **Use when** | the app has its own rules or state (fundraise, vote, registry, escrow, game rules) that existing resolvers cannot read |
| **Example** | contracts/examples/GoalEscrow.sol: slot staticread raisedOf(0) formatted FIXED 18; button contribute(uint256) value '10000000000000000' |
| **See** | [guides/app-contract](../guides/app-contract.md) |
