This is exciting! The very first feature request we received after launching was AgentKit compatibility.

Smart402Guard in 0.1.0 required a signer argument, specifically an eth_account LocalAccount object. This doesn't work if you're using AgentKit's CdpEvmWalletProvider, Privy, or any other managed wallet provider.

Removing the "black box" risk from AI agent payments is the whole point of smart402: you may never be 100% sure what drove your agent's last decision, but you can be 100% sure smart402's rules will fire exactly as configured, every time. Managed wallets are a huge part of how developers are building x402 agents today, so this made sense as an immediate fix.

What changed

Smart402Guard now takes wallet_address as a plain string. Any wallet that can return an EVM address works.

Before (0.1.0):

guard = Smart402Guard(api_key="...", agent_id="...", signer=account)

After (0.2.0):

guard = Smart402Guard(api_key="...", agent_id="...", wallet_address=wallet.address)
x402_client.on_before_payment_creation(guard.as_hook())

We also shipped as_hook(), which returns the async callback for x402's on_before_payment_creation. The equivalent in 0.1.0 — httpx_client() — raised NotImplementedError. It was never usable. as_hook() is.

smart402_hook(), Smart402Client, and all models are untouched.

TypeScript

Version bump to 0.2.0. createSmart402Guard already took agentWalletAddress as a string in 0.1.0, so nothing changes for TypeScript users.

If you're building with AgentKit

Pull the address from your wallet provider and pass it as a string. That's it.

pip install --upgrade smart402

We're building alongside the x402 ecosystem and AgentKit is clear use case. If something feels rough, open an issue on GitHub or email rob@smart402.com.

Full changelog on GitHub. Get started at smart402.com.

Frequently asked questions

What managed wallets does smart402 0.2.0 support?

Any wallet that can return an EVM address string, including Coinbase AgentKit's CdpEvmWalletProvider, Privy, Turnkey, and self-custodied EOAs. The signer requirement is gone. Pass wallet_address as a plain string and you're good.

Does this change affect TypeScript users?

No. createSmart402Guard already accepted agentWalletAddress as a string in 0.1.0. The TypeScript SDK bumps to 0.2.0 for version alignment only.

Where does smart402 sit in the x402 payment flow?

smart402 intercepts the payment request before it reaches the facilitator. It evaluates the transaction against your configured policy rules (amount limits, counterparty allowlists, budget windows) and returns an approve or deny decision in under 100ms. No LLM in the path. Same inputs always produce the same output.

What is smart402?

smart402 is a deterministic policy engine for x402 payments. It sits between your agent and any x402-protected API, enforcing rules you configure and version-control like code. No model makes the payment decision, which means no prompt injection can talk it out of one.

Previous post All posts