Solana is served as a source and as a destination. The flow is the same gasless openFor flow as the EVM escrow — quote, sign, submit, follow — but the signing family, the signature envelope and the on-chain views differ. This page collects every Solana-specific rule; the route pages hold the rest.

Quoting

  • sourceAccount is required for any non-EVM leg. The solver compiles the transaction around it. A Solana source without sourceAccount answers a bare EIN0050 on POST /quote/preview and EIN0008 with no reference on POST /quote — not a field error (known issue). Check sourceAccount before retrying.
  • Addresses are base58 or 0x + 64 hex; base58 is converted at the boundary, and hex is the wire form. recipient is spelled in the destination chain’s family and sourceAccount in the source chain’s family. A non-EVM recipient or sourceAccount that does not decode is EIN0001 naming the field.
  • Native SOL. Quote the chain row’s nativeKey (sol) when the user means to spend the coin itself, and wsol when they hold wrapped SOL. On a native-coin quote the disclosure carries wrapsNative and wrappedAsset: label the screen with them, never branch the flow on them. The escrow holds, and a refund returns, the wrapped token.
  • The disclosure. disclosure.signablePayload.kind is oif-escrow-nonevm, signatureEnvelope is ed25519-97, and disclosure.signablePayload.orderId is the on-chain order id.
An EVM source can pay out on Solana too: send sourceAccount whenever the recipient’s family differs from the source’s (SDK — a quote request).

Signing

The disclosed signPayload is {…, sender, feePayer, transactionMessage, digest}. sender is the user and feePayer is the solver — that split is the gasless promise: the user never pays gas to open the order.
  • The funding wallet signs the base64-decoded transactionMessage bytes with Ed25519 — never digest, which is a checksum, not what gets signed. Sign the disclosed bytes verbatim.
  • The wire form is the 97-byte envelope 0x00 ‖ 64-byte signature ‖ 32-byte public key (the order’s user), as standard base64: 132 characters. The hub also reads hex but forwards the string unchanged, and the aggregator accepts only base64.
With the SDK, executeQuote does all of this, after checking the message (Wallets — how a Solana order is signed). The pieces are exported too:

Submitting

Send the envelope as signature on POST /order/openfor with the quote’s quoteRequestId and quoteId, before expiresAt. Unlike the EVM escrow lane, the hub checks the envelope itself before forwarding:
  1. 97 bytes;
  2. flag byte 0x00;
  3. the public key equal to the order’s user;
  4. the signature valid over the disclosed transactionMessage;
  5. the message’s order id equal to the quote’s.
A failure on any of these is EIN0007: re-quote and sign again. The forward-reservation, replay and expiry rules are the signed lanes’ and are on the route page (Behavior).

Following

Refunds

There is no escrow tuple for a non-EVM origin: GET /onchain/{orderId}/order answers EIN0009 permanently for a Solana-origin order, even once its Open, fill and settle are all observed (known issue). The documented withdraw steps need that tuple, so they are EVM-only (Refunds — how do I withdraw?). A Solana-origin order refunds through GET /onchain/{orderId}/refund instead: the hub builds the unsigned transaction for the order’s user to sign and send. What a refund returns is unchanged: the wrapped token the escrow holds, to the order’s user (unwrap=true turns wrapped SOL back into SOL in the same transaction).

Wallets

The SDK’s solanaWalletFromStandard works with any Wallet Standard wallet (Phantom, Solflare, Backpack…). Wallets differ in what they will sign, so the SDK signs the transactionMessage bytes either as a transaction or as a raw message, and verifies the Ed25519 signature before sending it (Wallets — how a Solana order is signed).

Cluster domain

The chain domain is solana-<cluster> as the deployment’s catalog declares it — read the chainDomain of the row whose family is solana rather than assuming a name. Samples in this reference use solana-localnet.

See also