PayClaw tools for LlamaIndex — give your FunctionAgent / ReActAgent a USDC wallet on Base it can actually spend. Gasless via Circle Paymaster.
Project description
llama-index-tools-payclaw
Give your LlamaIndex
FunctionAgent/ReActAgenta USDC wallet on Base it can actually spend. Gasless via Circle Paymaster. No ETH required. 1% flat fee. No KYC.
llama-index-tools-payclaw ships three production-grade
LlamaIndex tools that let any agent read its
USDC balance, send USDC to any address on Base mainnet, and inspect on-chain
transaction history.
Async-native, follows the official llama-index-tools-* namespace
convention, plays cleanly with FunctionAgent, ReActAgent, AgentWorkflow,
and any tool-calling LlamaIndex agent.
Install
pip install llama-index-tools-payclaw
# Plus an LLM provider for the quickstart below
pip install llama-index-llms-openai
Auth
Set your PayClaw API token in the environment:
export PAYCLAW_API_TOKEN="..."
Or pass it explicitly to each tool factory:
payclaw_balance_tool(api_token="...").
Need a token? Each PayClaw wallet ships with its own Bearer token. The current public POC uses a single shared demo token — production replaces this with per-user OAuth. See payclaw.me.
Quickstart — FunctionAgent with all three tools
import asyncio
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI
from llama_index.tools.payclaw import PayClawToolSpec
async def main():
spec = PayClawToolSpec()
agent = FunctionAgent(
tools=spec.to_tool_list(),
llm=OpenAI(model="gpt-4o-mini"),
system_prompt=(
"You are a payments agent on Base mainnet. "
"You manage a USDC wallet you can read from and spend from. "
"Before any transfer, restate the recipient and amount. "
"After any transfer, surface the Basescan explorer URL as proof. "
"Never invent addresses. If unsure, ask."
),
)
result = await agent.run(
user_msg="What's my balance? If at least 0.10 USDC, send 0.05 USDC "
"to 0x000000000000000000000000000000000000dEaD."
)
print(result)
asyncio.run(main())
ReActAgent (chain-of-thought style)
from llama_index.core.agent.workflow import ReActAgent
from llama_index.llms.openai import OpenAI
from llama_index.tools.payclaw import (
payclaw_balance_tool,
payclaw_pay_tool,
payclaw_history_tool,
)
agent = ReActAgent(
tools=[payclaw_balance_tool(), payclaw_pay_tool(), payclaw_history_tool()],
llm=OpenAI(model="gpt-4o"),
verbose=True,
)
Pick a subset of tools
If you want a read-only agent (no spending), just include balance_tool and
history_tool. If you want a write-only agent that delegates funding checks
to humans, include only pay_tool. Mix and match per your security posture.
from llama_index.tools.payclaw import payclaw_balance_tool, payclaw_history_tool
read_only_tools = [payclaw_balance_tool(), payclaw_history_tool()]
Direct client (no LlamaIndex)
PayClawClient is exported for hooks, observability, or unit tests:
import asyncio
from llama_index.tools.payclaw import PayClawClient
async def main():
client = PayClawClient() # reads PAYCLAW_API_TOKEN
print(await client.get_balance())
receipt = await client.pay(to="0x...", amount="0.05")
print(receipt["txHash"])
asyncio.run(main())
The tools
payclaw_balance_tool() -> FunctionTool
Wraps an async payclaw_get_balance() function. Read-only. Returns a JSON
string:
{
"address": "0x567849BBEB2da9475F3EB0871Ad7C4CeA8738740",
"signerAddress": "0x7371d193516BAb191fE99d7149Ed47f8bCBd42f7",
"usdc": "2.01",
"usdcRaw": "2010000",
"chain": "base-mainnet",
"explorer": "https://basescan.org/address/0x567849..."
}
payclaw_pay_tool() -> FunctionTool
Wraps an async payclaw_pay(to, amount). Required args. Returns:
{
"txHash": "0xa36a...4528",
"status": "confirmed",
"amountSent": "0.05",
"feeCharged": "0.0005",
"gasPaidInUsdc": "0.0123",
"smartAccountAddress": "0x567849...",
"explorer": "https://basescan.org/tx/0xa36a...4528"
}
The first send from a new wallet auto-deploys the smart account on-chain (adds ~20-30 s to the first call). All gas is paid in USDC via Circle Paymaster. No ETH is ever required.
payclaw_history_tool() -> FunctionTool
Wraps an async payclaw_get_history(limit=10). Read-only. Returns recent
in/out USDC transfers over the last ~28 hours.
PayClawToolSpec
Convenience class — call .to_tool_list() to get all three tools at once
sharing the same config (api_token, base_url, timeouts).
Why PayClaw
Every existing way to give an agent a wallet has the same defect: it needs ETH for gas. So you end up running an ETH-funding cron, or you bail and use a custodial API and lose the whole point of agent-owned funds.
PayClaw uses ERC-4337 v0.7 + Circle Paymaster: the agent's smart account spends USDC and the paymaster pays the bundler in USDC on its behalf. Your agent only ever holds and spends one asset.
| Agent wallet (vanilla) | Custodial API | PayClaw | |
|---|---|---|---|
| Holds its own funds | ✅ | ❌ | ✅ |
| Needs ETH for gas | ❌ | n/a | ✅ |
| KYC required | ❌ | ✅ | ❌ |
| 1 line to integrate | ❌ | ❌ | ✅ |
Errors
Tool functions catch PayClawError and return a string the LLM can reason
about — input-validation errors are also returned as strings prefixed with
PayClaw input error: so the agent can correct itself rather than crash.
HTTP status codes:
400— bad input (invalid address, amount below dust threshold)401— invalid bearer token429— rate-limited (only on first deploy from an empty wallet — fund the wallet to bypass)502— paymaster or RPC failure
If you want to handle errors yourself, drop down to PayClawClient and
catch PayClawError directly.
Compatibility
- Python ≥ 3.9
llama-index-core >= 0.12, < 1.0pydantic >= 2.7httpx >= 0.27
License
MIT — see LICENSE.
Links
- Website: https://payclaw.me
- LangChain version:
langchain-payclaw - CrewAI version:
crewai-payclaw - AutoGen version:
autogen-payclaw - Vercel AI SDK (TypeScript):
@grip-labs/payclaw-ai - SDK + MCP: https://github.com/ONSARI/payclaw-skill
- Issues: https://github.com/ONSARI/payclaw-skill/issues
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file llama_index_tools_payclaw-0.1.0.tar.gz.
File metadata
- Download URL: llama_index_tools_payclaw-0.1.0.tar.gz
- Upload date:
- Size: 9.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
326c0f50097ff7d7b633aa54afed537b1c5ab52528bf6a157cd0839203498cd9
|
|
| MD5 |
9374de91ed96860d385fe10c99457d0d
|
|
| BLAKE2b-256 |
9c4010b579ce1227e9c2ae5a45d51c73515fc3a0d5bbf7325480f49c1ca3b81c
|
File details
Details for the file llama_index_tools_payclaw-0.1.0-py3-none-any.whl.
File metadata
- Download URL: llama_index_tools_payclaw-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
125a91bd8273ac1ca8ed117478b1f3eb1126c660382b6a161749c70a93f0274a
|
|
| MD5 |
de027bc8c2b8af269b3ba027f9717895
|
|
| BLAKE2b-256 |
ad52f60052bcfcf1ed5139448e3f36d2bc19f9fa1712fdaa58d5ca7c76582e66
|