Product guide

From issued pass to a verified door.

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

Use a pass

  1. 1

    Open the holder wallet

    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.

  2. 2

    Review the live pass state

    Check the issuer, program, start, expiry, and status. Active means the pass has started, has not expired, and has not been revoked.

  3. 3

    Scan the issuer challenge

    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.

  4. 4

    Sign, then show your response

    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.

Open My Passes

Issuer quick start

Create and verify passes

  1. 1

    Register the issuer wallet

    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.

  2. 2

    Create a time-based program

    Give the program a concise name and duration. Programs begin active; pausing one blocks new issuance without invalidating existing passes.

  3. 3

    Issue to the correct wallet

    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.

  4. 4

    Run Scanner Mode

    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.

Open Issuer Dashboard

Check-in protocol

Four steps. Zero member transactions.

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.

01

Challenge

Issuer creates a cryptographically random QR that expires in 60 seconds.

02

Signature

Member signs EIP-712 CheckInProof with the pass-holder wallet.

03

Response

Member displays a QR bound to the challenge, holder, pass, chain, and registry.

04

Fresh read

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

Use the address for the network you are on.

NetworkChain IDRegistryPublic RPCExplorer

Monad mainnet

Live product

1430x634659d15A5a98D59ff06e9Eb7deC08bD5894fF5

Deployed, live, and source-code verified as an exact match (Solidity 0.8.28, optimizer 200).

https://rpc.monad.xyzMonadscan

Monad testnet

Release rehearsal

101430x56e47d0233b9eAa2f6701Bb90DFD6352000D5e26

Testnet registry for the dry-run release path.

https://testnet-rpc.monad.xyzMonadscan

Troubleshooting

Failures should tell you what to do next.

Login did not finish

Wait for Privy to initialize, then retry Email or Wallet. Request a new OTP if the prior code expired.

SMS is unavailable

Phone login depends on the enabled Privy plan, provider, and country. Use Email or Wallet when SMS is not offered.

Wrong active wallet

Open the wallet menu and select the exact address used for the issuer or pass. Account changes reset temporary scanner state.

No passes appear

Confirm the connected wallet, expected network, and registry. An RPC failure must not be mistaken for an empty wallet.

Wrong network

Use Monad mainnet for the live deployment or Monad testnet for rehearsal. Do not mix a chain, RPC, registry, and explorer from different environments.

Pass not active yet

The pass has a future validFrom time. Contract time, not the phone clock, decides when it becomes active.

Pass expired

The issuer may extend a non-revoked pass. An expired extension renews from current chain time.

Pass revoked

Revocation is permanent. The issuer must create a new pass.

Challenge expired

Ask the issuer for a new challenge. Every challenge lasts exactly 60 seconds.

Challenge already used

That response succeeded earlier in this scanner session. Create and sign a fresh challenge.

Camera permission denied

Allow camera access for the site and retry. Camera scanning normally requires HTTPS outside localhost.

Contract read failed

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

A copied static pass is not enough.

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 control is not human identity.

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.