Skip to content

Today we are releasing cross-chain raw signing in Wallet-as-a-Service (Palisade). EVM wallets can now raw-sign transactions for chain IDs that Wallet-as-a-Service (Palisade) doesn't natively integrate. A new CHAIN_ID policy matcher controls access.

Cross-chain raw signing returns a signature only — no broadcast. You are responsible for submitting the signed transaction to the target chain.

Background

Customers need to sign EVM transactions for chains that Wallet-as-a-Service (Palisade) hasn't yet onboarded — for example, custom L2s, testnets, or newer EVM chains. Previously, raw signing rejected any transaction whose chain ID didn't match the wallet's native blockchain. Cross-chain raw signing lifts that restriction for EVM wallets while keeping authorization under explicit policy control.

Key features

  • Same endpoint — Cross-chain raw signing uses the existing raw transaction endpoint. No new endpoints, wallet types, or transaction actions.
  • New CHAIN_ID matcher — Add a CHAIN_ID matcher on a wallet policy to allow raw signing for a specific EVM chain ID. Wallet-as-a-Service skips policies without a CHAIN_ID matcher for cross-chain transactions — you must explicitly authorize each chain ID.
  • Sign-only — Cross-chain raw signing forces sign_only=true. Wallet-as-a-Service rejects requests with sign_only=false for a non-native chain ID with HTTP 400.
  • EVM-only — Available for EVM wallets only, for EVM chain IDs only.
  • Natively-integrated chain IDs rejected — Wallet-as-a-Service rejects a CHAIN_ID matcher value that matches a chain it already integrates natively. Use the standard raw signing flow for those chains.
  • Matcher scoping — Combine CHAIN_ID with USER, API_CREDENTIAL, or other matchers to scope cross-chain signing authority per user, per credential, or per counterparty.

Example

Allow API credential cred-uuid to sign up to 5 transactions per 24 hours on chain ID 10 (Optimism):

{
  "limitType": "ROLLING_DURATION",
  "symbol": "ETH",
  "limitQty": "5",
  "duration": "86400s",
  "matchers": [
    { "type": "CHAIN_ID",       "value": "10" },
    { "type": "API_CREDENTIAL", "value": "cred-uuid" }
  ]
}

Documentation