Guardrails, Not Gatekeepers
Before any transaction gets signed, Agenta checks it against your rules. Spending too much? Blocked. Sending to an unknown address? Blocked. Too many transactions per hour? Blocked. The server refuses to co-sign until every rule passes. Every enabled rule is checked. If any rule fails, the server returns the full list of violations — not just the first one. You see exactly what went wrong.How It Works
- Transaction arrives at the server
- Server decodes the transaction (to, value, function selector, calldata)
- Every enabled guardrail is evaluated against the transaction context
- If ALL guardrails pass — server proceeds to co-sign
- If ANY guardrail blocks — 403 response with all violations, logged to audit
Rules Engine
The rules engine is Agenta’s policy system. You define an ordered list of rules. Each rule has criteria and an action (accept or reject). Rules are evaluated top-to-bottom. First match wins.
Rules are stored as a policy document per signer. One document, one ordered rule set. Supports draft/active versioning.
Criterion Types
| Type | What It Checks | Key Fields |
|---|---|---|
ethValue | Cap transaction value in wei | operator (<=, <, >=, >, =), value |
evmAddress | Allowlist or blocklist destination addresses | operator (in / not_in), addresses, allowDeploy? |
evmNetwork | Restrict to specific chains | operator (in / not_in), chainIds |
evmFunction | Allowlist function selectors (4-byte) | selectors, allowPlainTransfer? |
ipAddress | Restrict by caller IP (supports CIDR) | operator (in / not_in), ips |
rateLimit | Max signing requests per hour | maxPerHour |
timeWindow | Only allow signing during specific UTC hours | startHour, endHour |
dailyLimit | Rolling 24h spend cap in wei | maxWei |
monthlyLimit | Rolling 30-day spend cap in wei | maxWei |
maxPerTxUsd | Per-transaction USD cap (fail-closed if no price data) | maxUsd |
dailyLimitUsd | Rolling 24h spend cap in USD | maxUsd |
monthlyLimitUsd | Rolling 30-day spend cap in USD | maxUsd |
blockInfiniteApprovals | Block unlimited ERC-20/ERC-721 approvals and Permit2 | enabled |
maxSlippage | Reject swaps exceeding slippage threshold (zero slippage always blocked) | maxPercent |
mevProtection | Block DEX swaps vulnerable to front-running | enabled |
Use
evmAddress with operator: "in" for allowlists (approved contracts) and operator: "not_in" for blocklists (blocked addresses). Known malicious addresses (burn address, dead address) are always blocked server-side regardless of your policy.Rule Structure
Each rule has:action—acceptorrejectcriteria— array of conditions (all must match for the rule to fire)description— human-readable label (optional)enabled— toggle without deleting (optional)
Full Example
A production policy for a trading bot:Built-in Policies
For quick setup, Agenta supports individual policies per signer. These are standalone constraints — no ordered evaluation, just hard pass/fail checks on every transaction.| Type | Config | What It Enforces |
|---|---|---|
spending_limit | { maxWei: "..." } | Max value per transaction |
daily_limit | { maxWei: "..." } | Rolling 24h spend cap |
monthly_limit | { maxWei: "..." } | Rolling 30-day spend cap |
allowed_contracts | { addresses: [...] } | Whitelist of contract addresses |
allowed_functions | { selectors: [...] } | Whitelist of function selectors |
blocked_addresses | { addresses: [...] } | Blacklist of destination addresses |
rate_limit | { maxPerHour: N } | Max signing requests per hour |
time_window | { startHour, endHour } | UTC hours when signing is allowed |
API Endpoints
- Rules Engine
- Built-in Policies
Audit Trail
Every signing request is logged. Approved or denied. The audit log records:- Which guardrails were evaluated
- Which violations occurred
- Evaluation time in milliseconds
- The decoded transaction (to, value, function, calldata)
- Final status (approved, denied, broadcast, failed)