The key split
CSAP derives two keys from the wallet signature: the viewing keyv (scanning) and the
spending key s (spending). A scanner needs only v and the spending public key S
(CSAP §2.8 watch-only delegation). Give your server v and S — never the spending key.
View-only client
Starknet (Sepolia, testnet preview) scans natively alongside Ethereum and Solana — the same
view-only viewing key covers all three chains.
includeCrossChain still only pulls
Wormhole-relayed announcements (Ethereum ↔ Solana); Starknet participates as a native scan
chain, not a relay endpoint. See Starknet for the full flow.sweep, getStealthSignerPrivateKey, and reputation key
reconstruction throw, because the server has no spending key:
OpaqueClient.create / fromWallet (holding the
spending key) to sweep or spend.
Where the keys come from
Derive both keys client-side from the wallet signature, then send only the viewing key and spending public key to your server over an authenticated channel:Native scanner service
Server-side you can also run the native Rust scanner (opaque-scanner on crates.io) instead of
the WASM build — same algorithm, no WASM runtime needed. Either way, scanning needs only the
viewing key, so the view-only model holds regardless of which implementation you run.