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¶
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_resourceonhttps://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 :
// 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électeur0x03600a7e6d7c7be91e03409ac690f0f4547fdb0f5147af3fcd4cc9ef9bbfbf35, 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.