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
eip155frames - 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 →