Conto Policy Enforcement
You are a spending policy enforcement layer. Before executing ANY payment, transfer, swap, or bridge, you MUST check Conto's policy engine for approval. Never send money without policy clearance.
Prerequisites
Before using this skill, you need:
- 1. A Conto account — Sign up at conto.finance
- A
CONTO_SDK_KEY (required) — Generated from the Conto dashboard (format: conto_agent_...). See Getting Started below. curl and jq — Command-line tools (pre-installed on most systems)CONTO_API_URL (optional) — API base URL (default: https://conto.finance). Must use https:// in production (localhost allowed for development only).
When This Skill Activates
This skill applies whenever you are about to:
- - Transfer tokens (USDC, ETH, SOL, etc.) to any address
- Swap tokens on any DEX
- Bridge tokens between chains
- Pay for an API call (x402, paid endpoints)
- Make any on-chain transaction that moves value
Getting Started
Step 1: Install the skill
CODEBLOCK0
Step 2: Get your wallet address
Conto needs your wallet address to track spending. Ask your agent:
CODEBLOCK1
The agent will return your address (e.g., 0x80Ca...). If you don't have a wallet yet, ask "Show me my wallet balances" — one will be provisioned automatically.
Step 3: Set up your agent in the Conto dashboard
Sign in at conto.finance and complete these steps:
- 1. Create an agent: Agents > Create Agent > name it, set type to CUSTOM, status ACTIVE
- Register your wallet: Wallets > Add Wallet > paste your wallet address, set custody type (EXTERNAL for OpenClaw/Sponge wallets, PRIVY or SPONGE for custody-managed wallets)
- Link wallet to agent: Agents > your agent > Wallets tab > link the wallet, set spend limits (e.g., $200/tx, $1000/day)
- Generate an SDK key: Agents > your agent > SDK Keys > Generate New Key
- Select
Admin for full control (create/manage policies)
- Select
Standard for payment approval only
- Copy the key immediately — it's only shown once
Step 4: Configure OpenClaw
Add the SDK key to ~/.openclaw/openclaw.json:
CODEBLOCK2
Step 5: Verify it works
Test that the skill is connected by checking your policies:
CODEBLOCK3
Or test a policy check (this does NOT execute a payment):
CODEBLOCK4
If you get an approval or denial response, Conto is working.
Which Wallet Mode Should I Use?
Conto supports two modes depending on who manages the wallet keys:
| Question | Mode A | Mode B |
|---|
| Who holds the wallet keys? | Custody provider (Privy or Sponge) | You (via OpenClaw/Sponge MCP tools) |
| How many API calls per payment? |
1 (single call, auto-executes) | 3 (approve → transfer → confirm) |
| When to use? | Wallet
custodyType is PRIVY or SPONGE in Conto dashboard | Wallet
custodyType is EXTERNAL in Conto dashboard |
Most OpenClaw setups use Mode B — your agent controls the wallet via Sponge MCP tools and Conto acts as the policy gate before each transaction.
Prefer conto-check.sh for Mode B commands (approve, confirm, x402, budget, services, and all policy commands). The shell helper includes input validation, HTTPS enforcement, timeouts, retry logic, and safe credential handling. Use raw curl only for Mode A endpoints (/request, /execute) and the x402 /record endpoint, which have no shell helper yet.
Quick Start: Your First Policy-Checked Payment (Mode B)
Here's a complete end-to-end example of sending 10 USDC with policy enforcement:
1. Request approval from Conto:
CODEBLOCK5
2. If approved, execute the transfer:
CODEBLOCK6
3. Confirm the transaction with Conto:
CODEBLOCK7
That's it. Conto checked the policy, you sent the payment, and the confirmation keeps spend tracking accurate. The sections below cover each step in detail.
Mode A: Custody-Managed Wallets (PRIVY / SPONGE)
For wallets managed by a custody provider (Privy or Sponge), use a single API call. Conto evaluates policies and instructs the custody provider to execute the transfer.
CODEBLOCK8
If approved and executed, the response includes the tx hash directly:
CODEBLOCK9
No need to call /execute or /confirm — Conto did everything. Report the tx hash and explorer URL to the user.
If approved but not auto-executed (e.g., autoExecuteError in response), call /execute manually:
CODEBLOCK10
If denied, the response includes reasons and violations — report them to the user (see denial handling below).
Mode B: External Wallets (EXTERNAL custody)
For wallets where you hold the keys, use the three-step flow: approve → transfer → confirm.
Step 1: Request Policy Approval
CODEBLOCK11
Required fields:
- -
amount — Positive number, the USDC value of the transaction - INLINECODE28 — The destination address (0x... for EVM, base58 for Solana)
- INLINECODE29 — Your wallet address that will send the funds
Optional fields:
- -
recipientName — Human-readable name (e.g., "OpenAI API", "Uniswap Router") - INLINECODE31 — Why this payment is needed (e.g., "Swap 0.5 ETH for USDC on Uniswap")
- INLINECODE32 — One of:
API_PROVIDER, CLOUD, SAAS, INFRASTRUCTURE, MARKETING, PAYROLL, TRAVEL, LODGING, TRANSPORT, SUPPLIES, DATABASE, MONITORING, PAYMENTS, INLINECODE46 - INLINECODE47 — Chain ID number. Send
42431 for Tempo Testnet (default). Other values: 8453 (Base mainnet), 84532 (Base Sepolia), 1 (Ethereum) - INLINECODE52 — JSON object with any additional metadata
For x402 API payments (paid HTTP endpoints), use the dedicated pre-authorize endpoint instead:
CODEBLOCK12
Step 2: Handle the Approval Response
If approved ("approved": true):
CODEBLOCK13
Save the approvalId and approvalToken — you need them for Step 3.
The approval expires in 10 minutes. Execute and confirm before then.
Security note: The approvalToken is cryptographically bound to the original request parameters (amount, recipient, chain). The /confirm endpoint validates that the confirmed transaction matches the approved parameters. You cannot reuse an approval token for a different amount or recipient.
Step 2a: Execute the Transfer
Now execute the payment using your wallet. Conto approved the policy — now YOU must send the actual on-chain transaction. Do NOT ask the user to execute it.
Use the appropriate MCP tool for the target chain:
Tempo (pathUSD):
CODEBLOCK14
Base (USDC):
CODEBLOCK15
Solana (USDC):
CODEBLOCK16
The transfer will return a transaction hash. Save it for Step 3.
If the transfer fails, report the error to the user. Do NOT call confirm.
Handling Denials
If denied ("approved": false):
CODEBLOCK17
DO NOT execute the payment. Report the denial to the user:
- - Show the
reasons array (human-readable) - Show violation details (type, limit, current values)
- If
requiresHumanApproval is true, tell the user a Conto dashboard admin must approve it
If the request fails (HTTP errors):
- - 401: SDK key invalid. Ask user to check
CONTO_SDK_KEY. - 403: Missing scope. Needs
payments:approve. - 429: Rate limited. Wait for the
Retry-After header value and retry. - 500/502/503: Retry once after a 2-second delay. If it fails again, inform the user. The
conto-check.sh helper handles this automatically.
Step 3: Confirm After Execution
After the transfer succeeds, report the transaction hash back to Conto:
CODEBLOCK18
Required fields:
- -
txHash — The on-chain transaction hash (0x + 64 hex chars for EVM, or base58 for Solana) - INLINECODE66 — The exact token string from the approval response
Success response:
CODEBLOCK19
Confirmation is important — it updates spend tracking so future policy checks have accurate data. If you skip this, the daily/weekly/monthly counters will be wrong and the agent may overspend.
If confirmation fails with EXPIRED, the 10-minute window passed. Inform the user.
Reporting Results to the User
On success (approved + executed + confirmed):
CODEBLOCK20
On denial:
CODEBLOCK21
On requires approval:
CODEBLOCK22
Mapping Payment Types to Policy Calls
Transfers (send USDC/ETH/SOL to an address)
- -
amount: The transfer amount in USDC (convert if needed) - INLINECODE69 : The destination address
- INLINECODE70 : Your wallet address
- INLINECODE71 :
PAYMENTS or the appropriate category - INLINECODE73 : "Transfer X USDC to 0xabc..."
Swaps (DEX trades)
- -
amount: The input amount in USDC equivalent - INLINECODE75 : The DEX router contract address
- INLINECODE76 : Your wallet address
- INLINECODE77 : INLINECODE78
- INLINECODE79 : "Swap X TOKENA for TOKENB on Uniswap"
- INLINECODE80 : The DEX name (e.g., "Uniswap V3 Router")
Bridges (cross-chain transfers)
- -
amount: The bridged amount in USDC equivalent - INLINECODE82 : The bridge contract address
- INLINECODE83 : Your wallet address on the source chain
- INLINECODE84 : INLINECODE85
- INLINECODE86 : "Bridge X USDC from Base to Solana"
- INLINECODE87 : The bridge provider (e.g., "Relay Bridge")
- INLINECODE88 : The source chain ID
x402 API Payments
Use the /api/sdk/x402/pre-authorize endpoint (see Step 1 above). This evaluates x402-specific rules like per-service caps, endpoint velocity limits, and service allowlists.
If authorized ("authorized": true), proceed with the x402 payment flow normally. No separate confirm step is needed for x402 — use the x402 record endpoint instead:
CODEBLOCK23
Policy Violation Types Reference
When a payment is denied, the violations[].type field tells you exactly what rule was triggered:
| Violation Type | Meaning |
|---|
| INLINECODE92 | Wallet doesn't have enough funds |
| INLINECODE93 |
Single transaction exceeds max allowed |
|
DAILY_LIMIT | Would exceed daily spending cap |
|
WEEKLY_LIMIT | Would exceed weekly spending cap |
|
MONTHLY_LIMIT | Would exceed monthly spending cap |
|
BUDGET_EXCEEDED | Would exceed budget allocation |
|
TIME_WINDOW | Transaction outside allowed hours |
|
BLACKOUT_PERIOD | Transaction during maintenance/blackout window |
|
BLOCKED_COUNTERPARTY | Recipient is on the blocklist |
|
WHITELIST_VIOLATION | Recipient is not on the allowlist |
|
CATEGORY_RESTRICTION | Spend category is not permitted |
|
VELOCITY_LIMIT | Too many transactions in time period |
|
GEOGRAPHIC_RESTRICTION | Geographic/OFAC restriction |
|
CONTRACT_NOT_ALLOWED | Smart contract not on allowlist |
|
X402_PRICE_CEILING | x402 API call exceeds price cap |
|
X402_SERVICE_BLOCKED | x402 service is on blocklist |
|
X402_SERVICE_NOT_ALLOWED | x402 service not on allowlist |
|
X402_ENDPOINT_LIMIT | x402 endpoint spend limit exceeded |
|
X402_SESSION_BUDGET | x402 session budget exhausted |
|
X402_VELOCITY | x402 call rate limit exceeded |
Error Reporting to the User
When a payment is denied, format the denial clearly:
CODEBLOCK24
When requiresHumanApproval is true:
CODEBLOCK25
Managing Policies from OpenClaw
If your SDK key is an admin key (keyType: "admin"), you can create, update, and delete policies directly from the CLI. Standard keys can only read policies and check payments.
List all policies
CODEBLOCK26
Create a policy
CODEBLOCK27
The response includes the new policy's id. Save it for assigning to agents.
Common policy recipes
Daily spending cap of $1,000:
CODEBLOCK28
Only allow API and Cloud payments:
CODEBLOCK29
Block a scam address:
CODEBLOCK30
Require human approval above $500:
CODEBLOCK31
Business hours only (Mon-Fri 9am-6pm):
CODEBLOCK32
Cap x402 API spend at $1/request, $50/day per service:
CODEBLOCK33
Add a rule to an existing policy
CODEBLOCK34
Replace all rules on a policy
CODEBLOCK35
Delete a policy
CODEBLOCK36
Available rule types
| Rule Type | Operator | Value Format | Use Case |
|---|
| INLINECODE115 | INLINECODE116 | INLINECODE117 | Per-transaction cap |
| INLINECODE118 |
LTE |
"1000" | Daily spending cap |
|
WEEKLY_LIMIT |
LTE |
"5000" | Weekly spending cap |
|
MONTHLY_LIMIT |
LTE |
"20000" | Monthly spending cap |
|
BUDGET_CAP |
LTE |
{"amount":10000,"period":"MONTHLY"} | Budget allocation |
|
ALLOWED_CATEGORIES |
IN_LIST |
["API_PROVIDER","CLOUD"] | Category whitelist |
|
BLOCKED_CATEGORIES |
IN_LIST |
["GAMBLING"] | Category blocklist |
|
ALLOWED_COUNTERPARTIES |
IN_LIST |
["0xabc..."] | Address whitelist |
|
BLOCKED_COUNTERPARTIES |
IN_LIST |
["0xbad..."] | Address blocklist |
|
TIME_WINDOW |
BETWEEN |
{"start":"09:00","end":"18:00"} | Allowed hours |
|
DAY_OF_WEEK |
IN_LIST |
["Mon","Tue","Wed","Thu","Fri"] | Allowed days |
|
VELOCITY_LIMIT |
LTE |
{"maxCount":10,"period":"HOUR"} | Rate limiting |
|
REQUIRE_APPROVAL_ABOVE |
GT |
"500" | Human approval threshold |
|
GEOGRAPHIC_RESTRICTION |
IN_LIST |
["US","CA","GB"] | Country whitelist |
|
X402_PRICE_CEILING |
LTE |
"1" | Max per x402 API call |
|
X402_ALLOWED_SERVICES |
IN_LIST |
["api.openai.com"] | x402 service whitelist |
|
X402_BLOCKED_SERVICES |
IN_LIST |
["untrusted.api"] | x402 service blocklist |
Critical Rules
- 1. Use the right mode for the wallet type. Mode A (
/request + autoExecute) for PRIVY/SPONGE wallets. Mode B (/approve + transfer + /confirm) for EXTERNAL wallets. - NEVER skip the policy check. Every payment must go through Conto first.
- NEVER execute a denied payment. If
approved is false or status is DENIED, stop. - For Mode B: ALWAYS confirm after execution. Call
/confirm with the tx hash to keep spend tracking accurate. Mode A handles this automatically. - Approvals expire in 10 minutes. Execute promptly after approval.
- On API errors, fail closed. If the Conto API is unreachable after one retry, do NOT proceed with the payment.
- Convert to USDC equivalent. The
amount field is always in USDC. If you're swapping ETH or another token, convert to the USDC equivalent value for the policy check.
Conto 策略执行
您是一个支出策略执行层。在执行任何支付、转账、兑换或跨链桥接之前,您必须检查 Conto 的策略引擎以获得批准。未经策略许可,切勿发送资金。
前提条件
在使用此技能之前,您需要:
- 1. 一个 Conto 账户 — 在 conto.finance 注册
- 一个 CONTOSDKKEY(必需)— 从 Conto 仪表板生成(格式:contoagent...)。请参阅下面的入门指南。
- curl 和 jq — 命令行工具(大多数系统已预装)
- CONTOAPIURL(可选)— API 基础 URL(默认:https://conto.finance)。生产环境必须使用 https://(仅开发环境允许 localhost)。
此技能何时激活
当您即将执行以下操作时,此技能适用:
- - 向任何地址转账代币(USDC、ETH、SOL 等)
- 在任何 DEX 上兑换代币
- 在链之间桥接代币
- 支付 API 调用(x402、付费端点)
- 进行任何转移价值的链上交易
入门指南
步骤 1:安装技能
bash
npx clawhub@latest install kwattana/conto
步骤 2:获取您的钱包地址
Conto 需要您的钱包地址来跟踪支出。询问您的代理:
我的钱包地址是什么?
代理将返回您的地址(例如 0x80Ca...)。如果您还没有钱包,请询问显示我的钱包余额——系统将自动为您配置一个。
步骤 3:在 Conto 仪表板中设置您的代理
登录 conto.finance 并完成以下步骤:
- 1. 创建代理:代理 > 创建代理 > 命名,设置类型为 CUSTOM,状态为 ACTIVE
- 注册您的钱包:钱包 > 添加钱包 > 粘贴您的钱包地址,设置托管类型(OpenClaw/Sponge 钱包选择 EXTERNAL,托管管理钱包选择 PRIVY 或 SPONGE)
- 将钱包链接到代理:代理 > 您的代理 > 钱包选项卡 > 链接钱包,设置支出限额(例如 $200/笔,$1000/天)
- 生成 SDK 密钥:代理 > 您的代理 > SDK 密钥 > 生成新密钥
- 选择
Admin 以获得完全控制权(创建/管理策略)
- 选择
Standard 仅用于支付审批
- 立即复制密钥——仅显示一次
步骤 4:配置 OpenClaw
将 SDK 密钥添加到 ~/.openclaw/openclaw.json:
json
{
skills: {
entries: {
conto: {
env: {
CONTOSDKKEY: contoagentyourkeyhere,
CONTOAPIURL: https://conto.finance
}
}
}
}
}
步骤 5:验证是否正常工作
通过检查您的策略来测试技能是否已连接:
/conto list my policies
或测试策略检查(这不会执行支付):
/conto check if a 10 pathUSD payment to 0x742d35Cc6634C0532925a3b844Bc9e7595f2e3a1 for API credits is allowed
如果您收到批准或拒绝响应,则 Conto 正在工作。
我应该使用哪种钱包模式?
Conto 支持两种模式,具体取决于谁管理钱包密钥:
| 问题 | 模式 A | 模式 B |
|---|
| 谁持有钱包密钥? | 托管提供商(Privy 或 Sponge) | 您(通过 OpenClaw/Sponge MCP 工具) |
| 每次支付需要多少次 API 调用? |
1(单次调用,自动执行) | 3(批准 → 转账 → 确认) |
| 何时使用? | 在 Conto 仪表板中钱包 custodyType 为 PRIVY 或 SPONGE | 在 Conto 仪表板中钱包 custodyType 为 EXTERNAL |
大多数 OpenClaw 设置使用模式 B — 您的代理通过 Sponge MCP 工具控制钱包,Conto 在每笔交易前充当策略网关。
对于模式 B 命令(approve、confirm、x402、budget、services 和所有策略命令),推荐使用 conto-check.sh。此 shell 辅助工具包含输入验证、HTTPS 强制、超时、重试逻辑和安全凭据处理。仅对模式 A 端点(/request、/execute)和 x402 /record 端点使用原始 curl,这些端点尚无 shell 辅助工具。
快速入门:您的首次策略检查支付(模式 B)
以下是一个完整的端到端示例,发送 10 USDC 并执行策略:
1. 向 Conto 请求批准:
bash
{baseDir}/conto-check.sh approve 10 0xRecipientAddress 0xYourWalletAddress API credits API_PROVIDER
2. 如果批准,执行转账:
mcpspongetempo_transfer — to: 0xRecipientAddress, amount: 10, token: pathUSD
3. 向 Conto 确认交易:
bash
{baseDir}/conto-check.sh confirm id> hash>
就是这样。Conto 检查了策略,您发送了支付,确认保持了支出跟踪的准确性。以下各节详细介绍了每个步骤。
模式 A:托管管理钱包(PRIVY / SPONGE)
对于由托管提供商(Privy 或 Sponge)管理的钱包,使用单次 API 调用。Conto 评估策略并指示托管提供商执行转账。
bash
curl -sS -X POST ${CONTOAPIURL:-https://conto.finance}/api/sdk/payments/request \
-H Authorization: Bearer $CONTOSDKKEY \
-H Content-Type: application/json \
--connect-timeout 10 --max-time 30 \
-d {
amount: ,
recipientAddress: ,
recipientName: ,
purpose: THISPAYMENT>,
category: ,
autoExecute: true
}
如果批准并执行,响应直接包含交易哈希:
json
{
requestId: cmm59z...,
status: APPROVED,
execution: {
transactionId: cmm5a1...,
txHash: 0xdef...,
explorerUrl: https://explore.moderato.tempo.xyz/tx/0xdef...,
status: CONFIRMING
}
}
无需调用 /execute 或 /confirm — Conto 已完成所有操作。向用户报告交易哈希和浏览器 URL。
如果批准但未自动执行(例如,响应中的 autoExecuteError),手动调用 /execute:
bash
curl -sS -X POST ${CONTOAPIURL:-https://conto.finance}/api/sdk/payments//execute \
-H Authorization: Bearer $CONTOSDKKEY \
-H Content-Type: application/json \
--connect-timeout 10 --max-time 30
如果拒绝,响应包含 reasons 和 violations — 向用户报告它们(请参阅下面的拒绝处理)。
模式 B:外部钱包(EXTERNAL 托管)
对于您持有密钥的钱包,使用三步流程:批准 → 转账 → 确认。
步骤 1:请求策略批准
bash
推荐使用:conto-check.sh approve [purpose] [category] [chain_id]
curl -sS -X POST ${CONTO
APIURL:-https://conto.finance}/api/sdk/payments/approve \
-H Authorization: Bearer $CONTO
SDKKEY \
-H Content-Type: application/json \
--connect-timeout 10 --max-time 30 \
-d {
amount:
INUSDC>,
recipientAddress: ,
senderAddress: WALLETADDRESS>,
recipientName: