SPECTER logo
SPECTER SDK
POST-QUANTUM STEALTH ADDRESSES
STAR @specterpq/sdk
WASM · IN-BROWSER

Interactive
Playground

Generate ML-KEM-768 stealth addresses, create payments, and scan announcements — all cryptography runs locally in WebAssembly. No keys leave your browser.

SDK INIT
KEY GEN
META ADDR
PAYMENT
SCAN
Initializing WASM module...
LOADING
01
Generate recipient keys
RECIPIENT

Generate an ML-KEM-768 keypair for spending and viewing. Secret keys stay in memory and are redacted from serialization. Click generate to create fresh keys.

const keys = generateSpecterKeys(); // → { spending: { publicKey, secretKey }, viewing: { publicKey, secretKey } }
spending.publicKey
viewing.publicKey
spending.secretKey
[ redacted — never logged or serialized ]
02
Build meta-address
RECIPIENT

Combine spending + viewing public keys into a canonical meta-address hex. Recipients publish this (e.g. on-chain or via ENS) so senders can derive unique stealth addresses.

const meta = metaAddressFromPublicKeys( keys.spending.publicKey, keys.viewing.publicKey, { description: 'Alice' } ); // meta.hex — 2369 bytes, publishable
meta.hex (publishable)
meta.bytes.length
03
Create stealth payment
SENDER

The sender takes a recipient's meta-address and calls createStealthPayment. This performs ML-KEM-768 encapsulation, derives unique stealth addresses for ETH and Sui, and produces a compact announcement.

const payment = createStealthPayment(meta.hex); // → { ephemeralCiphertext, viewTag, ethAddress, suiAddress }

Or paste a meta-address hex from elsewhere:

ephemeralCiphertext (announce this)
viewTag
ethAddress
suiAddress
04
Scan announcement
RECIPIENT

Recipient decapsulates the ephemeral ciphertext using their viewing secret key, checks the view-tag (1-byte filter), and if matched, derives the spendable stealth keys.

const result = scanAnnouncement( { ephemeralCiphertext, viewTag }, recipient.viewing, recipient.spending.publicKey, ); if (result.isMatch) { // result.stealthKeys.ethPrivateKey → import into viem / ethers }

Paste announcement fields below (auto-filled from step 3 if you ran it above):

TAMPER TEST

Modify the announcement only for this scan to verify that SPECTER rejects tampered data.

stealthKeys.ethAddress
stealthKeys.suiAddress
stealthKeys.ethPrivateKey
[ redacted — import directly into viem / ethers / @mysten/sui ]
BATCH SCAN TEST

Generate decoy announcements and scan them with scanAnnouncements().

Ctrl+Enter or +Enter to run
CONSOLE OUTPUT
Output will appear here after running your code…
AVAILABLE GLOBALS
initSpecterSdk generateSpecterKeys generateKeysLocal metaAddressFromPublicKeys parseMetaAddress encapsulate decapsulate computeViewTag verifyViewTag deriveStealthAddress deriveStealthSuiAddress deriveStealthKeys createStealthPayment scanAnnouncement scanAnnouncements KYBER_PUBLIC_KEY_SIZE KYBER_CIPHERTEXT_SIZE PROTOCOL_VERSION