# Tour: Doorstep

A **public on-chain tribute**. A knock burns a token to a door; the aggregate — total burned,
knock count, loudest knock — is read from a `DoorRegistry` view (**Grade A**). The message
history lives only in event logs and is deliberately *not* rendered as Grade A — ChainRender
renders the public tribute, never an inbox. This tour reuses the spine from
**[Settlement Desk](./settlement-desk.md)**.

---

## 1. Import

```json
{
  "type": "box",
  "direction": "column",
  "children": [
    { "type": "text", "content": "Doorstep", "role": "heading" },
    { "type": "text", "content": "A public on-chain tribute. The identicon is the pure on-chain floor; the aggregate is a Grade-A view read." },
    {
      "type": "box",
      "direction": "row",
      "children": [
        { "type": "image", "bind": "gidenticon", "provenance": "computed", "argValues": {} },
        { "type": "slot", "bind": "door-knocks", "argValues": { "registry": "0x2222222222222222222222222222222222222222", "target": "0x0000000000000000000000003333333333333333333333333333333333333333", "assetDecimals": "18", "fracDigits": "4" } }
      ]
    },
    { "type": "text", "content": "Trust, declared on-chain", "role": "heading" },
    { "type": "slot", "bind": "trust-facets", "argValues": { "subject": "0x2222222222222222222222222222222222222222" } }
  ]
}
```

---

## 2. The identicon is the floor — it needs nothing deployed

The `image` node bound to `gidenticon` is the **pure on-chain-deterministic floor**: a symmetric
identicon computed from an address with keccak, in the browser. Same address → same SVG, forever,
no contract and no network. It renders on import, before you touch a chain. See
**[The Floor](../concepts/the-floor.md)** and **[On-Chain Icons](../concepts/icons.md)**.

## 3. `door-knocks` is Grade A — the message feed is not

`door-knocks` reads the `DoorRegistry` aggregate via a view: **Grade A.**

- `registry` — your deployed `DoorRegistry`.
- `target` — the door key: `bytes32(uint160(address))` for an address door, or an ENS namehash.
  (The example pads an address into 32 bytes.)

The **messages** are a separate, honest capability: `door-feed` reads the `Knock` **event logs**
via `eth_getLogs`. That's on-chain *data* but not a re-executable view, so it grades **≤ C** and
is labeled off-chain — never dressed as Grade A. If you want the message list, add a `door-feed`
slot with `{ registry, target }`; its badge will correctly read ≤ C. Keeping the aggregate
(Grade A) and the feed (≤ C) as two binds is the point: the grade on each is honest.

## 4. Preview, deploy, grade

As before: placeholders → `door-knocks` shows **"unavailable"** (the identicon still renders);
set Interpreter + RPC; deploy `DoorResolver` + `TrustDisclosureResolver` (ownerless, once per
chain) and a `DoorRegistry` that's had at least one `knock`, so there's an aggregate to read.
Replace `0x2222…` and the `target`, preview, and the tribute renders live, **Grade A**.

That's the full set. You've imported, fixed the compile gotcha, previewed fail-closed, synced the
vocabulary, and taken an app to live on-chain data — the complete ChainRender build loop.

← **[Back to Guided Tours](./index.md)**
