Knock docs

Reading the index…

Troubleshooting

What to do when the Door won't open, the Wedgie won't answer, or your verifier turns a knock away. By symptom, and by refusal.

Markdown

Find what you see, below. For the full list of refusals, see Checks and refusals.

The Door

The Door doesn't open

knock() rejected with blocked: the browser stopped the popup.

  • Call knock() in the click handler itself, before any await. Pass the challenge as a promise. Add a Knock button shows how.
  • If it still happens, the person has blocked popups for your site. Ask them to allow them.

The Door says to connect the Wedgie

The browser hasn't been given the Wedgie for the Door's origin yet. Press the Door's button, and choose the Wedgie from the browser's list of serial devices. The browser remembers it after that.

If the list is empty, check the cable: some USB cables carry power only.

"Another tab has the Wedgie"

Only one tab can talk to a Wedgie at a time. The Knock Console or another Door has it. Disconnect it there, or close that tab, then knock again. Your page hears nothing until the Door is closed (closed) or the knock times out (timeout).

Knocking doesn't work in Firefox, Safari or on a phone

The Door reaches the Wedgie over Web Serial, which only desktop Chromium browsers have: Chrome, Edge, Brave, Arc and others. Check for it with 'serial' in navigator and show another way in where it's missing.

The Door says it can't be used in a frame

The Door never works inside another page. Let door-sdk open it as a popup.

bad_origin

Your page is on http:// at a host other than localhost or 127.0.0.1. Serve it over https.

The Wedgie

not_enrolled

The Wedgie has no name, or isn't bound to a human. Its owner sets it up in the Knock Console: the binding, then the name.

no_key

The Wedgie has no Knock key yet. Its owner makes one in the Knock Console.

timeout

Nobody pressed on the Wedgie within 2 minutes, or the whole knock took longer than timeoutMs. Knock again.

rejected

Red on the Wedgie: its owner said no. Show nothing, and let them knock again.

not_ready

The Door couldn't talk to the Wedgie: it was unplugged, or went away during the knock. Plug it in, and knock again.

Your verifier

The verifier won't start

It stops with a reason when something it depends on isn't right:

It saysDo this
VERIFIER_ORIGIN: https://host[:port], or http://localhost[:port]Set the origin as the browser shows it, with no path and no trailing /.
VERIFIER_ETH_RPC is chain <id>, not mainnetPoint it at an Ethereum mainnet RPC.
VERIFIER_WORLD_RPC is chain <id>, not World ChainPoint it at a World Chain mainnet RPC, chain 480.
the accepted KnockBinding says it's v<n>, not v3Your World Chain RPC is wrong, or out of date.
VERIFIER_STRICT: strict: off, on (safe) or finalized, not <x>Use off, on or finalized.

The browser says CORS blocked the request

The verifier only answers pages at VERIFIER_ORIGIN, exactly. http://localhost:5173 and http://127.0.0.1:5173 are different origins, and so are different ports. Set VERIFIER_ORIGIN to what's in the address bar, or ask the verifier from your server instead.

challenge

door-sdk couldn't get a challenge: your verifier didn't answer, refused, or answered with something else. Check that it's running, that the page can reach it, and that it isn't busy.

Refusals, by check

Check 2: that challenge expired: knock again

More than 2 minutes passed between your verifier making the challenge and checking the knock. This happens when someone waits on the KNOCK screen, or connects the Wedgie for the first time. Knock again.

Check 2: wrong_origin

The page that knocked isn't at VERIFIER_ORIGIN. Compare it with the address bar, port and all. Each origin needs its own verifier.

Check 3: records_changing

The name was set up or changed less than a minute ago. The verifier waits until its records have held for 3 mainnet blocks, about 36 seconds. Knock again in a minute.

Check 3: no_name

The name has no Knock records: it was never named, its owner killed it, or it expired. Its owner sets it up again in the Knock Console.

Check 3: revoked

Its owner revoked it. If this verifier ever saw the key revoked, it refuses that key for good, even after the name is switched back on. That's on purpose: a revoke is meant to stick.

Check 4: bad_signature

The knock wasn't signed by the name's key for your site and challenge. Knocks from a Wedgie through the Door don't do this, so it's someone sending made-up knocks, or a knock changed on the way.

Check 5: replayed

A knock this verifier has seen, or an older one, was sent again. Knock again: a new knock has a higher counter.

Check 6: binding_not_final

Your verifier is strict, and the Wedgie was bound minutes ago. Wait a few minutes, or 20 to 25 for finalized, then knock again. Or turn strict mode off: Strict mode explains the trade.

Check 6: no_binding, wrong_human

The binding in knock.poh isn't a v3, production binding of this key, for this human and this name. This happens when the binding was made with World ID's Simulator, on an older KnockBinding, or for another name. Its owner binds the Wedgie again in the Knock Console, then names it.

Check 6: binding_expired

The binding's World ID proof is older than VERIFIER_MAX_BINDING_DAYS. Its owner binds the Wedgie again.

Check 8: already_entered

This human has done this action on your site. That's the action working. To let them do something again, use a new action name.

unavailable

The verifier couldn't read mainnet (check 3) or World Chain (check 6). Public RPCs limit how often you can call them, so use your own. Knock again.

busy

The verifier's limits: 600 challenges and 600 checks an hour per process, and 10,000 challenges outstanding at once. They're fixed for now, so wait and knock again. Don't spread one origin over several verifiers with their own databases: a challenge from one fails at another, and each would count entries on its own.