Post-Quantum Secure Browser Wallet
First browser extension with NIST FIPS 204 ML-DSA quantum-resistant signatures
The first browser extension to bring quantum-resistant cryptography to Web3
Built on NIST FIPS 204 ML-DSA algorithms. Your signatures remain secure even against quantum computers.
Simple JavaScript API similar to MetaMask. Integrate PQC signatures into your dApp in minutes.
Works with Ethereum, BSC, Polygon, and any EVM-compatible blockchain.
Try the extension functionality right here in your browser
⚠️ Important Setup Steps
Note: "Connect Wallet" may not work in the Chrome Web Store version due to a missing popup file. Use "Get Accounts" instead after selecting your account in the extension popup.
Make sure you have the PQC Wallet Extension installed and activated.
Integrate PQC Wallet into your dApp with simple JavaScript API
if (typeof window.pqcWallet !== 'undefined') {
// PQC Wallet is installed
console.log('PQC Wallet found!');
} else {
// Prompt user to install
alert('Please install PQC Wallet Extension');
}
async function connectWallet() {
try {
const accounts = await window.pqcWallet.request({
method: 'eth_requestAccounts'
});
console.log('Connected:', accounts[0]);
return accounts[0];
} catch (error) {
console.error('Connection failed', error);
}
}
async function signMessage(message) {
const accounts = await window.pqcWallet.request({
method: 'eth_accounts'
});
const result = await window.pqcWallet.request({
method: 'pqc_signMessage',
params: [accounts[0], message] // account first, message second
});
console.log('Signature:', result.signature);
return result;
}
async function verifyPQCSignature(message, signature, publicKey) {
const isValid = await window.pqcWallet.verifySignature(message, signature, publicKey);
console.log('Signature valid:', isValid);
return isValid;
}
Request access to user's wallet accounts (opens popup)
Usage: await window.pqcWallet.eth_requestAccounts()
Returns: Promise<string[]> - Array of account addresses
Get currently connected accounts without prompting
Usage: await window.pqcWallet.eth_accounts()
Returns: Promise<string[]> - Array of connected addresses
Sign a message with ML-DSA quantum-resistant signature
Usage: await window.pqcWallet.pqc_signMessage(message, account)
Parameters: message: string, account: string
Returns: Promise<{signature: string, publicKey: string}>
Note: Use request() method with params: [account, message] order
Verify a PQC signature
Usage: await window.pqcWallet.verifySignature(message, signature, publicKey)
Parameters: message: string, signature: string, publicKey: string
Returns: Promise<boolean> - true if valid, false otherwise
Send a transaction with signature
Usage: await window.pqcWallet.eth_sendTransaction({from, to, value, data})
Returns: Promise<string> - Transaction hash
Get the ML-DSA public key for an account
Usage: await window.pqcWallet.pqc_getPublicKey(account)
Returns: Promise<{publicKey, algorithm, keySize}>
Standard Ethereum personal message signing
Usage: await window.pqcWallet.personal_sign(message, account)
Returns: Promise<string> - Signature hex string
// Complete integration example for PQC Wallet
class PQCDApp {
constructor() {
this.account = null;
this.init();
}
async init() {
if (typeof window.pqcWallet === 'undefined') {
console.error('PQC Wallet not installed');
return;
}
// Listen for account changes
window.pqcWallet.on('accountsChanged', this.handleAccountsChanged.bind(this));
}
async connect() {
const accounts = await window.pqcWallet.request({
method: 'eth_requestAccounts'
});
this.account = accounts[0];
console.log('Connected:', this.account);
return this.account;
}
async signWithPQC(message) {
if (!this.account) await this.connect();
const result = await window.pqcWallet.request({
method: 'pqc_signMessage',
params: [this.account, message] // account first, message second
});
console.log('PQC Signature:', result.signature);
return result;
}
async verifySignature(message, signature, publicKey) {
const isValid = await window.pqcWallet.verifySignature(message, signature, publicKey);
console.log('Signature valid:', isValid);
return isValid;
}
async getPublicKey() {
if (!this.account) await this.connect();
const keyInfo = await window.pqcWallet.request({
method: 'pqc_getPublicKey',
params: [this.account]
});
return keyInfo;
}
handleAccountsChanged(accounts) {
this.account = accounts[0] || null;
console.log('Account changed:', this.account);
}
}
// Usage
const dapp = new PQCDApp();
await dapp.connect();
const signature = await dapp.signWithPQC('Hello PQC World!');
const isValid = await dapp.verifySignature('Hello PQC World!', signature.signature, signature.publicKey);
// Listen for account changes
window.pqcWallet.on('accountsChanged', (accounts) => {
console.log('Account changed:', accounts[0]);
});
// Listen for network changes
window.pqcWallet.on('chainChanged', (chainId) => {
console.log('Network changed:', chainId);
window.location.reload();
});
// Connection events
window.pqcWallet.on('connect', (info) => console.log('Connected', info));
window.pqcWallet.on('disconnect', (error) => console.log('Disconnected', error));
Install PQC Wallet Extension and start securing your Web3 applications today
Install Extension