Changelog
Docs: four-chain support documented
June 2026
Changed
- Chain support pages now reflect the live set: Ethereum, Arbitrum, Monad, and Sui, running testnet-first (Sepolia, Arbitrum Sepolia, Monad Testnet, Sui testnet). Monad is described as the announcement registry chain. Base and Optimism remain on the roadmap.
- Crypto domain separators now show their exact labels (
SPECTER_VIEW_TAG_V1for the view tag,SPECTER_STEALTH_TWEAK_V2for the stealth-address tweak).
@specterpq/sdk v2.0.0
July 2026
Stealth-address derivation now matches the SPECTER backend byte-for-byte. Breaking: the addresses returned by deriveStealthPublic / deriveStealthKeys change, so upgrade to discover and spend real funds.
Fixed
- The tweak scalar previously used the
SPECTER_STEALTH_TWEAK_V1domain, the bare shared secret, and modular reduction. The backend (which computes the address the sender actually funds) usesSPECTER_STEALTH_TWEAK_V2, hashesshared_secret || counter, and selects the scalar by rejection sampling. The mismatch resolved every payment to an unfunded address. The two implementations are now locked together by a cross-implementation known-answer test. No funds were lost — they sit at the backend-derived addresses and become visible again after upgrade.
@specterpq/sdk v1.0.0
July 2026
Hybrid recipient identity and a hardened HTTP client. Breaking change to the meta-address wire format and the spending-key type.
Changed
- Recipients now hold a secp256k1 spending keypair plus the ML-KEM-768 viewing keypair. The meta-address wire format is v2 (1,218 bytes: version + 33-byte spending public key + 1,184-byte viewing public key).
generateSpecterKeys()returns this hybrid identity. - Stealth derivation moved to an ERC-5564-style additive tweak (
P = B + t·G,p = b + t mod n). The sender can compute the address but not the private key — fixing a flaw where the sender could reconstruct the recipient's stealth private key.
Security
- Removed
generateKeysRemote()andscanRemote()from the HTTP client, which could transmit secret keys. The client is now public-data only (createStealthPaymentRemote,publishAnnouncement). Generate keys and scan locally.
@specterpq/sdk v0.3.0
June 2026
Announcement metadata can now be encoded and encrypted client-side, matching the hosted backend. Backend synced to upstream 8294c2f.
Added
- Announcement metadata API:
sealAnnouncementMetadata,openAnnouncementMetadata, and the lower-levelencodeAnnouncementMetadata,decodeAnnouncementMetadata,encryptAnnouncementMetadata,decryptAnnouncementMetadata. - Metadata size constants:
PLAINTEXT_METADATA_SIZE(77),ENCRYPTED_METADATA_SIZE(93),METADATA_TX_HASH_SIZE,METADATA_AMOUNT_SIZE,METADATA_SOURCE_CHAIN_ID_SIZE. - Error codes:
INVALID_METADATA_SIZE,INVALID_METADATA_FIELD,METADATA_DECRYPTION_FAILED.
Changed
- Metadata
txHashandamountinputs accept plain0xhex strings (in addition toUint8Array, andbigintforamount).
@specterpq/sdk v0.2.0
June 2026
The TypeScript SDK reaches the same protocol as the hosted API, with all cryptography running locally in WebAssembly. See the SDK section.
Added
- ML-KEM-768 key generation, encapsulation, and decapsulation in browser and Node WebAssembly builds.
- High-level flow:
createStealthPaymentandscanAnnouncement/scanAnnouncements. - Meta-address build and parse:
metaAddressFromPublicKeys,parseMetaAddress. - Stealth derivation for Ethereum and Sui:
deriveStealthAddress,deriveStealthSuiAddress,deriveStealthKeys. - View tag helpers:
computeViewTag,verifyViewTag. - Opt-in trusted HTTP client:
createSpecterApiClient. - Exported size constants and a typed
SpecterSdkErrorwith stable error codes.
Security
- Secret-bearing fields (
secretKey,sharedSecret,ethPrivateKey) are non-enumerable and redacted from JSON and console output. - Local crypto helpers make no network calls. Network access is limited to the trusted client you construct.
v0.1.0 - Initial Release
March 2026
The first public release of SPECTER, a post-quantum stealth address protocol for Ethereum and Sui.
Core
- ML-KEM-768 key generation, encapsulation, and decapsulation
- Stealth address derivation for Ethereum and Sui from one secp256k1 key (keccak256 for Ethereum, blake2b-256 with the secp256k1 scheme flag for Sui)
- View tag computation and verification (1-byte, ~99.6% filter rate)
- SHAKE-256 key derivation with domain separation
- Batch scanning engine with progress callbacks
- In-memory and Turso (libSQL) announcement registry backends
- Lock-free concurrent caching
API
- REST API server (Axum)
- Key generation, stealth create, stealth scan, announcement registry
- ENS and SuiNS name resolution
- IPFS meta-address upload/fetch via Pinata
- Rate limiting, CORS, security headers, API key auth
Frontend
- React + TypeScript web application
- Generate keys, send payments, scan payments
- Encrypted browser vault for key storage (AES-GCM)
- Wallet integration (Ethereum + Sui)
Infrastructure
- Docker multi-stage builds
- Google Cloud Run deployment with auto-scaling
- GitHub Actions CI (fmt, clippy, test)
- 195 tests across all crates
For detailed commit history, see the GitHub repository.