Challenge
Issuer creates a cryptographically random QR that expires in 60 seconds.
Product guide
Start with the path that matches what you are doing. Members sign a fresh proof; issuers create and verify it. Permanent membership state lives on Monad, while the check-in itself costs the member no gas.
Member quick start
Connect the external wallet used for issuance, or log in with Email (and SMS where available) to restore your Privy embedded wallet. Confirm the active address and selected network.
Check the issuer, program, start, expiry, and status. Active means the pass has started, has not expired, and has not been revoked.
At the door, open Check-in and scan the QR shown by the issuer. The challenge is tied to their wallet, program, chain, and registry for 60 seconds.
Choose the matching pass and sign the CheckInProof message. This is not a transaction and costs no member gas. Show the resulting QR to the issuer.
Issuer quick start
Open the Issuer Dashboard, connect an external wallet or use a Privy embedded wallet, confirm the active address, and register a short, non-sensitive display name.
Give the program a concise name and duration. Programs begin active; pausing one blocks new issuance without invalidating existing passes.
Paste and verify the member's wallet address, add an optional public member label and issuer note, then issue immediately or schedule a future start. Onchain issuance is permanent and public.
Select the program, create a challenge, let the member scan and sign, then scan their response. Only a fresh signature plus fresh contract state can return VALID.
Check-in protocol
A response only works for its exact issuer challenge. The EIP-712 domain binds it to the selected Monad chain and registry, while the scanner's final decision comes from a new contract read.
Issuer creates a cryptographically random QR that expires in 60 seconds.
Member signs EIP-712 CheckInProof with the pass-holder wallet.
Member displays a QR bound to the challenge, holder, pass, chain, and registry.
Issuer verifies the signer and re-reads pass state from Monad before VALID.
The member's signature is not an onchain check-in record. Unisky Pass intentionally stores no visit history. A successfully scanned nonce is remembered only in that scanner's browser session.
Network reference
| Network | Chain ID | Registry | Public RPC | Explorer |
|---|---|---|---|---|
Monad mainnet Live product | 143 | 0x634659d15A5a98D59ff06e9Eb7deC08bD5894fF5Deployed, live, and source-code verified as an exact match (Solidity 0.8.28, optimizer 200). | https://rpc.monad.xyz | Monadscan |
Monad testnet Release rehearsal | 10143 | 0x56e47d0233b9eAa2f6701Bb90DFD6352000D5e26Testnet registry for the dry-run release path. | https://testnet-rpc.monad.xyz | Monadscan |
Troubleshooting
Wait for Privy to initialize, then retry Email or Wallet. Request a new OTP if the prior code expired.
Phone login depends on the enabled Privy plan, provider, and country. Use Email or Wallet when SMS is not offered.
Open the wallet menu and select the exact address used for the issuer or pass. Account changes reset temporary scanner state.
Confirm the connected wallet, expected network, and registry. An RPC failure must not be mistaken for an empty wallet.
Use Monad mainnet for the live deployment or Monad testnet for rehearsal. Do not mix a chain, RPC, registry, and explorer from different environments.
The pass has a future validFrom time. Contract time, not the phone clock, decides when it becomes active.
The issuer may extend a non-revoked pass. An expired extension renews from current chain time.
Revocation is permanent. The issuer must create a new pass.
Ask the issuer for a new challenge. Every challenge lasts exactly 60 seconds.
That response succeeded earlier in this scanner session. Create and sign a fresh challenge.
Allow camera access for the site and retry. Camera scanning normally requires HTTPS outside localhost.
The scanner cannot safely decide. Retry when the configured Monad RPC is available; it must never fall back to cached VALID state.
What is protected
The proof is bound to a random nonce, issuer, program, holder, expiry, chain, and registry. The scanner recovers the signer and checks fresh onchain state before VALID.
What is not protected
Wallet sharing is not prevented, replay memory is session-only, and issuer registration is permissionless. Privy login proves access to a login channel and wallet, not legal identity. The MVP is not a formal security audit or a cross-device access-control backend.
Privacy in one paragraph
Unisky Pass has no first-party account database. Privy processes optional Email or available SMS login and embedded-wallet sessions, but Unisky Pass does not persist those identifiers or write them onchain. Wallet relationships, issuer/program names, pass timing, and revocation are public on Monad and cannot be deleted. Camera frames stay local; Privy, Vercel, wallet software, and the configured RPC remain independent infrastructure providers.