Prepared by Aaron @ Jupiter

Contents

Summary

Solana has a published off-chain message signing format (off-chain-message-signing.md and sRFC 38) but no wallet-standard feature exposes it. Today, a dapp that wants a Solana off-chain-signed message has no good option:

  1. Construct the preamble + body itself and call solana:signMessage with the raw bytes: the wallet shows the user opaque bytes (or a best-effort UTF-8 render of bytes that begin with \xffsolana offchain followed by binary preamble fields). The user has no meaningful way to review what they're signing, exactly the UX problem the off-chain message spec was designed to solve.
  2. Use a wallet-specific RPC: doesn't interop across wallets.
  3. Wait: which is what's happening today, despite kit shipping a complete encoder/decoder in @solana/offchain-messages.

This issue proposes adding solana:signOffchainMessage as a first-class wallet-standard feature.

Why Not Extend solana:signMessage?

solana:signMessage already has an established contract (raw bytes in, signed verbatim), and is in use in production for various applications. Overloading it with off-chain-message semantics would:

Wallet Standard's mechanism for capability evolution is namespaced features. Adding solana:signOffchainMessage lets:

This mirrors EVM precedent: personal_sign (EIP-191) and eth_signTypedData_v4 (EIP-712) are distinct RPCs from raw eth_sign, not overloads of it, for exactly the same reasons.