Skip to content

Démarrage rapide

Votre agent paie une offre x402 en ligne, et vous confirmez que le paiement a été reconnu. Commencez gratuitement sur Base Sepolia avec de l'USDC de test, puis passez aux fonds réels avec les mêmes étapes.

Il vous faut un agent qui parle MCP, ou un script qui utilise un client x402 v2 standard. Les deux voies sont décrites ci-dessous.

1. Obtenir de l'USDC de test

Ouvrez le faucet de Circle, choisissez Base Sepolia et demandez de l'USDC de test pour l'adresse qui paie. L'USDC de test n'a aucune valeur réelle. Aucun ETH n'est nécessaire : le paiement est une autorisation EIP-3009 signée, que le facilitateur diffuse en payant le gaz.

2. Créer une clé dédiée

Utilisez une clé réservée aux paiements de l'agent, approvisionnée seulement de ce que vous comptez dépenser, jamais la clé d'un portefeuille personnel. Tout outil qui écrit un keystore Web3 Secret Storage v3 convient. Avec Foundry :

mkdir -p ~/.vauban-pay && cd ~/.vauban-pay && umask 077
openssl rand -base64 32 > payer.password
cast wallet new . payer --unsafe-password "$(cat payer.password)"

Le keystore est le fichier payer, son mot de passe est dans payer.password, et la commande affiche l'adresse à approvisionner. Les deux fichiers ne sont lisibles que par vous.

3. Lire l'offre

GET https://demo.pay.vauban.tech/x402-base-sepolia/v1/quote

répond 402. L'offre est dans l'en-tête de réponse PAYMENT-REQUIRED, en JSON encodé en base64 :

import base64, json, urllib.request, urllib.error
URL = "https://demo.pay.vauban.tech/x402-base-sepolia/v1/quote"
try:
    urllib.request.urlopen(URL)
except urllib.error.HTTPError as e:            # 402 expected
    h = e.headers["payment-required"]
    offer = json.loads(base64.b64decode(h + "=" * (-len(h) % 4)))
    print(offer["resource"], offer["accepts"])

Lu le 2026-10-01 :

champ contenu
scheme exact, exact-pq
network eip155:84532 (Base Sepolia)
asset 0x036CbD53842c5426634e7929541eC2318f3dCF7e (USDC de test)
amount 1000000 (1 USDC de test)
payTo 0x9e04689ec4F4B6A8BdEe305Bcd0A93F8B908eA0d

La démo indique ses propres limites dans resource.description. Lisez-les là avant de payer.

4. Payer

Avec le serveur MCP

Ajoutez @vauban-pay/mcp à votre client MCP (Claude Desktop, Claude Code, tout client MCP), avec les chemins absolus de vos deux fichiers :

{
  "mcpServers": {
    "vauban-pay": {
      "command": "npx",
      "args": ["-y", "@vauban-pay/mcp"],
      "env": {
        "PAY_MCP_EVM_KEYSTORE_PATH": "/home/you/.vauban-pay/payer",
        "PAY_MCP_EVM_PASSWORD_PATH": "/home/you/.vauban-pay/payer.password",
        "PAY_MCP_EVM_NETWORKS": "eip155:84532",
        "PAY_MCP_EVM_PAYEES": "0x9e04689ec4F4B6A8BdEe305Bcd0A93F8B908eA0d",
        "PAY_MCP_EVM_MAX_PER_PAYMENT": "1000000",
        "PAY_MCP_EVM_MAX_PER_SESSION": "5000000"
      }
    }
  }
}

Cette configuration paie au plus 1 USDC de test par paiement et 5 par session, sur Base Sepolia seulement, à ce seul bénéficiaire. Demandez ensuite à votre agent :

Use pay_for_resource on https://demo.pay.vauban.tech/x402-base-sepolia/v1/quote.

Le résultat est paid, avec la ressource, la transaction et le payeur. S'il est unpayable, son code nomme le réglage à corriger.

Avec n'importe quel client x402 v2

Utilisez le client de la fondation x402, pas les anciens paquets v1 :

npm install @x402/fetch @x402/evm viem
// Pay an x402 v2 URL with the x402 foundation's standard client.
// Usage: EVM_PRIVATE_KEY=0x... node pay.mjs <url>
import { wrapFetchWithPaymentFromConfig, x402HTTPClient, x402Client } from "@x402/fetch";
import { ExactEvmScheme } from "@x402/evm";
import { privateKeyToAccount } from "viem/accounts";

const url = process.argv[2];
const account = privateKeyToAccount(process.env.EVM_PRIVATE_KEY);
console.log("payer", account.address);

const payFetch = wrapFetchWithPaymentFromConfig(globalThis.fetch, {
  schemes: [{ network: "eip155:*", client: new ExactEvmScheme(account) }],
});
const res = await payFetch(url, { method: "GET" });
const body = await res.text();
const result = new x402HTTPClient(new x402Client()).parsePaymentResult({
  status: res.status,
  getHeader: (n) => res.headers.get(n),
  body: (() => { try { return JSON.parse(body); } catch { return undefined; } })(),
});
console.log("status", res.status, result.paymentStatus);
console.log("payment header", JSON.stringify(result.header ?? null));

5. Confirmer que vous êtes reconnu

Un paiement réglé rend 200. Un reçu enregistre ensuite, sur Starknet, votre adresse EVM comme ayant payé la ressource. Lisez-le par un appel à n'importe quel point d'accès JSON-RPC v0.10 de Starknet Sepolia, au bloc "latest". Vauban en opère un à https://sepolia.rpc.vauban.tech/rpc/v0_10 ; tout fournisseur standard convient aussi bien. Aucun compte ni aucune clé Starknet ne sont nécessaires.

  • contrat : 0x011e92d42cff92edd738ddc9405b3a53b5cce91371c4c520be20e2717f6ac8fa
  • est_ouverte(payer) : sélecteur 0x03600a7e6d7c7be91e03409ac690f0f4547fdb0f5147af3fcd4cc9ef9bbfbf35, calldata [payer], votre adresse EVM en felt hexadécimal simple
curl -s https://sepolia.rpc.vauban.tech/rpc/v0_10 \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"starknet_call","params":[{"contract_address":"0x011e92d42cff92edd738ddc9405b3a53b5cce91371c4c520be20e2717f6ac8fa","entry_point_selector":"0x03600a7e6d7c7be91e03409ac690f0f4547fdb0f5147af3fcd4cc9ef9bbfbf35","calldata":["0xYOUR_EVM_ADDRESS"]},"latest"]}'

L'appel rend 0x1 une fois votre paiement reconnu, 0x0 sinon. S'il rend 0x0 juste après le paiement, refaites l'appel un peu plus tard.

6. Payer avec des fonds réels

Les étapes sont les mêmes. Ce qui change :

  • l'URL de l'offre, le réseau, l'actif et le bénéficiaire : lisez-les dans l'offre, comme à l'étape 3 ;
  • votre consentement à dépenser de l'argent réel, réseau par réseau, dans PAY_MCP_EVM_I_ACCEPT_MAINNET_SPEND ;
  • sur Ethereum, le contrat USDC dans PAY_MCP_EVM_ASSETS ;
  • le point d'accès et le contrat de ressource Starknet mainnet, nommés par l'offre.

Besoin d'une carte ou d'un paiement privé ? Contactez-nous.