SECP256R1 ON ARBITRUM STYLUS

Passkey Verifier

Create a real passkey, sign a challenge issued by the deployed Stylus wallet, and inspect every value the contract checks. Nothing here is simulated and nothing is stored.

The deployed wallet

Contract
0x490630168df621c98e6bba22549295a2202de358
Nonce
reading…
Registered key — x
reading…
Registered key — y
reading…

A key is already registered, and register() reverts with "already registered" once one is — so this wallet is permanently bound to the device that claimed it. Anyone else can still do everything below; only the final on-chain execute() needs that device.

Origin binding

This page
Compiled into the contract
http://localhost:3000

This origin does not match. The contract compares the origin field of clientDataJSON against a compile-time constant, so execute() would reject an assertion signed here — by design, and the contract is deployed and must not be redeployed. Everything below still runs for real; the signature is verified in the browser against the same curve instead.

1 · Create a passkey

2 · Sign the contract's challenge

getChallenge(target, value, data) — read from chain
reading…

The challenge is not a transaction hash. The contract derives it from the call, the current nonce and its own address, so an assertion cannot be replayed against another transaction or another deployment.

Create a passkey first.