Avant de créer des flux de paiement sur Solana, vous devez comprendre cinq concepts fondamentaux : les portefeuilles, les stablecoins, les token accounts, les frais et les transactions. Les paiements Solana correspondent parfaitement aux systèmes de paiement multi-devises :
| Modèle de paiement traditionnel | Solana | Description |
|---|---|---|
| ID client / Numéro de compte | Adresse de portefeuille | Identifiant unique pour un titulaire de compte |
| Devise (USD, EUR) | Token Mint (USDG, USDC) | Le type d'actif transféré |
| Solde par devise | Token Account (ATA) | Détient un solde d'une devise/mint spécifique |
Tout comme un client bancaire possède une seule identité mais détient des soldes distincts pour chaque devise, un portefeuille Solana a une seule adresse mais un token account distinct pour chaque actif qu'il détient. Détaillons chaque composant.
Portefeuilles : expéditeurs et destinataires
Chaque paiement implique deux parties, chacune identifiée par une adresse de
portefeuille—une clé publique unique de 32 octets (par exemple, 7EcDhS...).
- Expéditeur : le portefeuille qui initie le paiement. Doit détenir un solde de token account en stablecoin suffisant et signer la transaction.
- Destinataire : le portefeuille de destination. N'a pas besoin de signer ni de détenir un solde existant.
- Payeur de frais : le portefeuille payeur de frais optionnel. Peut être utilisé pour subventionner ou permettre des transactions en stablecoin uniquement entre utilisateurs.
Considérez les adresses de portefeuille comme des numéros de compte bancaire : publiques, sûres à partager et nécessaires pour envoyer ou recevoir des fonds.
Stablecoins
Les stablecoins sont appelés « tokens » sur Solana. Les tokens représentent un type d'actif sur le réseau. Chaque token possède un identifiant unique appelé « adresse de mint ». Lors de la création de systèmes de paiement, vous référencerez ces adresses de mint pour identifier l'actif avec lequel vous interagissez. Voici quelques adresses de mint de stablecoins courantes sur le mainnet :
| Jeton | Émetteur | Adresse de mint |
|---|---|---|
| USDC | Circle | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
| USDT | Tether | Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB |
| PYUSD | PayPal | 2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo |
| USDG | Paxos | 2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH |
Pour plus d'informations sur les stablecoins sur Solana, consultez la page de solution Stablecoins.
Lors de l'acceptation de paiements, validez toujours l'adresse de mint et le Token Program. Les jetons peuvent partager des noms mais avoir des émetteurs et des actifs sous-jacents différents.
Token accounts
Les portefeuilles ne détiennent pas directement les jetons. Au lieu de cela, chaque portefeuille a autorité sur un token account pour chaque type de jeton qu'il détient. Les paiements sont effectués en transférant des jetons du token account d'un expéditeur vers le token account d'un destinataire du même mint :
Token accounts
Un associated token account est un token account déterministe lié à un portefeuille et un mint spécifiques. Étant donné une adresse de portefeuille et un mint, l'adresse ATA est toujours la même.
- Un ATA par mint. Un portefeuille a exactement un ATA pour USDC, un pour USDT, etc.
- Doit exister avant réception. Vous ne pouvez pas envoyer de jetons vers un ATA qui n'existe pas.
- L'expéditeur crée généralement. Si l'ATA du destinataire n'existe pas, l'expéditeur peut le créer dans le cadre de la transaction de paiement.
import { findAssociatedTokenPda } from "@solana-program/token";const [receiverATA] = await findAssociatedTokenPda({mint: USDG_MINT_ADDRESS,owner: receiverWallet.address,tokenProgram: TOKEN_PROGRAM_ADDRESS});
Token Programs
Sur Solana, les programmes sont une logique exécutable qui régit l'état des comptes. Les token accounts sont gérés par un Token Program — le code on-chain qui vérifie les transferts et met à jour les soldes de manière atomique.
Solana dispose de deux Token Programs :
| Programme | Adresse | Exemples de tokens qui utilisent ce programme |
|---|---|---|
| Token Program | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | USDC, USDT |
| Token-2022 | TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb | PYUSD, USDG |
Token-2022 (également appelé "Token Extensions") ajoute des fonctionnalités telles que les hooks de transfert, les frais de transfert et les transferts confidentiels. Les deux programmes fonctionnent de manière similaire pour les transferts de base, mais vous devez utiliser le bon lors de la dérivation des ATA.
Pourquoi c'est important
Le Token Program utilisé pour créer un token régit les instructions et l'état du compte pour le token. Si vous utilisez le mauvais programme, vous ne pourrez pas transférer le token.
Les ATA sont dérivés de trois entrées : wallet + mint + token_program.
L'utilisation du mauvais programme produit une adresse entièrement
différente :
import {findAssociatedTokenPda,TOKEN_PROGRAM_ADDRESS} from "@solana-program/token";import { TOKEN_2022_PROGRAM_ADDRESS } from "@solana-program/token-2022";// USDC uses Token Programconst [usdcAta] = await findAssociatedTokenPda({mint: USDC_MINT,owner: walletAddress,tokenProgram: TOKEN_PROGRAM_ADDRESS // ✓ Correct});// ❌ This will produce a different address because it uses the wrong programconst [wrongUsdcAta] = await findAssociatedTokenPda({mint: USDC_MINT,owner: walletAddress,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS // ❌ Wrong program});// PYUSD uses Token-2022const [pyusdAta] = await findAssociatedTokenPda({mint: PYUSD_MINT,owner: walletAddress,tokenProgram: TOKEN_2022_PROGRAM_ADDRESS // ✓ Correct});
Dériver un ATA avec le mauvais programme produira une adresse invalide. Faites toujours correspondre le programme au mint du token.
Le même principe s'applique aux instructions de transfert. Chaque token program possède sa propre instruction de transfert, et vous devez invoquer la bonne :
import { getTransferInstruction } from "@solana-program/token";import { getTransferInstruction as getTransferInstruction22 } from "@solana-program/token-2022";// For USDC (Token Program)const usdcTransferIx = getTransferInstruction({source: senderUsdcAta,destination: receiverUsdcAta,authority: senderWallet,amount: 1_000_000n // 1 USDC (6 decimals)});// For PYUSD (Token-2022)const pyusdTransferIx = getTransferInstruction22({source: senderPyusdAta,destination: receiverPyusdAta,authority: senderWallet,amount: 1_000_000n // 1 PYUSD (6 decimals)});// *Note*: Most token program JS Client functions include the ability// to specify the token program address. Generally, defining it is a// good practice to ensure you are fully aware of the program you are usingconst usdcTransferIx2 = getTransferInstruction({source: senderUsdcAta,destination: receiverUsdcAta,authority: senderWallet,amount: 1_000_000n // 1 USDC (6 decimals)},{ tokenProgram: TOKEN_PROGRAM_ADDRESS });
L'envoi d'une instruction de transfert au mauvais programme échouera. Le programme valide qu'il possède les token accounts impliqués — les comptes créés par Token Program ne peuvent pas être transférés via Token-2022, et vice versa.
Pour vérifier quel programme utilise un token ou un token account, récupérez le
mint ou le token account et vérifiez son champ owner :
import { createSolanaRpc, address } from "@solana/kit";const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");const accountInfo = await rpc.getAccountInfo(address(mintAddress)).send();// The owner field tells you which program manages this tokenconst tokenProgram = accountInfo.value?.owner;// Returns: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA (Token Program)// or: TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb (Token-2022)
Pour les applications de paiement, stockez l'adresse du programme correct aux côtés de chaque token pris en charge :
const SUPPORTED_TOKENS = {USDC: {mint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",program: TOKEN_PROGRAM_ADDRESS,decimals: 6},PYUSD: {mint: "2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo",program: TOKEN_2022_PROGRAM_ADDRESS,decimals: 6}};
Token Extensions
Le Token Extensions Program (Token 2022) fournit davantage de fonctionnalités via des instructions supplémentaires appelées extensions. Les extensions sont des fonctionnalités optionnelles que vous pouvez ajouter à un mint de jeton ou à un compte de jeton.
Pour plus d'informations sur les Token Extensions, consultez la documentation Token Extensions.
Frais
Les paiements Solana impliquent jusqu'à trois composantes de coût :
| Type de frais | SOL | USD (est.) | Quand |
|---|---|---|---|
| Frais de transaction de base | 5 000 lamports* | ~0,0007 $ | Chaque transaction (regroupez plusieurs paiements pour amortir) |
| Frais de priorité | Variable | Variable | Optionnel ; inclusion plus rapide en cas de congestion |
| Création de compte (rent) | ~0,0029 SOL | ~0,40 $ | Uniquement lors de la création d'un nouveau token account |
Coût total par paiement : moins de 0,001 $ pour la plupart des transferts. Si vous créez un nouveau token account, comptez environ 0,40 $ au total.
Solana utilise des marchés de frais locaux — les transactions de chaque programme ne sont en concurrence qu'avec d'autres transactions ciblant le même état. Cela signifie que les frais de paiement restent bas et prévisibles même pendant les périodes de forte activité réseau ailleurs. Les coûts de rent devraient également diminuer de 50 % dans un avenir proche.
Vous pouvez abstraire entièrement les frais afin que les utilisateurs n'interagissent jamais avec SOL. Consultez Abstraction des frais pour les modèles d'implémentation.
Transactions et instructions
Une transaction est l'unité d'exécution atomique sur Solana — soit toutes les opérations réussissent, soit aucune. Chaque transaction contient une ou plusieurs instructions, qui sont des commandes individuelles (par exemple, « transférer 10 USDC », « créer un token account »).
Une transaction de paiement typique peut inclure deux instructions : créer le token account du destinataire (si nécessaire), puis transférer les jetons. Les deux s'exécutent de manière atomique — aucun état partiel. Comme vous le verrez dans Traitement des paiements, vous pouvez regrouper plusieurs paiements dans une seule transaction pour réduire les coûts et augmenter le débit.
Assembler le tout
Un flux de paiement typique :
- Collecter les données. Obtenez les adresses de portefeuille de l'expéditeur et du destinataire ainsi que l'adresse de mint du jeton à transférer.
- Dériver les ATA. Déterminez les comptes de jetons pour les deux parties.
- Construire et signer. Construisez la transaction avec les instructions de transfert nécessaires, signez avec la clé de l'expéditeur.
- Envoyer et confirmer. La transaction est réglée en moins d'une seconde.
Prochaines étapes
Interagir avec Solana
Connectez-vous au réseau et explorez les données de paiement Solana.
Envoyez votre premier paiement
Construisez et envoyez un transfert de stablecoin.
* un lamport est la plus petite unité de SOL et équivaut à 0,000000001 SOL
Is this page helpful?