Skip to main content
The ArbiterRegistry is an on-chain contract that allows arbiters to register themselves, publish metadata URIs, and be discovered by merchants and clients.

Setup

To use registry methods, provide the arbiterRegistryAddress when creating the arbiter instance:
import { X402rArbiter } from '@x402r/arbiter';
import { getNetworkConfig } from '@x402r/core';

const config = getNetworkConfig('eip155:84532')!;

const arbiter = new X402rArbiter({
  publicClient,
  walletClient,
  operatorAddress: '0x...',
  refundRequestAddress: config.refundRequest,
  arbiterRegistryAddress: config.arbiterRegistry,
});

Register as an Arbiter

Register your address in the on-chain registry with a URI pointing to your metadata or API endpoint:
const { txHash } = await arbiter.registerArbiter(
  'https://arbiter.example.com/api/disputes'
);
console.log('Registered:', txHash);
The URI can point to:
  • An API endpoint for receiving dispute notifications
  • A JSON metadata file describing your arbitration services
  • An IPFS hash with your arbiter profile

Update Your URI

Change your registered URI:
const { txHash } = await arbiter.updateArbiterUri(
  'https://new-arbiter.example.com/api'
);
console.log('URI updated:', txHash);

Deregister

Remove yourself from the registry:
const { txHash } = await arbiter.deregisterArbiter();
console.log('Deregistered:', txHash);

Query the Registry

Check if an Address is Registered

const isRegistered = await arbiter.isArbiterRegistered('0xArbiterAddress...');
console.log('Is registered:', isRegistered);

Get an Arbiter’s URI

const uri = await arbiter.getArbiterUri('0xArbiterAddress...');
console.log('URI:', uri); // empty string if not registered

Get Total Arbiter Count

const count = await arbiter.getArbiterCount();
console.log('Total arbiters:', count);

List Arbiters (Paginated)

const { arbiters, uris, total } = await arbiter.listArbiters(0n, 10n);
console.log(`Showing ${arbiters.length} of ${total} arbiters`);

for (let i = 0; i < arbiters.length; i++) {
  console.log(`${arbiters[i]}: ${uris[i]}`);
}

Method Reference

MethodParametersReturnsDescription
registerArbiteruri: string{ txHash }Register with a URI
updateArbiterUrinewUri: string{ txHash }Update registered URI
deregisterArbiter(none){ txHash }Remove from registry
getArbiterUriarbiter: AddressstringGet arbiter’s URI
isArbiterRegisteredarbiter: AddressbooleanCheck registration
getArbiterCount(none)bigintTotal registered count
listArbitersoffset: bigint, count: bigintArbiterListPaginated list

ArbiterList Type

interface ArbiterList {
  arbiters: readonly `0x${string}`[];  // Arbiter addresses
  uris: readonly string[];             // Corresponding URIs
  total: bigint;                       // Total registered count
}

Complete Example

import { X402rArbiter } from '@x402r/arbiter';
import { getNetworkConfig } from '@x402r/core';

async function main() {
  const config = getNetworkConfig('eip155:84532')!;

  const arbiter = new X402rArbiter({
    publicClient,
    walletClient,
    operatorAddress: '0x...',
    arbiterRegistryAddress: config.arbiterRegistry,
  });

  // Register
  await arbiter.registerArbiter('https://my-arbiter.example.com/api');

  // Verify
  const isRegistered = await arbiter.isArbiterRegistered(
    walletClient.account!.address
  );
  console.log('Registered:', isRegistered);

  // Browse all arbiters
  const { arbiters, uris, total } = await arbiter.listArbiters(0n, 100n);
  console.log(`${total} arbiters registered:`);
  for (let i = 0; i < arbiters.length; i++) {
    console.log(`  ${arbiters[i]}${uris[i]}`);
  }
}

main().catch(console.error);

Next Steps