Skip to main content
Guardrails restrict the app-owned wallets your backend signs with through the Para REST API. A transaction that matches a Guardrail rule is denied or waits for approval. Transactions that no rule matches stay allowed, except raw signatures, which are denied by default. For user-owned wallets, start from the Request templates instead. You can create the first four templates in the Developer Portal or with the CLI. The last two need the CLI. For the full flows, see the Developer Portal walkthrough and Author policies with JSON. In the CLI commands, replace KEY_ID with your beta API key ID and RECORD_ID with the policy.recordId that create returns. The Portal shows the policy it generates in the JSON Preview tab.
Amounts are integer strings in base units, not decimal token amounts. ETH uses wei, so 1 ETH is 1000000000000000000. USDC has 6 decimals, so 1 USDC is 1000000.

Cap native spending

Deny ETH transfers on Base above 0.1 ETH in one transaction or above 1 ETH in a 24-hour window. Use it to limit how much a compromised or misbehaving backend can move.
  1. Open Permissions, select the Guardrails tab, and select Add. Once the key has a Guardrail, the button is New Guardrail.
  2. Enter a Guardrail Policy Name, select Base (8453) under Networks, and select Continue.
  3. Select Transfer ETH, then Add Condition: Transaction amount, is at most, 0.1, ETH, per transaction.
  4. Select Add Action, select Transfer ETH again, and add a condition: Transaction amount, is at most, 1, ETH, per time window, 24, hours.
  5. Select Review, then Save Draft. Activate the draft from the Drafts list.
The Portal form asks for the amount you permit, and the saved rule denies anything above it. That is why each condition in the JSON uses gt.
Spending limits cover native transfers on every wallet type and token transfers on EVM (ERC-20), Solana, Cosmos, and Stellar. Sui limits cover native transfers only. A token limit counts only the asset it names. Each network and asset has its own budget, so a limit of 1 ETH per day on Ethereum and Base allows 1 ETH per day on each network. Amounts Para cannot decode do not count toward a limit. Smart account user operations do not count toward EVM limits, except ERC-20 transfers sent through Para gas sponsorship.
To cover more EVM networks, select them under Networks or set chainId to a list such as ["1", "8453"]. For Solana, Cosmos, Stellar, or Sui, use the Native transfer action in the Portal.

Cap daily USDC transfers

Deny USDC transfers on Base once the wallet would send more than 1,000 USDC in a 24-hour window. USDC on Base is 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913.
  1. Open Permissions, select the Guardrails tab, and select Add or New Guardrail.
  2. Enter a Guardrail Policy Name, select Base (8453) under Networks, and select Continue.
  3. Select Transfer tokens and enter the USDC address in Contract Address. Function Name is fixed to transfer.
  4. Select Add Condition: Transaction amount, is at most, 1000000000 token base units, per time window, 24, hours.
  5. Select Review, then Save Draft. Activate the draft from the Drafts list.
The contract address is part of the rule, so this Guardrail also denies direct transfer calls for every other ERC-20 token on Base. Only USDC transfers within the daily limit pass.
The limit counts direct transfer(address,uint256) calls; see Windowed spend limits for what it excludes. On Solana, Cosmos, and Stellar, use the Token transfer action and enter the asset in Token Asset. Sui has no token transfer action.

Allow only approved recipients

Deny ETH transfers on Base to any address outside an allowlist. Use it when the wallet should only pay addresses you already know.
  1. Open Permissions, select the Guardrails tab, and select Add or New Guardrail.
  2. Enter a Guardrail Policy Name, select Base (8453) under Networks, and select Continue.
  3. Select Transfer ETH, then Add Condition: Recipient address, is one of, and the approved addresses separated by commas.
  4. Select Review, then Save Draft. Activate the draft from the Drafts list.
This rule covers native ETH transfers only. Token transfers and contract calls to other addresses are not restricted by it. On Solana, Cosmos, Stellar, or Sui, use the Native transfer action with the same Recipient address condition.

Allow only an approved contract

Deny contract calls on Base unless they call deposit on one approved contract. Use it when the wallet should interact with a single protocol function.
  1. Open Permissions, select the Guardrails tab, and select Add or New Guardrail.
  2. Enter a Guardrail Policy Name, select Base (8453) under Networks, and select Continue.
  3. Select Call a contract. Enter the contract in Contract Address and deposit in Function Name. No condition is needed.
  4. Select Review, then Save Draft. Activate the draft from the Drafts list.
This rule matches only contract calls that Para can decode. A call whose data Para cannot decode does not match and stays allowed. Adding a second Call a contract action does not extend the allowlist either: each action denies every call outside its own contract and function.To deny every contract call outside a list of contracts, including calls Para cannot decode, author the rule in JSON with this when:
Contract calls here are the call_contract action. ERC-20 transfers and approvals, Safe transactions, and deployments are separate actions. On Solana, Cosmos, Stellar, or Sui, use the Execution target action in the Portal.

Require approval above a threshold

Hold ETH transfers on Base above 1 ETH until one person with the approver role approves them. Smaller transfers sign without review. The Developer Portal forms cannot express approval requirements, so create this policy with the CLI.
Para enables conditional approvals per app. Until then, validating this policy returns a permissions_v2_extension_unavailable error, and the approval administration endpoints return 403 PERMISSIONS_V2_EXTENSION_UNAVAILABLE.
guardrail-approval-threshold.json
Before testing, assign the approver role to at least one user and bind the wallet to the authorization scope. A transfer above the threshold returns 403 POLICY_REVIEW_REQUIRED with an approvalCaseId. Retry it after approval as described in Conditional approvals. To require more people or several stages, extend stages as shown in Conditional approval requirements. Guardrails accept only authenticated_approval evidence.

Allow Solana message signing

Allow sign-message and sign-raw requests from app-owned Solana wallets. While Permissions is on, Para denies raw signatures for app-owned and user-owned wallets unless an active policy that applies to the wallet has a rule allowing the raw_signature action. Raw signatures include sign-raw requests and message signing from wallets that cannot sign as EVM, such as Solana, Stellar, and Sui wallets. The Developer Portal forms cannot create this rule; use JSON authoring.
guardrail-solana-message-signing.json
A raw_signature rule can read only para.wallet.* facts. The condition para.wallet.hasUserOwner equals false holds for every app-owned wallet, and a Guardrail applies only to app-owned wallets. As a result, the rule allows raw signatures from every Solana wallet the selector covers. Add walletId to the selector to limit it to specific wallets. To allow raw signatures for another wallet type, set walletType to COSMOS, STELLAR, SUI, or EVM, which covers sign-raw requests. A policy governs one wallet type, so write one policy per wallet type.