Déployer des contrats sur Base
Prérequis
- Configurer le point de terminaison RPC (testnet :
sepolia.base.org, mainnet :mainnet.base.org) - Stocker les clés privées dans le keystore chiffré de Foundry — ne jamais committer les clés
- Obtenir du ETH testnet depuis la faucet CDP (testnet uniquement)
- Obtenir une clé API BaseScan pour la vérification des contrats
Sécurité
- Ne jamais committer les clés privées dans le contrôle de version — utiliser le keystore chiffré de Foundry (
cast wallet import) - Ne jamais coder en dur les clés API dans les fichiers source — utiliser des variables d'environnement ou
foundry.tomlavec des références${ENV_VAR} - Ne jamais exposer les fichiers
.env— ajouter.envà.gitignore - Utiliser des fournisseurs RPC de production (pas des points de terminaison publics) pour les déploiements mainnet afin d'éviter les limites de débit et les fuites de données
- Vérifier les contrats sur BaseScan pour permettre un audit public du code déployé
Validation des entrées
Avant de construire des commandes shell, valider toutes les valeurs fournies par l'utilisateur :
- contract-path : Doit correspondre à
^[a-zA-Z0-9_/.-]+\.sol:[a-zA-Z0-9_]+$. Rejeter les chemins avec espaces, points-virgules, pipes ou backticks. - rpc-url : Doit être une URL HTTPS valide (
^https://[^\s;|&]+$). Rejeter les URLs non-HTTPS ou malformées. - keystore-account : Doit être alphanumérique avec tirets/traits de soulignement (
^[a-zA-Z0-9_-]+$). - etherscan-api-key : Doit être alphanumérique (
^[a-zA-Z0-9]+$).
Ne pas passer d'entrée utilisateur non validée dans les commandes shell.
Obtenir du ETH testnet via la faucet CDP
ETH testnet est nécessaire pour payer le gaz sur Base Sepolia. Utiliser la faucet CDP pour le réclamer. Tokens supportés : ETH, USDC, EURC, cbBTC. Les réclamations ETH sont limitées à 0,0001 ETH par réclamation, 1000 réclamations par 24 heures.
Option A : Interface du portail CDP (recommandée pour une configuration rapide)
Comportement de l'agent : Si vous avez accès au navigateur, naviguer vers le portail et réclamer directement. Sinon, demander à l'utilisateur de compléter ces étapes et fournir l'adresse du portefeuille financé.
- Se connecter au portail CDP (créer un compte sur portal.cdp.coinbase.com/create-account si nécessaire)
- Aller à Faucets
- Sélectionner le réseau Base Sepolia
- Sélectionner le token ETH
- Entrer l'adresse du portefeuille et cliquer sur Claim
- Vérifier sur sepolia.basescan.org que les fonds sont arrivés
Option B : Programmation via SDK CDP
Nécessite une clé API CDP et un secret de portefeuille.
npm install @coinbase/cdp-sdk dotenv
import { CdpClient } from "@coinbase/cdp-sdk";
import dotenv from "dotenv";
dotenv.config();
const cdp = new CdpClient();
const account = await cdp.evm.createAccount();
const faucetResponse = await cdp.evm.requestFaucet({
address: account.address,
network: "base-sepolia",
token: "eth",
});
console.log(`Funded: https://sepolia.basescan.org/tx/${faucetResponse.transactionHash}`);
Variables d'environnement nécessaires dans .env :
CDP_API_KEY_ID=your-api-key-id
CDP_API_KEY_SECRET=your-api-key-secret
CDP_WALLET_SECRET=your-wallet-secret
Pour financer un portefeuille existant au lieu d'en créer un nouveau, passer son adresse directement à requestFaucet.
Obtenir une clé API BaseScan
Une clé API BaseScan est nécessaire pour que le drapeau --verify vérifie automatiquement les contrats sur BaseScan. BaseScan utilise le même système de compte qu'Etherscan.
Comportement de l'agent : Si vous avez accès au navigateur, naviguer vers le site BaseScan et créer la clé. Sinon, demander à l'utilisateur de compléter ces étapes et fournir la clé API.
- Aller à basescan.org/myapikey (ou etherscan.io/myapikey — le même compte fonctionne)
- Se connecter ou créer un compte gratuit
- Cliquer sur Add pour créer une nouvelle clé API
- Copier la clé et la définir dans votre environnement :
export ETHERSCAN_API_KEY=your-basescan-api-key
Sinon, la passer directement à forge :
forge create ... --etherscan-api-key <your-key>
Ou l'ajouter à foundry.toml :
[etherscan]
base-sepolia = { key = "${ETHERSCAN_API_KEY}", url = "https://api-sepolia.basescan.org/api" }
base = { key = "${ETHERSCAN_API_KEY}", url = "https://api.basescan.org/api" }
Commandes de déploiement
Testnet
forge create src/MyContract.sol:MyContract \
--rpc-url https://sepolia.base.org \
--account <keystore-account> \
--verify \
--etherscan-api-key $ETHERSCAN_API_KEY
Mainnet
forge create src/MyContract.sol:MyContract \
--rpc-url https://mainnet.base.org \
--account <keystore-account> \
--verify \
--etherscan-api-key $ETHERSCAN_API_KEY
Points clés
- Format du contrat :
<contract-path>:<contract-name> - Le drapeau
--verifyvérifie automatiquement sur BaseScan (nécessite une clé API) - Explorateurs : basescan.org (mainnet), sepolia.basescan.org (testnet)
- Docs faucet CDP : docs.cdp.coinbase.com/faucets
Problèmes courants
| Erreur | Cause |
|---|---|
nonce has already been used |
Synchronisation du nœud incomplète |
| La transaction échoue | ETH insuffisant pour le gaz — réclamer depuis la faucet |
| La vérification échoue | Mauvais point de terminaison RPC pour le réseau cible |
| Vérification 403/unauthorized | Clé API BaseScan manquante ou invalide |