@chainpearc/sdk 0.0.0-stage → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/chainpe.ts","../src/networks.ts","../src/discovery.ts","../src/registry.ts","../src/reputation.ts","../src/types.ts","../src/policyvault.ts"],"sourcesContent":["/**\n * ChainPe — x402 payments on Arc, service discovery and ERC-8004 reputation.\n *\n * const cp = new ChainPe({ privateKey })\n * const res = await cp.fetch('https://api.example.com/paid') // auto-pays a 402\n * const data = await res.json()\n */\nimport { erc20Abi, formatUnits, parseUnits, getAddress, type Address } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { ExactEvmScheme } from '@x402/evm/exact/client'\nimport {\n decodePaymentResponseHeader,\n wrapFetchWithPaymentFromConfig,\n type PaymentPolicy\n} from '@x402/fetch'\nimport { isBatchPayment } from '@circle-fin/x402-batching'\nimport {\n BatchEvmScheme,\n CompositeEvmScheme,\n GatewayClient\n} from '@circle-fin/x402-batching/client'\nimport {\n assertNetwork,\n getCaip2,\n getGatewayChain,\n getUsdcAddress,\n normalizeKey,\n publicClientFor,\n resolveAccountsAddress,\n resolveReputationRegistry,\n rpcUrlFor,\n USDC_DECIMALS\n} from './networks.js'\nimport { discoverServices } from './discovery.js'\nimport { RegistryClient } from './registry.js'\nimport { getReputation, giveFeedback } from './reputation.js'\nimport type {\n Balances,\n ChainPeNetwork,\n ChainPeOptions,\n DiscoverOptions,\n FetchOptions,\n PaidResponse,\n PaidResult,\n PaymentInfo,\n PaymentRail,\n RankedService,\n ReputationSummary\n} from './types.js'\nimport { ChainPePaymentError } from './types.js'\n\nconst DEFAULT_RAILS: PaymentRail[] = ['gateway', 'exact']\nconst AGENT_ID_HEADER = 'x-chainpe-agent-id'\nconst TX_HASH = /^0x[0-9a-fA-F]{64}$/\nconst DEFAULT_TIMEOUT_MS = 30_000\n\ntype Requirement = Parameters<PaymentPolicy>[1][number]\n\n/**\n * Keeps the options of the first usable rail. Gateway only counts when the\n * deposit covers the price, so a wallet with no deposit falls back to `exact`.\n */\nexport function railPolicy(\n rails: PaymentRail[],\n gatewayAvailable: bigint\n): PaymentPolicy {\n return (_version, requirements) => {\n for (const rail of rails) {\n const options =\n rail === 'gateway'\n ? requirements.filter(\n r => isBatchPayment(r) && BigInt(r.amount) <= gatewayAvailable\n )\n : requirements.filter(r => !isBatchPayment(r))\n if (options.length > 0) return options\n }\n return []\n }\n}\n\nexport class ChainPe {\n readonly network: ChainPeNetwork\n readonly rails: PaymentRail[]\n readonly accountsAddress?: `0x${string}`\n readonly reputationRegistry: `0x${string}`\n\n private readonly privateKey: `0x${string}`\n private readonly account: Address\n private readonly maxPerCallAtomic: bigint\n private readonly autoFeedback: boolean\n private gatewayClient?: GatewayClient\n\n constructor(options: ChainPeOptions) {\n if (!options.privateKey) {\n throw new Error('ChainPe: `privateKey` is required.')\n }\n this.privateKey = normalizeKey(options.privateKey)\n this.network = assertNetwork(options.network ?? 'arc-testnet')\n this.rails = options.rails?.length ? options.rails : DEFAULT_RAILS\n for (const rail of this.rails) {\n if (rail !== 'gateway' && rail !== 'exact') {\n throw new Error(`Invalid rail \"${String(rail)}\" (expected gateway or exact).`)\n }\n }\n this.accountsAddress = resolveAccountsAddress(this.network, options.accountsAddress)\n this.reputationRegistry = resolveReputationRegistry(\n this.network,\n options.reputationRegistry\n )\n this.account = privateKeyToAccount(this.privateKey).address\n this.maxPerCallAtomic = parseUnits(options.maxPerCall ?? '1', USDC_DECIMALS)\n this.autoFeedback = options.autoFeedback ?? false\n }\n\n /** Echoes the resolved configuration (no secrets). */\n get config() {\n return {\n network: this.network,\n address: this.account,\n rails: this.rails,\n accountsAddress: this.accountsAddress,\n reputationRegistry: this.reputationRegistry,\n maxPerCall: formatUnits(this.maxPerCallAtomic, USDC_DECIMALS)\n }\n }\n\n /** The wallet address that signs payments and feedback. */\n getAddress(): string {\n return this.account\n }\n\n /** Reads the wallet's USDC and the Circle Gateway deposit (human units). */\n async balance(): Promise<Balances> {\n const usdc = (await publicClientFor(this.network).readContract({\n address: getUsdcAddress(this.network),\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: [getAddress(this.account)]\n })) as bigint\n return {\n usdc: formatUnits(usdc, USDC_DECIMALS),\n gateway: formatUnits(await this.gatewayAvailable(), USDC_DECIMALS)\n }\n }\n\n /** Deposits USDC into Circle Gateway, to pay on the Gateway rail with no gas. */\n async depositGateway(amount: string): Promise<{ txHash: string; amount: string }> {\n if (!/^\\d+(\\.\\d{1,6})?$/.test(amount) || parseUnits(amount, USDC_DECIMALS) <= 0n) {\n throw new Error(`Invalid amount \"${amount}\" (expected positive USDC, e.g. 1.50).`)\n }\n const result = await this.gateway().deposit(amount)\n return { txHash: result.depositTxHash, amount: result.formattedAmount }\n }\n\n /**\n * Drop-in `fetch` that automatically pays an x402 `402 Payment Required` in\n * USDC and returns the final live {@link Response}.\n */\n async fetch(url: string, opts: FetchOptions = {}): Promise<Response> {\n const { result, autoFeedback } = await this.execute(url, opts)\n if (result.payment && (autoFeedback ?? this.autoFeedback)) {\n await this.tryAutoFeedback(url, result.payment.recipient, result.agentId)\n }\n return result.response\n }\n\n /**\n * Like {@link fetch}, but returns the live, unread {@link Response} together\n * with the payment details. Never posts feedback.\n */\n async request(url: string, opts: FetchOptions = {}): Promise<PaidResponse> {\n return (await this.execute(url, opts)).result\n }\n\n /**\n * Like {@link fetch}, but returns a structured, body-parsed result with the\n * payment + (optional) reputation details. Convenient for agents.\n */\n async pay<T = unknown>(\n url: string,\n opts: FetchOptions = {}\n ): Promise<PaidResult<T>> {\n const { result, autoFeedback } = await this.execute(url, opts)\n const { response } = result\n\n let reputation: PaidResult<T>['reputation']\n if (result.payment && (autoFeedback ?? this.autoFeedback)) {\n reputation = await this.tryAutoFeedback(\n url,\n result.payment.recipient,\n result.agentId\n )\n }\n\n const data = (await this.parseBody(response)) as T\n return {\n status: response.status,\n ok: response.ok,\n headers: headersToObject(response.headers),\n data,\n payment: result.payment,\n reputation\n }\n }\n\n /**\n * Finds services through Circle's Discovery API and ChainPeAccounts, annotated\n * with ERC-8004 reputation and ranked. ChainPeAccounts also covers providers\n * Circle has not listed yet. Throws only when neither source can be read.\n */\n async discover(\n query: string | DiscoverOptions = {}\n ): Promise<RankedService[]> {\n return discoverServices(this.network, query, {\n accountsAddress: this.accountsAddress,\n reputationRegistry: this.reputationRegistry\n })\n }\n\n /** Reads a provider agent's aggregate ERC-8004 reputation. */\n async getReputation(agentId: string): Promise<ReputationSummary | null> {\n return getReputation(this.network, this.reputationRegistry, agentId)\n }\n\n /** Posts ERC-8004 feedback (0–100) for a provider agent. Returns the tx hash. */\n async giveFeedback(\n agentId: string,\n score: number,\n opts: { endpoint?: string; tag?: string; waitConfirm?: boolean } = {}\n ): Promise<string> {\n return giveFeedback(this.network, this.reputationRegistry, this.privateKey, {\n agentId,\n value: score,\n ...opts\n })\n }\n\n // ─── internals ─────────────────────────────────────────────────────────────\n\n private gateway(): GatewayClient {\n this.gatewayClient ??= new GatewayClient({\n chain: getGatewayChain(this.network),\n privateKey: this.privateKey,\n rpcUrl: rpcUrlFor(this.network)\n })\n return this.gatewayClient\n }\n\n /** A deposit we cannot read counts as empty, so payment falls back to the wallet. */\n private async gatewayAvailable(): Promise<bigint> {\n try {\n return (await this.gateway().getBalances()).gateway.available\n } catch {\n return 0n\n }\n }\n\n /**\n * Runs the x402 flow: request → on 402, cap the price, choose a rail, sign →\n * retry. Spend limits run before anything is signed.\n */\n private async execute(\n url: string,\n opts: FetchOptions\n ): Promise<{ result: PaidResponse; autoFeedback?: boolean }> {\n const { autoFeedback, timeout = DEFAULT_TIMEOUT_MS, ...init } = opts\n\n let selected: Requirement | undefined\n let agentId: string | undefined\n let gatewayAvailable = 0n\n\n const baseFetch: typeof fetch = async (input, requestInit) => {\n const caller = requestInit?.signal ?? (input instanceof Request ? input.signal : undefined)\n const expiry = AbortSignal.timeout(timeout)\n const response = await fetch(input, {\n ...requestInit,\n signal: caller ? AbortSignal.any([caller, expiry]) : expiry\n })\n agentId = response.headers.get(AGENT_ID_HEADER) ?? agentId\n // Only a request that has to pay spends a call on reading the deposit.\n if (\n response.status === 402 &&\n !selected &&\n this.rails.includes('gateway')\n ) {\n gatewayAvailable = await this.gatewayAvailable()\n }\n return response\n }\n\n const account = privateKeyToAccount(this.privateKey)\n const client = new CompositeEvmScheme(\n new BatchEvmScheme(account),\n new ExactEvmScheme(account)\n )\n const caip2 = getCaip2(this.network) as `${string}:${string}`\n const payingFetch = wrapFetchWithPaymentFromConfig(baseFetch, {\n schemes: [{ network: caip2, client: client as unknown as ExactEvmScheme }],\n // CompositeEvmScheme cannot name default assets, so Arc USDC is listed with its own cap.\n spendControls: {\n maxAmountPerPayment: false as const,\n allowedAssets: [\n {\n network: caip2,\n asset: getUsdcAddress(this.network),\n maxAmountPerPayment: this.maxPerCallAtomic.toString()\n }\n ]\n },\n policies: [\n (version, requirements) => {\n const options = railPolicy(this.rails, gatewayAvailable)(version, requirements)\n selected = options[0]\n return options\n }\n ]\n })\n\n let response: Response\n try {\n response = await payingFetch(url, init)\n } catch (err) {\n throw this.explainPaymentError(err, url)\n }\n\n if (response.status === 402) {\n const reason = await readFailureReason(response)\n throw new ChainPePaymentError(\n `x402: payment signed but the server did not accept it (${reason}). ` +\n `Check the USDC on ${this.network} or the Gateway deposit.`,\n { reason }\n )\n }\n return {\n result: {\n response,\n payment: selected ? this.paymentInfo(selected, response) : undefined,\n agentId\n },\n autoFeedback\n }\n }\n\n private paymentInfo(selected: Requirement, response: Response): PaymentInfo {\n const payment: PaymentInfo = {\n amount: formatUnits(BigInt(selected.amount), USDC_DECIMALS),\n recipient: selected.payTo,\n network: this.network,\n rail: isBatchPayment(selected) ? 'gateway' : 'exact'\n }\n const header = response.headers.get('PAYMENT-RESPONSE')\n if (header) {\n try {\n const receipt = decodePaymentResponseHeader(header)\n payment.settlement = receipt\n if (TX_HASH.test(receipt.transaction)) payment.txHash = receipt.transaction\n else if (receipt.transaction) payment.transferId = receipt.transaction\n } catch {\n /* Keep what is known without the receipt. */\n }\n }\n return payment\n }\n\n private explainPaymentError(err: unknown, url: string): unknown {\n const message = err instanceof Error ? err.message : String(err)\n if (/no network\\/scheme registered/i.test(message)) {\n return new Error(`x402: ${url} does not accept payment on ${this.network}.`)\n }\n if (/spend|maxAmountPerPayment|allowedAssets|exceed/i.test(message)) {\n return new Error(\n `x402: the price for ${url} exceeds maxPerCall ` +\n `${formatUnits(this.maxPerCallAtomic, USDC_DECIMALS)} USDC. Nothing was signed.`\n )\n }\n if (/filtered|policy|policies/i.test(message)) {\n return new ChainPePaymentError(\n `x402: ${url} has no payment option for rails [${this.rails.join(', ')}]. ` +\n 'A Gateway-only price needs a Gateway deposit.',\n { reason: 'no_usable_rail' }\n )\n }\n return err\n }\n\n /**\n * Best-effort positive feedback for the provider's agent after a paid call.\n * Prefers the agent id the provider advertises; otherwise looks for its `payTo`\n * in ChainPeAccounts. Never throws (self-feedback, no gas, etc. are swallowed).\n */\n private async tryAutoFeedback(\n url: string,\n payTo: string,\n advertisedAgentId?: string\n ): Promise<{ agentId: string; score: number; txHash: string } | undefined> {\n try {\n let agentId = advertisedAgentId\n if ((!agentId || agentId === '0') && this.accountsAddress) {\n const registry = new RegistryClient(this.network, this.accountsAddress)\n const services = await registry.listAllServices()\n agentId = services.find(\n s => s.walletAddress.toLowerCase() === payTo.toLowerCase() && s.agentId\n )?.agentId\n }\n if (!agentId || agentId === '0') return undefined\n const txHash = await giveFeedback(\n this.network,\n this.reputationRegistry,\n this.privateKey,\n {\n agentId,\n value: 100,\n endpoint: new URL(url).origin,\n tag: 'x402-success'\n }\n )\n return { agentId, score: 100, txHash }\n } catch {\n return undefined\n }\n }\n\n private async parseBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get('content-type') ?? ''\n if (contentType.includes('application/json')) {\n try {\n return await response.json()\n } catch {\n return null\n }\n }\n return response.text()\n }\n}\n\nasync function readFailureReason(response: Response): Promise<string> {\n const header = response.headers.get('PAYMENT-RESPONSE')\n if (header) {\n try {\n const receipt = decodePaymentResponseHeader(header)\n if (receipt.errorReason) return receipt.errorReason\n } catch {\n /* Fall through to the body. */\n }\n }\n try {\n const body = (await response.clone().json()) as { reason?: string; error?: string }\n return body.reason ?? body.error ?? 'settlement refused'\n } catch {\n return 'settlement refused'\n }\n}\n\nfunction headersToObject(headers: Headers): Record<string, string> {\n const obj: Record<string, string> = {}\n headers.forEach((value, key) => {\n obj[key] = value\n })\n return obj\n}\n","/**\n * Network constants for Circle's Arc.\n *\n * Arc pays gas in USDC. The native balance has 18 decimals while the ERC-20\n * interface at the USDC address has 6, so amounts always go through the ERC-20.\n */\nimport { createPublicClient, http, getAddress, type Chain, type PublicClient } from 'viem'\nimport { arc, arcTestnet } from 'viem/chains'\nimport type { ChainPeNetwork } from './types.js'\n\nexport const USDC_DECIMALS = 6\n\nconst ARC_USDC = '0x3600000000000000000000000000000000000000' as const\n\ninterface NetworkInfo {\n chain: Chain\n caip2: string\n gatewayChain: 'arcTestnet' | 'arc'\n rpcUrl: () => string\n explorer: string\n /** ChainPeAccounts, where it is deployed. */\n accounts?: `0x${string}`\n reputation: `0x${string}`\n}\n\nconst NETWORKS: Record<ChainPeNetwork, NetworkInfo> = {\n 'arc-testnet': {\n chain: arcTestnet,\n caip2: 'eip155:5042002',\n gatewayChain: 'arcTestnet',\n rpcUrl: () => process.env.ARC_TESTNET_RPC_URL ?? 'https://rpc.testnet.arc.io',\n explorer: 'https://explorer.testnet.arc.io',\n accounts: '0xD315322c9D83A6f50A04236A2a242e0259bfB580',\n reputation: '0x8004B663056A597Dffe9eCcC1965A193B7388713'\n },\n arc: {\n chain: arc,\n caip2: 'eip155:5042',\n gatewayChain: 'arc',\n rpcUrl: () => process.env.ARC_RPC_URL ?? 'https://rpc.mainnet.arc.io',\n explorer: 'https://explorer.arc.io',\n reputation: '0x8004BAa17C55a88189AE136b182e5fdA19dE9b63'\n }\n}\n\nfunction info(network: ChainPeNetwork): NetworkInfo {\n if (!Object.hasOwn(NETWORKS, network)) {\n throw new Error(`Invalid network \"${network}\" (expected arc-testnet or arc).`)\n }\n return NETWORKS[network]\n}\n\n/** Validates a network name. Throws on anything but an Arc network. */\nexport function assertNetwork(network: ChainPeNetwork): ChainPeNetwork {\n info(network)\n return network\n}\n\nexport function getCaip2(network: ChainPeNetwork): string {\n return info(network).caip2\n}\n\nexport function getGatewayChain(network: ChainPeNetwork): 'arcTestnet' | 'arc' {\n return info(network).gatewayChain\n}\n\nexport function rpcUrlFor(network: ChainPeNetwork): string {\n return info(network).rpcUrl()\n}\n\nexport function explorerFor(network: ChainPeNetwork): string {\n return info(network).explorer\n}\n\n/** Arc's USDC, through its 6-decimal ERC-20 interface. */\nexport function getUsdcAddress(network: ChainPeNetwork): `0x${string}` {\n info(network)\n return ARC_USDC\n}\n\nexport function chainFor(network: ChainPeNetwork): Chain {\n const { chain, explorer } = info(network)\n return {\n ...chain,\n rpcUrls: { default: { http: [rpcUrlFor(network)] } },\n blockExplorers: { default: { name: 'Arc Explorer', url: explorer } }\n }\n}\n\nexport function publicClientFor(network: ChainPeNetwork): PublicClient {\n return createPublicClient({\n chain: chainFor(network),\n transport: http(rpcUrlFor(network))\n })\n}\n\n/** ChainPeAccounts: explicit arg → env → built-in. Undefined where it is not deployed. */\nexport function resolveAccountsAddress(\n network: ChainPeNetwork,\n explicit?: string\n): `0x${string}` | undefined {\n const candidate =\n explicit ?? process.env.CHAINPE_ACCOUNTS_ADDRESS ?? info(network).accounts\n return candidate ? getAddress(candidate) : undefined\n}\n\n/** Arc's ERC-8004 Reputation Registry: explicit arg → env → built-in. */\nexport function resolveReputationRegistry(\n network: ChainPeNetwork,\n explicit?: string\n): `0x${string}` {\n return getAddress(\n explicit ?? process.env.ERC8004_REPUTATION_REGISTRY ?? info(network).reputation\n )\n}\n\nexport function normalizeKey(key: string): `0x${string}` {\n return (key.startsWith('0x') ? key : `0x${key}`) as `0x${string}`\n}\n","/** Searches Circle's Discovery API, the directory behind its Agent Marketplace. No API key needed. */\nimport { formatUnits } from 'viem'\nimport {\n getCaip2,\n resolveAccountsAddress,\n resolveReputationRegistry,\n USDC_DECIMALS\n} from './networks.js'\nimport { RegistryClient, filterServices, rankByReputation } from './registry.js'\nimport { getReputation } from './reputation.js'\nimport type {\n ChainPeNetwork,\n ChainPeService,\n DiscoverOptions,\n PaymentRail,\n RankedService\n} from './types.js'\n\nexport const CIRCLE_DISCOVERY_URL =\n 'https://api.circle.com/v2/x402/discovery/resources'\n\nconst GATEWAY_SCHEME_NAME = 'GatewayWalletBatched'\nconst DEFAULT_LIMIT = 20\n\ninterface CircleAccept {\n network: string\n amount: string\n payTo: string\n extra?: { name?: string }\n}\n\ninterface CircleItem {\n resource: string\n lastUpdated?: string\n accepts?: CircleAccept[]\n metadata?: {\n provider?: {\n name?: string\n description?: string\n category?: string\n tags?: string[]\n }\n method?: string\n description?: string\n }\n}\n\n/** Maps one listing to a service on this network, or undefined if it has no option here. Pure. */\nexport function mapCircleItem(\n item: CircleItem,\n network: ChainPeNetwork\n): ChainPeService | undefined {\n const caip2 = getCaip2(network)\n const accepts = (item.accepts ?? []).filter(a => a.network === caip2)\n if (accepts.length === 0) return undefined\n\n const cheapest = accepts.reduce((low, a) =>\n BigInt(a.amount) < BigInt(low.amount) ? a : low\n )\n const rails: PaymentRail[] = []\n if (accepts.some(a => a.extra?.name === GATEWAY_SCHEME_NAME)) rails.push('gateway')\n if (accepts.some(a => a.extra?.name !== GATEWAY_SCHEME_NAME)) rails.push('exact')\n\n const provider = item.metadata?.provider\n return {\n id: item.resource,\n name: provider?.name ?? new URL(item.resource).hostname,\n description: item.metadata?.description ?? provider?.description ?? '',\n tags: provider?.tags ?? [],\n endpoint: item.resource,\n method: item.metadata?.method,\n pricePerRequest: formatUnits(BigInt(cheapest.amount), USDC_DECIMALS),\n paymentToken: 'USDC',\n walletAddress: cheapest.payTo,\n network,\n rails,\n source: 'circle',\n category: provider?.category,\n updatedAt: item.lastUpdated\n }\n}\n\n/** Throws when Circle cannot be reached, so a caller can tell that apart from no results. */\nexport async function searchCircle(\n network: ChainPeNetwork,\n options: DiscoverOptions\n): Promise<ChainPeService[]> {\n const url = new URL(CIRCLE_DISCOVERY_URL)\n url.searchParams.set('network', getCaip2(network))\n url.searchParams.set('limit', String(options.limit ?? DEFAULT_LIMIT))\n if (options.query) url.searchParams.set('query', options.query)\n if (options.category) url.searchParams.set('category', options.category)\n if (options.maxPrice) url.searchParams.set('maxUsdPrice', options.maxPrice)\n if (options.gatewayOnly) url.searchParams.set('supportsCircleGateway', 'true')\n\n const res = await fetch(url, { signal: AbortSignal.timeout(15_000) })\n if (!res.ok) throw new Error(`Circle Discovery answered ${res.status}.`)\n const body = (await res.json()) as { items?: CircleItem[] }\n return (body.items ?? [])\n .flatMap(item => mapCircleItem(item, network) ?? [])\n .filter(service => isRelevant(service, options.query))\n}\n\n/** Words of 3+ letters in a search, lower case. */\nfunction queryWords(query?: string): string[] {\n return (query ?? '').toLowerCase().split(/[^a-z0-9]+/).filter(w => w.length >= 3)\n}\n\n/**\n * Circle's search can return listings that share no word with the query. Keeps a\n * listing only when one of its words is a query word, or that word plus \"s\". Pure.\n */\nexport function isRelevant(service: ChainPeService, query?: string): boolean {\n const words = queryWords(query)\n if (words.length === 0) return true\n const text = [service.name, service.description, service.category ?? '', service.endpoint, ...service.tags].join(' ').toLowerCase()\n const tokens = new Set(text.split(/[^a-z0-9]+/))\n return words.some(w => tokens.has(w) || tokens.has(`${w}s`) || (w.endsWith('s') && tokens.has(w.slice(0, -1))))\n}\n\n/** Drops a ChainPe listing when Circle already lists that provider on the same host. Pure. */\nexport function mergeListings(\n circle: ChainPeService[],\n chainpe: ChainPeService[]\n): ChainPeService[] {\n const key = (s: ChainPeService) =>\n `${s.walletAddress.toLowerCase()}@${hostOf(s.endpoint)}`\n const listed = new Set(circle.map(key))\n return [...chainpe.filter(s => !listed.has(key(s))), ...circle]\n}\n\n/**\n * Finds services through Circle's Discovery API and ChainPeAccounts, annotated\n * with ERC-8004 reputation and ranked. Needs no wallet. ChainPeAccounts also covers\n * providers Circle has not listed yet. Throws only when neither source can be read.\n */\nexport async function discoverServices(\n network: ChainPeNetwork,\n query: string | DiscoverOptions = {},\n addresses: { accountsAddress?: string; reputationRegistry?: string } = {}\n): Promise<RankedService[]> {\n const options: DiscoverOptions = typeof query === 'string' ? { query } : query\n const accounts = resolveAccountsAddress(network, addresses.accountsAddress)\n const reputationRegistry = resolveReputationRegistry(\n network,\n addresses.reputationRegistry\n )\n\n const [circle, chainpe] = await Promise.allSettled([\n searchCircle(network, options),\n accounts\n ? new RegistryClient(network, accounts)\n .listAllServices()\n .then(services => filterServices(services, options))\n : Promise.resolve([])\n ])\n if (circle.status === 'rejected' && chainpe.status === 'rejected') {\n throw new Error(\n `Could not discover services: ${String(circle.reason)}; ${String(chainpe.reason)}`\n )\n }\n const services = mergeListings(\n circle.status === 'fulfilled' ? circle.value : [],\n chainpe.status === 'fulfilled' ? chainpe.value : []\n ).slice(0, options.limit ?? DEFAULT_LIMIT)\n\n const ranked: RankedService[] = await Promise.all(\n services.map(async s => ({\n ...s,\n reputation: s.agentId\n ? await getReputation(network, reputationRegistry, s.agentId)\n : null\n }))\n )\n return rankByReputation(ranked)\n}\n\nfunction hostOf(endpoint: string): string {\n try {\n return new URL(endpoint).host\n } catch {\n return endpoint\n }\n}\n","/**\n * ChainPeAccounts reader (read-only, viem).\n *\n * Reads active service listings through the paginated `getServices` view. Pure\n * decode/filter/rank helpers are exported so they can be unit-tested without an\n * RPC connection.\n */\nimport { publicClientFor } from './networks.js'\nimport type {\n ChainPeNetwork,\n ChainPeService,\n DiscoverOptions,\n PaymentRail,\n RankedService\n} from './types.js'\n\nconst SERVICE_COMPONENTS = [\n { name: 'key', type: 'bytes32' },\n { name: 'provider', type: 'address' },\n { name: 'payTo', type: 'address' },\n { name: 'agentId', type: 'uint256' },\n { name: 'name', type: 'string' },\n { name: 'description', type: 'string' },\n { name: 'tags', type: 'string' },\n { name: 'endpoint', type: 'string' },\n { name: 'pricePerRequest', type: 'string' },\n { name: 'network', type: 'string' },\n { name: 'acceptsExact', type: 'bool' },\n { name: 'acceptsGateway', type: 'bool' },\n { name: 'active', type: 'bool' },\n { name: 'createdAt', type: 'uint64' },\n { name: 'updatedAt', type: 'uint64' }\n] as const\n\nconst ACCOUNTS_ABI = [\n {\n type: 'function',\n name: 'serviceCount',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ name: '', type: 'uint256' }]\n },\n {\n type: 'function',\n name: 'MAX_SERVICES_PER_PAGE',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ name: '', type: 'uint256' }]\n },\n {\n type: 'function',\n name: 'getServices',\n stateMutability: 'view',\n inputs: [\n { name: 'offset', type: 'uint256' },\n { name: 'limit', type: 'uint256' }\n ],\n outputs: [{ name: 'page', type: 'tuple[]', components: SERVICE_COMPONENTS }]\n }\n] as const\n\nexport interface RawService {\n key: string\n provider: string\n payTo: string\n agentId: bigint\n name: string\n description: string\n tags: string\n endpoint: string\n pricePerRequest: string\n network: string\n acceptsExact: boolean\n acceptsGateway: boolean\n active: boolean\n createdAt: bigint\n updatedAt: bigint\n}\n\n/** Decodes an on-chain service tuple into the public {@link ChainPeService}. */\nexport function decodeService(\n raw: RawService,\n network: ChainPeNetwork\n): ChainPeService {\n const createdAt = Number(raw.createdAt)\n const updatedAt = Number(raw.updatedAt)\n const rails: PaymentRail[] = []\n if (raw.acceptsGateway) rails.push('gateway')\n if (raw.acceptsExact) rails.push('exact')\n return {\n id: raw.key,\n name: raw.name,\n description: raw.description,\n tags: raw.tags\n .split(',')\n .map(t => t.trim())\n .filter(Boolean),\n endpoint: raw.endpoint,\n pricePerRequest: raw.pricePerRequest,\n paymentToken: 'USDC',\n walletAddress: raw.payTo,\n network,\n rails,\n source: 'chainpe',\n developer: raw.provider,\n agentId: raw.agentId > 0n ? raw.agentId.toString() : undefined,\n createdAt: createdAt ? new Date(createdAt * 1000).toISOString() : undefined,\n updatedAt: updatedAt ? new Date(updatedAt * 1000).toISOString() : undefined\n }\n}\n\n/** Filters services by free-text query, tags, max price and rail. Pure. */\nexport function filterServices(\n services: ChainPeService[],\n options: DiscoverOptions\n): ChainPeService[] {\n let results = [...services]\n if (options.query) {\n const q = options.query.toLowerCase()\n results = results.filter(\n s =>\n s.name.toLowerCase().includes(q) ||\n s.description.toLowerCase().includes(q) ||\n s.tags.some(tag => tag.toLowerCase().includes(q))\n )\n }\n if (options.tags?.length) {\n const tl = options.tags.map(t => t.toLowerCase())\n results = results.filter(s =>\n s.tags.some(tag => tl.includes(tag.toLowerCase()))\n )\n }\n if (options.maxPrice) {\n const max = parseFloat(options.maxPrice)\n results = results.filter(s => parseFloat(s.pricePerRequest) <= max)\n }\n if (options.gatewayOnly) {\n results = results.filter(s => s.rails.includes('gateway'))\n }\n return results\n}\n\n/**\n * Ranks services by reputation: scored before unscored, higher score first,\n * then more feedback, then cheaper. Stable for equal keys. Pure.\n */\nexport function rankByReputation(services: RankedService[]): RankedService[] {\n return [...services].sort((a, b) => {\n const sa = a.reputation?.score\n const sb = b.reputation?.score\n const aHas = sa != null\n const bHas = sb != null\n if (aHas !== bHas) return aHas ? -1 : 1\n if (aHas && bHas && sa !== sb) return sb - sa\n const ca = a.reputation?.count ?? 0\n const cb = b.reputation?.count ?? 0\n if (ca !== cb) return cb - ca\n return parseFloat(a.pricePerRequest) - parseFloat(b.pricePerRequest)\n })\n}\n\n/** Reads the on-chain ChainPeAccounts contract. */\nexport class RegistryClient {\n constructor(\n private readonly network: ChainPeNetwork,\n private readonly address: `0x${string}`\n ) {}\n\n getAddress(): string {\n return this.address\n }\n\n /** Lists every active service. Deactivated listings stay on-chain, so they are dropped here. */\n async listAllServices(): Promise<ChainPeService[]> {\n const client = publicClientFor(this.network)\n const [count, maxPage] = (await Promise.all([\n client.readContract({\n address: this.address,\n abi: ACCOUNTS_ABI,\n functionName: 'serviceCount'\n }),\n client.readContract({\n address: this.address,\n abi: ACCOUNTS_ABI,\n functionName: 'MAX_SERVICES_PER_PAGE'\n })\n ])) as [bigint, bigint]\n\n const total = Number(count)\n const pageSize = Number(maxPage)\n const out: ChainPeService[] = []\n for (let offset = 0; offset < total; offset += pageSize) {\n const limit = Math.min(pageSize, total - offset)\n const page = (await client.readContract({\n address: this.address,\n abi: ACCOUNTS_ABI,\n functionName: 'getServices',\n args: [BigInt(offset), BigInt(limit)]\n })) as unknown as RawService[]\n for (const raw of page) {\n if (raw.active) out.push(decodeService(raw, this.network))\n }\n }\n return out\n }\n}\n","/**\n * ERC-8004 reputation — read aggregate scores + post feedback.\n *\n * A provider's score is the aggregate of feedback left by paying clients on the\n * ERC-8004 Reputation Registry. `getSummary` reverts on an empty client list, so\n * we always enumerate clients via `getClients` first (empty ⇒ unscored). The\n * registry blocks self-feedback, so a provider can't inflate its own score.\n */\nimport { createWalletClient, http, type Hex, type WalletClient } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport {\n publicClientFor,\n rpcUrlFor,\n chainFor,\n normalizeKey\n} from './networks.js'\nimport type { ChainPeNetwork, ReputationSummary } from './types.js'\n\nconst ZERO_HASH: Hex =\n '0x0000000000000000000000000000000000000000000000000000000000000000'\n\nconst REPUTATION_ABI = [\n {\n type: 'function',\n name: 'giveFeedback',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'agentId', type: 'uint256' },\n { name: 'value', type: 'int128' },\n { name: 'valueDecimals', type: 'uint8' },\n { name: 'tag1', type: 'string' },\n { name: 'tag2', type: 'string' },\n { name: 'endpoint', type: 'string' },\n { name: 'feedbackURI', type: 'string' },\n { name: 'feedbackHash', type: 'bytes32' }\n ],\n outputs: []\n },\n {\n type: 'function',\n name: 'getSummary',\n stateMutability: 'view',\n inputs: [\n { name: 'agentId', type: 'uint256' },\n { name: 'clientAddresses', type: 'address[]' },\n { name: 'tag1', type: 'string' },\n { name: 'tag2', type: 'string' }\n ],\n outputs: [\n { name: 'count', type: 'uint64' },\n { name: 'summaryValue', type: 'int128' },\n { name: 'summaryValueDecimals', type: 'uint8' }\n ]\n },\n {\n type: 'function',\n name: 'getClients',\n stateMutability: 'view',\n inputs: [{ name: 'agentId', type: 'uint256' }],\n outputs: [{ name: '', type: 'address[]' }]\n }\n] as const\n\n/** Converts the on-chain (value, decimals) summary into a human score. Pure. */\nexport function summaryToScore(summaryValue: bigint, decimals: number): number {\n return Number(summaryValue) / 10 ** decimals\n}\n\n/**\n * Reads a provider agent's aggregate reputation. Returns null when the agent is\n * unlinked (`agentId` 0/empty) or no registry is configured; `count: 0` when the\n * agent exists but has no feedback yet.\n */\nexport async function getReputation(\n network: ChainPeNetwork,\n registry: `0x${string}` | undefined,\n agentId: string\n): Promise<ReputationSummary | null> {\n if (!agentId || agentId === '0') return null\n if (!registry) return null\n\n try {\n const client = publicClientFor(network)\n const id = BigInt(agentId)\n const clients = (await client.readContract({\n address: registry,\n abi: REPUTATION_ABI,\n functionName: 'getClients',\n args: [id]\n })) as readonly `0x${string}`[]\n\n if (clients.length === 0) return { count: 0, score: null }\n\n const [count, summaryValue, decimals] = (await client.readContract({\n address: registry,\n abi: REPUTATION_ABI,\n functionName: 'getSummary',\n args: [id, clients as `0x${string}`[], '', '']\n })) as readonly [bigint, bigint, number]\n\n return {\n count: Number(count),\n score: summaryToScore(summaryValue, Number(decimals))\n }\n } catch {\n return null\n }\n}\n\nexport interface GiveFeedbackParams {\n agentId: string\n /** Score, typically 0–100 (valueDecimals 0). */\n value: number\n endpoint?: string\n tag?: string\n /** Await the receipt before returning. Defaults to false. */\n waitConfirm?: boolean\n}\n\n/** Posts ERC-8004 feedback for a provider agent. Returns the tx hash. */\nexport async function giveFeedback(\n network: ChainPeNetwork,\n registry: `0x${string}` | undefined,\n privateKey: string,\n params: GiveFeedbackParams\n): Promise<string> {\n if (!registry) throw new Error('Reputation registry address not configured')\n\n const account = privateKeyToAccount(normalizeKey(privateKey))\n const wallet: WalletClient = createWalletClient({\n account,\n chain: chainFor(network),\n transport: http(rpcUrlFor(network))\n })\n\n // Simulates first, so a revert such as self-feedback costs no gas.\n const client = publicClientFor(network)\n const { request } = await client.simulateContract({\n account,\n chain: chainFor(network),\n address: registry,\n abi: REPUTATION_ABI,\n functionName: 'giveFeedback',\n args: [\n BigInt(params.agentId),\n BigInt(Math.round(params.value)),\n 0,\n 'x402',\n params.tag ?? 'paid-call',\n params.endpoint ?? '',\n '',\n ZERO_HASH\n ]\n })\n const hash = await wallet.writeContract(request)\n\n if (params.waitConfirm) {\n const receipt = await client.waitForTransactionReceipt({ hash })\n if (receipt.status !== 'success') throw new Error(`Feedback transaction ${hash} reverted.`)\n }\n return hash\n}\n","/** Arc network the SDK operates on. */\nexport type ChainPeNetwork = 'arc-testnet' | 'arc'\n\n/**\n * How a call is paid. `exact` moves USDC from the wallet for each call. `gateway`\n * pays from a prepaid Circle Gateway deposit, with no gas, and is settled in batches.\n */\nexport type PaymentRail = 'gateway' | 'exact'\n\n/**\n * Error thrown when an x402 payment fails (e.g. insufficient USDC, settlement\n * refused). Provides `.txHash` and `.reason` for debugging.\n */\nexport class ChainPePaymentError extends Error {\n readonly txHash?: string\n readonly reason?: string\n\n constructor(\n message: string,\n { txHash, reason }: { txHash?: string; reason?: string } = {}\n ) {\n super(message)\n this.name = 'ChainPePaymentError'\n this.txHash = txHash\n this.reason = reason\n }\n}\n\n/** Options for constructing a {@link ChainPe} client. */\nexport interface ChainPeOptions {\n /** EOA private key (0x-prefixed or bare hex) used to sign payments + feedback. */\n privateKey: string\n /** Arc network. Defaults to `'arc-testnet'`. */\n network?: ChainPeNetwork\n /**\n * Payment rails to use, in order of preference. Defaults to\n * `['gateway', 'exact']`: Gateway when the deposit covers the price, else the wallet.\n */\n rails?: PaymentRail[]\n /** ChainPeAccounts address. Defaults to the deployed contract for the network. */\n accountsAddress?: string\n /** ERC-8004 Reputation Registry address. Defaults to Arc's registry. */\n reputationRegistry?: string\n /**\n * Max USDC to auto-pay for a single 402 (human units, e.g. `\"1.00\"`). A higher\n * price is refused before anything is signed. Defaults to `\"1\"`.\n */\n maxPerCall?: string\n /**\n * When true, `.fetch()`/`.pay()` post positive ERC-8004 feedback to the\n * provider's agent after a successful paid call. It costs gas, paid in USDC.\n * Defaults to `false`. `.pay()` returns the feedback result; use\n * `.giveFeedback()` for explicit control.\n */\n autoFeedback?: boolean\n}\n\n/** Per-request options for {@link ChainPe.fetch} / {@link ChainPe.pay}. */\nexport interface FetchOptions extends RequestInit {\n /** Override the constructor `autoFeedback` for this call. */\n autoFeedback?: boolean\n /**\n * Timeout per HTTP attempt in milliseconds. Defaults to 30 000 ms (30 s).\n */\n timeout?: number\n}\n\n/** A service found by {@link ChainPe.discover}. */\nexport interface ChainPeService {\n /** Stable id: the resource URL (Circle) or the service key (ChainPeAccounts). */\n id: string\n name: string\n description: string\n tags: string[]\n /** The URL to call. */\n endpoint: string\n /** The HTTP method, when the listing names one. */\n method?: string\n /** Human USDC units. */\n pricePerRequest: string\n paymentToken: 'USDC'\n /** Address that receives payment (the 402 `payTo`). */\n walletAddress: string\n network: ChainPeNetwork\n /** Payment rails this service accepts on this network. */\n rails: PaymentRail[]\n /** Where the listing came from. */\n source: 'circle' | 'chainpe'\n /** Circle Discovery category, when listed there. */\n category?: string\n /** The provider's address, for services on ChainPeAccounts. */\n developer?: string\n /** ERC-8004 agent id, when the service is linked to an identity. */\n agentId?: string\n createdAt?: string\n updatedAt?: string\n}\n\n/** Filters for {@link ChainPe.discover}. */\nexport interface DiscoverOptions {\n /** Free-text search. */\n query?: string\n tags?: string[]\n /** Max price per request (human USDC units). */\n maxPrice?: string\n /** Circle Discovery category, e.g. `DATA_ENRICHMENT`. */\n category?: string\n /** Only services that accept Circle Gateway. */\n gatewayOnly?: boolean\n /** Max results. Defaults to 20. */\n limit?: number\n}\n\n/** Aggregated ERC-8004 reputation for an agent. */\nexport interface ReputationSummary {\n /** Number of feedback entries counted. */\n count: number\n /** Aggregate score (typically 0–100), or null when unscored. */\n score: number | null\n}\n\n/** A service annotated with its reputation (returned by {@link ChainPe.discover}). */\nexport interface RankedService extends ChainPeService {\n reputation: ReputationSummary | null\n}\n\n/** Details of a payment that was made. */\nexport interface PaymentInfo {\n /** Human USDC units. */\n amount: string\n recipient: string\n network: ChainPeNetwork\n rail: PaymentRail\n /** On-chain tx hash. Set on the exact rail. */\n txHash?: string\n /** Circle transfer id. Set on the Gateway rail, which settles in a later batch. */\n transferId?: string\n /** The provider's decoded settlement response. */\n settlement?: unknown\n}\n\n/** Result of {@link ChainPe.request}: a live, unread Response + metadata. */\nexport interface PaidResponse {\n response: Response\n /** Set when a payment was actually made. */\n payment?: PaymentInfo\n /** The provider's ERC-8004 agent id, when it advertises one. */\n agentId?: string\n}\n\n/** Result of {@link ChainPe.pay} — a parsed, structured paid response. */\nexport interface PaidResult<T = unknown> {\n status: number\n ok: boolean\n headers: Record<string, string>\n /** Parsed body (JSON when the content-type is JSON, else text). */\n data: T\n /** Present when a payment was made + settled. */\n payment?: PaymentInfo\n /** Present when feedback was posted (autoFeedback). */\n reputation?: { agentId: string; score: number; txHash: string }\n}\n\n/** Wallet balances (human USDC units). */\nexport interface Balances {\n /** USDC in the wallet. It also pays gas on Arc. */\n usdc: string\n /** USDC available in Circle Gateway. `'0'` if it could not be read. */\n gateway: string\n}\n","/**\n * PolicyVault client — programmable, gasless agent spending.\n *\n * Three roles, one client (whichever key you construct it with):\n * - **owner** funds the vault + sets the policy/allowlist (`deposit`,\n * `setPolicy`, `setAllowlist`, `revokeSession`) — owner pays gas.\n * - **agent** holds the session key and only *signs* spends (`signSpend`) —\n * no gas, no tx.\n * - **relayer** submits a signed spend (`relaySpend`) and pays the gas.\n *\n * The on-chain `PolicyVault` enforces every limit; an over-cap or non-allowlisted\n * spend reverts (the rejection reason is surfaced as the thrown error).\n */\nimport {\n createWalletClient,\n http,\n parseUnits,\n formatUnits,\n getAddress,\n type Hex,\n type WalletClient\n} from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport {\n publicClientFor,\n rpcUrlFor,\n chainFor,\n normalizeKey,\n USDC_DECIMALS\n} from './networks.js'\nimport type { ChainPeNetwork } from './types.js'\n\nconst VAULT_ABI = [\n {\n type: 'function',\n name: 'deposit',\n stateMutability: 'nonpayable',\n inputs: [{ name: 'amount', type: 'uint256' }],\n outputs: []\n },\n {\n type: 'function',\n name: 'withdraw',\n stateMutability: 'nonpayable',\n inputs: [{ name: 'amount', type: 'uint256' }],\n outputs: []\n },\n {\n type: 'function',\n name: 'setPolicy',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'sessionKey', type: 'address' },\n { name: 'maxPerCall', type: 'uint256' },\n { name: 'dailyCap', type: 'uint256' },\n { name: 'totalBudget', type: 'uint256' },\n { name: 'expiry', type: 'uint64' },\n { name: 'allowlistOnly', type: 'bool' }\n ],\n outputs: []\n },\n {\n type: 'function',\n name: 'setAllowlist',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'to', type: 'address' },\n { name: 'allowed', type: 'bool' }\n ],\n outputs: []\n },\n {\n type: 'function',\n name: 'revokeSession',\n stateMutability: 'nonpayable',\n inputs: [],\n outputs: []\n },\n {\n type: 'function',\n name: 'spend',\n stateMutability: 'nonpayable',\n inputs: [\n { name: 'owner', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'deadline', type: 'uint256' },\n { name: 'sessionSig', type: 'bytes' }\n ],\n outputs: []\n },\n {\n type: 'function',\n name: 'balanceOf',\n stateMutability: 'view',\n inputs: [{ name: 'owner', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }]\n },\n {\n type: 'function',\n name: 'nonces',\n stateMutability: 'view',\n inputs: [{ name: 'owner', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }]\n },\n {\n type: 'function',\n name: 'dailyRemaining',\n stateMutability: 'view',\n inputs: [{ name: 'owner', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }]\n },\n {\n type: 'function',\n name: 'budgetRemaining',\n stateMutability: 'view',\n inputs: [{ name: 'owner', type: 'address' }],\n outputs: [{ name: '', type: 'uint256' }]\n }\n] as const\n\nconst SPEND_TYPES = {\n Spend: [\n { name: 'owner', type: 'address' },\n { name: 'to', type: 'address' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'deadline', type: 'uint256' }\n ]\n} as const\n\nexport interface PolicyVaultOptions {\n privateKey: string\n network?: ChainPeNetwork\n vaultAddress: string\n}\n\nexport interface PolicyParams {\n sessionKey: string\n /** Human USDC strings. */\n maxPerCall: string\n dailyCap: string\n totalBudget: string\n /** Unix seconds the session is valid until. */\n expiry: number\n allowlistOnly?: boolean\n}\n\n/** A session-signed spend authorization, ready for a relayer to submit. */\nexport interface SpendAuthorization {\n owner: string\n to: string\n /** Human USDC string. */\n amount: string\n amountAtomic: string\n nonce: string\n deadline: number\n signature: Hex\n}\n\nexport class PolicyVaultClient {\n readonly network: ChainPeNetwork\n readonly vault: `0x${string}`\n private readonly account\n\n constructor(options: PolicyVaultOptions) {\n if (!options.privateKey) throw new Error('PolicyVaultClient: privateKey required')\n if (!options.vaultAddress) throw new Error('PolicyVaultClient: vaultAddress required')\n this.network = options.network ?? 'arc-testnet'\n this.vault = getAddress(options.vaultAddress)\n this.account = privateKeyToAccount(normalizeKey(options.privateKey))\n }\n\n getAddress(): string {\n return this.account.address\n }\n\n private wallet(): WalletClient {\n return createWalletClient({\n account: this.account,\n chain: chainFor(this.network),\n transport: http(rpcUrlFor(this.network))\n })\n }\n\n private usdc(human: string): bigint {\n return parseUnits(human, USDC_DECIMALS)\n }\n\n // ─── reads ────────────────────────────────────────────────────────────────\n\n async balanceOf(owner: string): Promise<string> {\n const raw = (await publicClientFor(this.network).readContract({\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'balanceOf',\n args: [getAddress(owner)]\n })) as bigint\n return formatUnits(raw, USDC_DECIMALS)\n }\n\n async dailyRemaining(owner: string): Promise<string> {\n const raw = (await publicClientFor(this.network).readContract({\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'dailyRemaining',\n args: [getAddress(owner)]\n })) as bigint\n return formatUnits(raw, USDC_DECIMALS)\n }\n\n async budgetRemaining(owner: string): Promise<string> {\n const raw = (await publicClientFor(this.network).readContract({\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'budgetRemaining',\n args: [getAddress(owner)]\n })) as bigint\n return formatUnits(raw, USDC_DECIMALS)\n }\n\n async nonce(owner: string): Promise<bigint> {\n return (await publicClientFor(this.network).readContract({\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'nonces',\n args: [getAddress(owner)]\n })) as bigint\n }\n\n // ─── owner ops (this key is the owner) ──────────────────────────────────────\n\n async deposit(human: string): Promise<Hex> {\n return this.wallet().writeContract({\n account: this.account,\n chain: chainFor(this.network),\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'deposit',\n args: [this.usdc(human)]\n })\n }\n\n async withdraw(human: string): Promise<Hex> {\n return this.wallet().writeContract({\n account: this.account,\n chain: chainFor(this.network),\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'withdraw',\n args: [this.usdc(human)]\n })\n }\n\n async setPolicy(p: PolicyParams): Promise<Hex> {\n return this.wallet().writeContract({\n account: this.account,\n chain: chainFor(this.network),\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'setPolicy',\n args: [\n getAddress(p.sessionKey),\n this.usdc(p.maxPerCall),\n this.usdc(p.dailyCap),\n this.usdc(p.totalBudget),\n BigInt(p.expiry),\n p.allowlistOnly ?? false\n ]\n })\n }\n\n async setAllowlist(to: string, allowed: boolean): Promise<Hex> {\n return this.wallet().writeContract({\n account: this.account,\n chain: chainFor(this.network),\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'setAllowlist',\n args: [getAddress(to), allowed]\n })\n }\n\n async revokeSession(): Promise<Hex> {\n return this.wallet().writeContract({\n account: this.account,\n chain: chainFor(this.network),\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'revokeSession',\n args: []\n })\n }\n\n // ─── agent: sign a spend (gasless — no tx) ──────────────────────────────────\n\n /**\n * Signs a spend authorization with this key (the session key). Reads the\n * owner's current nonce so the relayer can submit it. `ttlSeconds` bounds how\n * long the authorization stays valid (default 5 min).\n */\n async signSpend(params: {\n owner: string\n to: string\n amount: string\n ttlSeconds?: number\n }): Promise<SpendAuthorization> {\n const owner = getAddress(params.owner)\n const to = getAddress(params.to)\n const amountAtomic = this.usdc(params.amount)\n const nonce = await this.nonce(owner)\n const deadline = Math.floor(Date.now() / 1000) + (params.ttlSeconds ?? 300)\n\n const signature = await this.account.signTypedData({\n domain: {\n name: 'ChainPePolicyVault',\n version: '1',\n chainId: chainFor(this.network).id,\n verifyingContract: this.vault\n },\n types: SPEND_TYPES,\n primaryType: 'Spend',\n message: {\n owner,\n to,\n amount: amountAtomic,\n nonce,\n deadline: BigInt(deadline)\n }\n })\n\n return {\n owner,\n to,\n amount: params.amount,\n amountAtomic: amountAtomic.toString(),\n nonce: nonce.toString(),\n deadline,\n signature\n }\n }\n\n // ─── relayer: submit a signed spend (pays gas) ──────────────────────────────\n\n /**\n * Submits a session-signed spend. Throws with the on-chain revert reason if a\n * policy limit is violated (e.g. \"over per-call cap\").\n */\n async relaySpend(auth: SpendAuthorization): Promise<Hex> {\n return this.wallet().writeContract({\n account: this.account,\n chain: chainFor(this.network),\n address: this.vault,\n abi: VAULT_ABI,\n functionName: 'spend',\n args: [\n getAddress(auth.owner),\n getAddress(auth.to),\n BigInt(auth.amountAtomic),\n BigInt(auth.deadline),\n auth.signature\n ]\n })\n }\n}\n"],"mappings":"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","names":["formatUnits","getAddress","privateKeyToAccount","http","http","services","privateKeyToAccount","formatUnits","getAddress","response","createWalletClient","http","parseUnits","formatUnits","getAddress","privateKeyToAccount","getAddress","privateKeyToAccount","createWalletClient","http","parseUnits","formatUnits"]}
package/package.json CHANGED
@@ -1,6 +1,61 @@
1
1
  {
2
2
  "name": "@chainpearc/sdk",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.4.0",
4
+ "description": "ChainPe SDK: pay x402 APIs in USDC on Arc, find services through Circle Discovery, and rate them with ERC-8004.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsup",
21
+ "dev": "tsup --watch",
22
+ "typecheck": "tsc --noEmit",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "clean": "rm -rf dist",
26
+ "prepublishOnly": "npm run build"
27
+ },
28
+ "dependencies": {
29
+ "@circle-fin/x402-batching": "^4.0.0",
30
+ "@x402/evm": "^2.30.0",
31
+ "@x402/fetch": "^2.30.0",
32
+ "viem": "^2.57.5"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^22.15.21",
36
+ "tsup": "^8.5.0",
37
+ "typescript": "^5.8.3",
38
+ "vitest": "^3.2.1"
39
+ },
40
+ "keywords": [
41
+ "x402",
42
+ "sdk",
43
+ "usdc",
44
+ "arc",
45
+ "circle",
46
+ "payments",
47
+ "micropayments",
48
+ "ai-agents",
49
+ "erc-8004",
50
+ "reputation",
51
+ "chainpe"
52
+ ],
53
+ "license": "MIT",
54
+ "repository": {
55
+ "type": "git",
56
+ "url": "git+https://github.com/SamyaDeb/ChainPe.git"
57
+ },
58
+ "engines": {
59
+ "node": ">=22.18"
60
+ }
61
+ }