WalletPair

Connect dApps to wallets.
No registration. No middleman. Just crypto.

Why WalletPair

Zero Registration

No API keys, project IDs, or accounts. Deploy a relay and start pairing.

End-to-End Encrypted

ChaCha20-Poly1305 AEAD. The relay routes only opaque bytes it cannot read.

One Simple Transport

A single WebSocket relay. Any stateless relay works — switch by re-pairing.

Multi-Network

Encrypted frames carry authenticated CAIP-2 routing metadata; the current application protocol is EVM.

Formally Verified

The encryption model is checked in ProVerif against an active relay attacker.

Self-Hostable

One Rust binary. No vendor lock-in. Your infrastructure, your rules.

How It Works

The dApp creates a channel, displays a QR code. The wallet scans it. After a cryptographic pairing-code comparison, they communicate over an end-to-end encrypted session. The relay never sees your data.

protocol flow
 dApp                          Relay                         Wallet
  │                              │                              │
  │── connect /v1 (metadata) ──>│                              │
  │<─ channel_joined (self) ────│                              │
  │                              │                              │
  │   ┌─────────────────────────────────────────────────────┐   │
  │   │ dApp displays QR + code · wallet scans and compares │   │
  │   └─────────────────────────────────────────────────────┘   │
  │                              │                              │
  │                              │ <── connect /v1 (metadata) ──│
  │<─ channel_joined (wallet) ── │ ──> channel_joined (wallet) ─│
  │                              │                              │
  │   ┌─────────────────────────────────────────────────────┐   │
  │   │  Derive directional traffic keys and pin peer key    │   │
  │   └─────────────────────────────────────────────────────┘   │
  │                              │                              │
  │── sealed@eip155:1 ─────────>│ ─── sealed@eip155:1 ─────────>│
  │                              │ <─── sealed@eip155:1 ─────────│
  │<─ sealed@eip155:1 ──────────│                              │

Start Integrating

For dApp Developers

  • Create a pairing URI and display it as a QR code
  • Send EIP-1193 request envelopes over encrypted eip155 frames
  • Adapt the resulting provider to your application stack
1. Generate a fresh X25519 key pair and a 32-byte channel ID.
2. Connect to /v1 with ch, name, url, icon, and pubkey query fields.
3. Display walletpair:?ch=…&pubkey=…&relay=…&name=…&url=…&icon=… as QR.
4. Show SHA-256-derived 4-digit pairing code.
5. After the first eligible channel_joined event, derive directional traffic keys.
6. Send an EIP-1193 request as MessagePack in:
   base64url(seq || ciphertext || tag)@eip155:1
Read the dApp guide →

For Wallet Developers

  • Scan a pairing QR code and join the session
  • Handle incoming EIP-1193 requests — approve or reject
  • Push events like accountsChanged and chainChanged
1. Parse every required pairing URI field exactly once.
2. Recompute and compare the four-digit dApp pairing code.
3. Generate a fresh X25519 key pair and connect to the specified relay.
4. Derive the wallet-to-dApp and dApp-to-wallet traffic keys.
5. Validate and approve EIP-1193 requests before responding.
6. Preserve sequence counters; pair again if they cannot be recovered safely.
Read the wallet guide →