@qrlwallet/connect gives your dApp an EIP-1193 provider with QR and deep-link pairing. Every message travels over an end-to-end post-quantum encrypted channel: the relay only ever sees ciphertext.
npm install @qrlwallet/connect
import { QRLConnect } from '@qrlwallet/connect';
const qrl = new QRLConnect({
dappMetadata: {
name: 'My QRL dApp',
url: 'https://mydapp.com',
},
});
// Show the pairing URI: as a QR code on desktop,
// as a deep link on mobile
const uri = await qrl.getConnectionURI();
if (qrl.isMobile()) {
window.location.href = uri;
} else {
renderQrCode(uri);
}
qrl.on('connect', ({ chainId }) => {
console.log('Wallet connected on chain', chainId);
});
// Use it like any EIP-1193 provider
const accounts = await qrl.request({ method: 'qrl_requestAccounts' });
const txHash = await qrl.request({
method: 'qrl_sendTransaction',
params: [{
from: accounts[0],
to: 'Q...',
value: '0x2386F26FC10000', // 0.01 QRL
}],
});
The SDK generates a qrlconnect:// URI. Render it as a QR code on desktop, or open it as a deep link on mobile.
MyQRLWallet (web, desktop, or mobile) picks up the URI and asks the user to approve the connection.
An ML-KEM-768 (FIPS 203) key encapsulation keys an AES-256-GCM channel through the relay. The relay routes ciphertext only.
Your dApp sends JSON-RPC requests; the wallet prompts the user for every transaction and signature, then returns the signed result.
ML-KEM-768 key exchange with AES-256-GCM transport. The relay server never sees keys or plaintext.
An EIP-1193 provider with EIP-6963 wallet discovery, so MyQRLWallet shows up in multi-wallet pickers automatically.
qrl_signMessage and qrl_signTypedData use SHAKE256 + ML-DSA-87, with local verify helpers exported by the package.
Sessions survive page reloads for 7 days and reconnect automatically: no re-scanning on every visit.
QR codes on desktop, deep links on mobile, and message buffering while the wallet app is backgrounded.
The default relay runs at qrlwallet.com, and the relay server is open source: point relayUrl at your own.