TypeScript types exported from @galliun/sdk and re-exported from @galliun/shared.

Client options

interface GalliunClientOptions {
  baseUrl: string;
  chain?: string;
  wallet?: PaymentWalletAdapter;
  fetch?: typeof fetch;
  hooks?: PaidAIClientHooks;
  authToken?: string;
}

Payment types

interface PaymentRequirement {
  error: "payment_required";
  x402Version: number;
  scheme: string;
  resource: string;
  description?: string;
  expiresAt: string;
  nonce: string;
  requestHash: string;
  accepts: PaymentAcceptOption[];
  cost?: ResolvedPricing;
}

interface PaymentAcceptOption {
  chain: string;
  network: string;
  asset: string;
  amount: string;
  decimals: number;
  payTo: string;
  coinType?: string;      // Sui
  mint?: string;          // Solana
  tokenAddress?: string;  // EVM
}

interface PaymentProof {
  x402Version: number;
  scheme: string;
  chain: string;
  network: string;
  asset: string;
  amount: string;
  payer: string;
  payTo: string;
  txHash: string;
  nonce: string;
  requestHash: string;
  expiresAt: string;
}

Wallet adapter

interface PaymentWalletAdapter {
  chain: string;
  address(): Promise<string>;
  pay(input: PaymentAcceptOption, requirement: PaymentRequirement): Promise<PaymentProof>;
  signMessage?(message: string): Promise<string>;
}

Hook types

type PaymentFlowStatus =
  | "idle"
  | "sending_request"
  | "payment_required"
  | "waiting_for_wallet"
  | "payment_submitted"
  | "retrying_request"
  | "verifying_payment"
  | "complete"
  | "error";

interface PaidAIClientHooks {
  onStatusChange?: (status: PaymentFlowStatus, context?: PaymentFlowContext) => void;
  onPaymentRequired?: (requirement: PaymentRequirement) => void;
  onPaymentSubmitted?: (proof: PaymentProof, requirement: PaymentRequirement) => void;
}

Next steps