PQC Wallet Extension

Post-Quantum Secure Browser Wallet

First browser extension with NIST FIPS 204 ML-DSA quantum-resistant signatures

Why PQC Wallet Extension?

The first browser extension to bring quantum-resistant cryptography to Web3

🛡️

Quantum-Resistant

Built on NIST FIPS 204 ML-DSA algorithms. Your signatures remain secure even against quantum computers.

Easy Integration

Simple JavaScript API similar to MetaMask. Integrate PQC signatures into your dApp in minutes.

🌍

Multi-Chain Support

Works with Ethereum, BSC, Polygon, and any EVM-compatible blockchain.

Test PQC Wallet Live

Try the extension functionality right here in your browser

⚠️ Important Setup Steps

  1. Click the PQC Wallet extension icon in your Chrome toolbar
  2. Unlock your wallet if it's locked
  3. Select an account from the popup (if you have multiple)
  4. Come back here and click "Get Accounts" to verify connection

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.

Developer Documentation

Integrate PQC Wallet into your dApp with simple JavaScript API

🚀 Quick Start

1. Check if PQC Wallet is installed

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');
}

2. Request Account Connection

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);
  }
}

3. Sign a Message with PQC

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;
}

4. Verify a PQC Signature

async function verifyPQCSignature(message, signature, publicKey) {
  const isValid = await window.pqcWallet.verifySignature(message, signature, publicKey);
  console.log('Signature valid:', isValid);
  return isValid;
}

📚 API Reference

GET

eth_requestAccounts()

Request access to user's wallet accounts (opens popup)

Usage: await window.pqcWallet.eth_requestAccounts()

Returns: Promise<string[]> - Array of account addresses

GET

eth_accounts()

Get currently connected accounts without prompting

Usage: await window.pqcWallet.eth_accounts()

Returns: Promise<string[]> - Array of connected addresses

POST

pqc_signMessage(message, account)

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

POST

verifySignature(message, signature, publicKey)

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

POST

eth_sendTransaction(txParams)

Send a transaction with signature

Usage: await window.pqcWallet.eth_sendTransaction({from, to, value, data})

Returns: Promise<string> - Transaction hash

GET

pqc_getPublicKey(account)

Get the ML-DSA public key for an account

Usage: await window.pqcWallet.pqc_getPublicKey(account)

Returns: Promise<{publicKey, algorithm, keySize}>

POST

personal_sign(message, account)

Standard Ethereum personal message signing

Usage: await window.pqcWallet.personal_sign(message, account)

Returns: Promise<string> - Signature hex string

🔥 Complete dApp Integration Example

// 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);

📡 Events

// 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));

Ready to Build Quantum-Safe dApps?

Install PQC Wallet Extension and start securing your Web3 applications today

Install Extension