signMessage) with the parser’s help. Transactions need nothing beyond the chain-agnostic flow. For the envelope format and what the parser refuses, see Off-chain messages.
Request
Send the envelope as the transaction string, with the chain set to Solana:message is the exact text the dApp asked to sign. signerAddress is the account the wallet will sign with.
Response
payload_type is SolanaMessage, distinct from SolanaTx, so a wallet can tell a message from a transaction without looking at the fields. The title is Solana Message, and there are two fields:
What the wallet must do
The parser’s output is only as safe as the wallet’s handling of it. Before signing:- Bind the signing address to the selected account. The parser checks only that
signerAddressis a well-formed Solana address. It has no key to compare it with, and it accepts an off-curve address (a PDA) that no key can sign for. The wallet must check that the address shown underSigning Addressis the account it is about to sign with, and refuse otherwise. - Sign the original bytes of
message. Sign exactly the UTF-8 bytes of themessagestring from the request: not the envelope, and not the escaped text the parser displays. - Show the text exactly as given. The displayed message is percent-escaped so that distinct messages always look distinct: every byte outside printable ASCII, plus
%and\, appears as%XX, and a space at either end or in a run appears as%20. Do not URL-decode it.%0Alooks like URL encoding, and a wallet that decodes it brings back the line break that lets a message forge a second line on the signing screen (for example a fakeTo:row). The same goes for%E2%80%AE, a right-to-left override that would reorder the text.
Refused messages
Some messages are refused with an error instead of a payload, because a signature over their bytes would authorize more than the text:- Exactly 32 bytes, not all ASCII letters and digits. NEP-413, SEP-53 and TON Connect verifiers (NEAR Intents among them) check an ed25519 signature over a 32-byte SHA-256 digest, and a Solana wallet signs message bytes as they are, so such a message may be a digest another protocol accepts.
- Bytes that are a serialized Solana transaction message. A signature over them is a valid signature for that transaction.