Skip to main content

AI Agents in PAY.ID

PAY.ID supports AI-powered payment agents — autonomous or semi-autonomous services that can evaluate and execute payments on behalf of users, subject to on-chain policy enforcement.

This is not "AI replacing wallets." It is delegated execution with cryptographic guardrails: the AI can propose transactions, but the on-chain contract enforces the user's policy before any funds move.


Architecture

┌─────────────────┐     ┌──────────────────┐     ┌─────────────────┐
│ AI Service │────▶│ AIAgentRule │────▶│ User's Policy │
│ (off-chain) │ │ Manager │ │ (combined rule) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
Proposes tx Validates agent ALLOW / REJECT
+ proof subscription status

Key insight: The AI never holds user funds. It generates a Decision Proof (same EIP-712 flow as normal payments), and the user's policy (Combined Rule) decides whether to ALLOW or REJECT.


Smart Contracts

ContractPurpose
AIAgentRegistryRegister admin agents with metadata (name, endpoint, description, root rule hash)
AIAgentRuleManagerLink agents to combined rule policies, handle subscriptions, preferred agent selection
AgentPayIDExecute agent-initiated payments with proof verification
CombinedRuleStorageStore the actual rule set hash that the agent must follow

Agent Lifecycle

1. Register an Agent (Admin)

Register your AI service so users can discover and subscribe to it.

import { useCreateAIAgent } from 'payid-react'

function RegisterAgent() {
const { createAgent, isPending } = useCreateAIAgent()

const handleRegister = () => {
createAgent({
agentWallet: '0xAgentWalletAddress...',
name: 'MyAI Assistant',
endpoint: 'https://api.myai.com/v1/pay',
description: 'AI agent for automated bill payments',
rootRuleHash: '0x...', // Hash of the agent's base rule config
})
}

return <button onClick={handleRegister} disabled={isPending}>Register Agent</button>
}

2. Set Agent Policy (Owner)

Link an agent to a Combined Rule (your payment policy). The agent can only execute payments that pass this rule.

import { useSetAgentCombinedRule } from 'payid-react'
import { keccak256, toBytes } from 'viem'

function SetAgentPolicy() {
const { setAgentCombinedRule, isPending } = useSetAgentCombinedRule()

const handleSetPolicy = () => {
// Your combined rule hash from CombinedRuleStorage
const ruleSetHash = keccak256(toBytes(JSON.stringify(myRuleConfig)))

setAgentCombinedRule(
'0xAgentWalletAddress...', // agent to authorize
ruleSetHash // policy the agent must follow
)
}

return <button onClick={handleSetPolicy} disabled={isPending}>Set Agent Policy</button>
}

3. Subscribe to an Agent (User)

Users must subscribe (pay a small fee) before an agent can act on their behalf.

import { useSubscribeToAgent, useAgentSubscriptionPrice } from 'payid-react'

function SubscribeToAgent({ agentAddress }: { agentAddress: Address }) {
const { data: price } = useAgentSubscriptionPrice()
const { subscribeToAgent, isPending } = useSubscribeToAgent()

const handleSubscribe = () => {
if (!price) return
subscribeToAgent({ agent: agentAddress, value: price })
}

return (
<button onClick={handleSubscribe} disabled={isPending}>
Subscribe ({price ? formatEther(price) : '...'} ETH)
</button>
)
}

4. Set Preferred Agent (User)

Users choose their default agent for automated payments.

import { useSetPreferredAgent } from 'payid-react'

function SetPreferredAgent({ agentAddress }: { agentAddress: Address }) {
const { setPreferredAgent, isPending } = useSetPreferredAgent()

return (
<button onClick={() => setPreferredAgent(agentAddress)} disabled={isPending}>
Set as Preferred Agent
</button>
)
}

React Hooks Reference

Read Hooks

HookReturnsDescription
useAdminAIAgent(address)AdminAgentSingle agent metadata from registry
useAllAdminAIAgents(options?)AdminAgent[]List all registered agents
useAgentCombinedRule(agent)AgentRuleInfoActive policy hash for an agent
useEffectiveAgentRule(user){ ruleSetHash, agent }User's effective rule + agent
usePreferredAgent(user)AddressUser's preferred agent address
useAgentSubscription(user, agent)AgentSubscriptionSubscription status + expiry
useIsSubscribedToAgent(user, agent)booleanQuick subscription check
useAllAgentsWithRules()AgentWithRule[]All agents that have policies set
useAgentSubscriptionPrice()bigintCurrent subscription fee

Write Hooks

HookActionDescription
useCreateAIAgent()createAgent(...)Register a new AI agent
useSetAgentCombinedRule()setAgentCombinedRule(agent, hash)Link agent to policy
useUnsetAgentCombinedRule()unset(agent)Remove agent policy
useSubscribeToAgent()subscribeToAgent({ agent, value })Subscribe user to agent
useUnsubscribeFromAgent()unsubscribeFromAgent(agent)Cancel subscription
useSetPreferredAgent()setPreferredAgent(agent)Set default agent
useToggleAgentStatus()toggleStatus(agent)Activate/deactivate agent

Security Model

  1. Fail-closed by default — If no policy is set, the agent cannot execute any payments.
  2. Subscription required — Users must actively subscribe (and pay) before delegation is active.
  3. Policy-bound — The agent can only propose transactions that satisfy the user's Combined Rule.
  4. Proof-based — Every agent-initiated payment still requires a valid EIP-712 Decision Proof.
  5. Owner override — Agent policy can only be set by the agent owner or admin registry.

Example: Complete Agent Flow

import { usePayIDFlow } from 'payid-react'

// The AI service calls this after evaluating user's policy off-chain
async function executeAgentPayment(
agentWallet: Address,
receiver: Address,
amount: bigint,
asset: Address
) {
const { execute, status } = usePayIDFlow()

// 1. AI loads user's effective rule from AIAgentRuleManager
// 2. AI evaluates the payment context with WASM rule engine
// 3. If ALLOW, AI generates EIP-712 Decision Proof (signed by agent)
// 4. Submit through AgentPayID contract

await execute({
receiver,
amount,
asset,
// ... other params
})
}

Contract Addresses

See Contract Addresses → for deployed addresses per chain.

Key contracts for AI Agent functionality:

  • AIAgentRegistry
  • AIAgentRuleManager
  • AgentPayID
  • CombinedRuleStorage

Next Steps