Quick Start for Buyers

This section explains how buyers (wallets, AI agents, or applications) can generate valid payment headers that authorize token transfers and authenticate payment when accessing protected resources. For the seller-side implementation, see Quick Start for Sellers.

Prerequisites

  • Cronos-compatible wallet with private key or browser wallet extension

  • USDC.E token balance (see Network Constants for contract addresses)

    • For Cronos Testnet, you can obtain devUSDC.e tokens from the faucet for testing purposes

Integration Steps

  1. Receive 402 Response - Buyer requests resource and receives payment requirements

  2. Generate Payment Header - Create EIP-3009 signature authorizing token transfer

  3. Retry with Payment - Send request with X-PAYMENT containing authorization

  4. Receive Content - Seller settles payment and returns protected resource

Installation

npm install ethers

Complete Payment Flow

const axios = require('axios');
const { ethers } = require('ethers');
const { createPaymentHeader } = require('./payment-header-generator');

async function payForResource(resourceUrl, wallet) {
  try {
    // Step 1: Initial request to resource (expect 402)
    const initialResponse = await axios.get(resourceUrl).catch(err => err.response);

    // Step 2: Check for 402 Payment Required
    if (initialResponse.status !== 402) {
      return initialResponse.data;
    }

    const { paymentRequirements } = initialResponse.data;

    // Step 3: Generate payment header (sign EIP-3009 authorization)
    const paymentHeaderBase64 = await createPaymentHeader({
      wallet: wallet,
      paymentRequirements: paymentRequirements,
      network: paymentRequirements.network,
    });

    // Step 4: Retry request with payment header
    const paidResponse = await axios.get(resourceUrl, {
      headers: { 'X-PAYMENT': paymentHeaderBase64 },
    });
    
    return paidResponse.data;

  } catch (error) {
    throw error;
  }
}

// Example usage
async function main() {
  const privateKey = process.env.PRIVATE_KEY;
  const provider = new ethers.JsonRpcProvider('https://evm-t3.cronos.org');
  const wallet = new ethers.Wallet(privateKey, provider);

  const resourceUrl = 'https://seller-api.example.com/api/premium-data';
  const result = await payForResource(resourceUrl, wallet);

  return result;
}

main();

Generating Payment Header

Common Pitfalls

Common mistakes when implementing the payment header generation:

  • Wrong Token Metadata

  • Invalid Nonce Format

  • Decimal in Amount

  • Timestamp in Milliseconds

Last updated

Was this helpful?