Browser extension

PQC Wallet Extension

Post-Quantum Secure Browser Wallet

Chrome · Edge · Brave · Chromium

First browser extension with NIST-standardized post-quantum cryptography and quantum-resistant post-quantum digital signatures

PQC Wallet Extension

Post-Quantum Secure Browser Wallet

Browsers
Chrome Edge Brave Chromium
Standard
NIST-standardized post-quantum cryptography
Signature
post-quantum digital signature
Chrome Web Store
01Features

Why PQC Wallet Extension?

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

  • Quantum-Resistant

    Built on NIST-standardized post-quantum cryptography and post-quantum digital signature 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.

02Live test

Test PQC Wallet Live

Try the extension functionality right here in your browser

Before you start

  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.

Output

Run a check to see output here.

03Developer docs

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

eth_requestAccounts()

GET

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

Usage
await window.pqcWallet.eth_requestAccounts()
Returns
Promise<string[]> - Array of account addresses

eth_accounts()

GET

Get currently connected accounts without prompting

Usage
await window.pqcWallet.eth_accounts()
Returns
Promise<string[]> - Array of connected addresses

pqc_signMessage(message, account)

POST

Sign a message with a quantum-resistant post-quantum digital 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

verifySignature(message, signature, publicKey)

POST

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

eth_sendTransaction(txParams)

POST

Send a transaction with signature

Usage
await window.pqcWallet.eth_sendTransaction({from, to, value, data})
Returns
Promise<string> - Transaction hash

pqc_getPublicKey(account)

GET

Get the post-quantum digital signature public key for an account

Usage
await window.pqcWallet.pqc_getPublicKey(account)
Returns
Promise<{publicKey, algorithm, keySize}>

personal_sign(message, account)

POST

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