Skip to main content

Full Client

createX402r() returns a client with all action groups. No type restrictions.
import { createX402r } from '@x402r/sdk'

const client = createX402r({
  publicClient,
  walletClient,                              // optional for read-only
  operatorAddress: '0x...',                  // from deploy result
  escrowPeriodAddress: '0x...',              // from deploy result
  refundRequestAddress: '0x...',             // from deploy result
  refundRequestEvidenceAddress: '0x...',     // from deploy result
  freezeAddress: '0x...',                    // from deploy result
})

await client.payment.getAmounts(paymentInfo)
await client.refund?.request(paymentInfo, amount)
await client.escrow?.isDuringEscrow(paymentInfo)

Role Presets

Role presets call createX402r() internally and narrow the TypeScript types so autocomplete only shows relevant methods. All three require walletClient.
import {
  createPayerClient,
  createMerchantClient,
  createArbiterClient,
} from '@x402r/sdk'

const payer = createPayerClient({ publicClient, walletClient, operatorAddress: '0x...' })
const merchant = createMerchantClient({ publicClient, walletClient, operatorAddress: '0x...' })
const arbiter = createArbiterClient({ publicClient, walletClient, operatorAddress: '0x...' })
Type narrowing is a DX convenience, not a security boundary. On-chain conditions enforce access control.

Config Reference

FieldTypeRequiredNotes
publicClientPublicClientYesviem public client for reads
walletClientWalletClientNoRequired for writes. Role presets throw without it.
operatorAddressAddressYesYour deployed PaymentOperator
chainIdnumberNoAuto-detected from publicClient.chain
escrowPeriodAddressAddressNoActivates escrow group
refundRequestAddressAddressNoActivates refund group
refundRequestEvidenceAddressAddressNoActivates evidence group (requires refundRequestAddress)
freezeAddressAddressNoActivates freeze group
paymentIndexRecorderAddressAddressNoActivates query group
paymentStorePaymentStoreNoPluggable storage for payment lookups
eventFromBlockbigintNoStarting block for event-based payment lookups

Action Groups

GroupMethodsRequirement
payment9Always available
operator8Always available
watch4Always available
escrow3escrowPeriodAddress
refund15refundRequestAddress
evidence4refundRequestEvidenceAddress
freeze3freezeAddress
query3paymentIndexRecorderAddress
Groups without their required address are undefined on the client. Use optional chaining:
await client.escrow?.isDuringEscrow(paymentInfo) // undefined if no escrowPeriodAddress

Extend

Add custom action groups with .extend():
import { createX402r, queryActions } from '@x402r/sdk'

const client = createX402r({ publicClient, operatorAddress: '0x...' })

const extended = client.extend(
  queryActions('0xRecorderAddress', { eventFromBlock: 100000n })
)

// extended.query is now defined
const payments = await extended.query.getPayerPayments(payerAddress)

Next Steps

Merchant Guide

Accept payments and release funds.

Deploy Operator

Get the addresses for your client config.

Smart Contracts

Conditions and recorders that control on-chain access.