While Permissions is on, raw signatures follow the same defaults as other signing requests: an app-owned wallet signs them, and a user-owned wallet sends them to the user for review. Rules that name the
raw_signature action, and rules with "actions": "all", can change that. Raw signatures are sign-raw requests, messages from Solana, Stellar and Sui wallets, and REST sign-message requests from a Cosmos wallet that do not pass walletType: "EVM". The SDKs sign messages from Cosmos wallets as EVM sign_message requests. Raw signatures carry no network a selector can name, so only a policy without chainId governs them. A rule that names raw_signature can read only para.wallet.* facts. The Developer Portal forms cannot create one, so write it in policy JSON, with Edit JSON in the Developer Portal or with the CLI.Block raw signatures
Use this when your backend never callssign-raw with its EVM wallets, for example because it only sends transfers that your other Guardrails check.
guardrail-block-raw-signatures.json
para.wallet.hasUserOwner is always false, so the rule denies every raw signature from them. Personal messages and typed data are separate actions, so this policy leaves them alone.
Test it on your Development key: call REST
sign-raw with an app-owned EVM wallet before and after you activate the policy. The first request signs and the second is denied.walletId. For Solana, Stellar or Sui wallets, copy the policy with a new id and change walletType. On those wallet types every message is a raw signature, so the copy blocks message signing as well. Cosmos wallets need more, as Cosmos wallets explains.
Hold message signing for approval
Use this when your backend signs messages with app-owned Solana wallets only now and then, for example to prove wallet ownership to another service, and a person should confirm each one.Para turns on conditional approvals per API key, so your beta and production keys are enabled separately. Until it does, validating or saving this policy fails with permissions_v2_extension_unavailable.
guardrail-solana-message-signing.json
signing-reviewer role. Set them up as in the approval tiers templates: once the policy is active, your backend assigns the role in an authorization scope and binds the wallet to that scope.
The case covers that exact message. When it is
completed, send the same request again: through REST with the same Idempotency-Key, or through the server SDK with the case ID as resumeApprovalCaseId.
Test it on your Development key: assign
signing-reviewer to a test user and bind the wallet. Sign a message with the app-owned Solana wallet through REST with an Idempotency-Key, approve the case as that user, and send the request again with the same key to sign it.id and change walletType. Each wallet type needs its own policy.
Cosmos wallets
A Cosmos wallet can also sign as an EVM wallet, so its messages are raw signatures only on some routes. A copy of either template withwalletType set to COSMOS covers those routes, and an EVM policy covers the others:
evm-block-raw-signatures does not cover the last two rows, because they are sign_message requests. To block or hold every message from a Cosmos wallet, add the COSMOS copy and an EVM policy whose rule lists sign_message. List the Cosmos wallet’s ID as walletId in the EVM policy, or it also applies to messages from your EVM wallets.
Block permit and authorization signatures
A permit is typed data that lets another address spend the wallet’s tokens without a transaction from the wallet. An EIP-7702 authorization lets the account run another contract’s code. Both can move funds later, outside any transfer cap. Use this template when your backend should never sign either one.The Para client and server SDKs, including their viem, ethers and wagmi integrations, sign EIP-712 typed data and EIP-7702 authorizations as a message over their hash, so Para evaluates those requests as
sign_message. The sign_typed_data and sign_authorization actions, and the facts Para reads from typed data and authorizations, such as request.typedData.primaryType, apply only to the REST API’s sign-typed-data and sign-authorization routes, which the REST SDK calls.This template cannot inspect a permit or an authorization your backend signs through the server SDK.guardrail-block-permit-signatures.json
request.approvalLike to true for every authorization, and for typed data whose primary type contains permit in any letter case, such as Permit, PermitSingle or PermitBatch. Typed data with any other primary type is not affected.
Test it on your Development key: through the REST
sign-typed-data endpoint, sign an EIP-2612 Permit with an app-owned EVM wallet, then sign a personal message. Only the permit is denied.{ "kind": "compare", "fact": "para.wallet.hasUserOwner", "op": "eq", "value": false }. If your backend signs through the server SDK, also add sign_message to the rule’s actions. That is the only way to stop permits and authorizations there, and it also blocks every personal message.
Publish your signing rules
Wallets and roles belong to each environment. Before you request a production review, confirm that each policy names the wallet types and wallets you mean to restrict in production. After the review, assignsigning-reviewer there and bind the production wallets. A policy with a walletId needs the production wallet’s ID.