Comment fonctionnent les paiements sur Solana

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 traditionnelSolanaDescription
ID client / Numéro de compteAdresse de portefeuilleIdentifiant unique pour un titulaire de compte
Devise (USD, EUR)Token Mint (USDG, USDC)Le type d'actif transféré
Solde par deviseToken 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ÉmetteurAdresse de mint
USDCCircleEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
USDTTetherEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
PYUSDPayPal2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo
USDGPaxos2u1tszSeqZ3qBWF3uNGPFc8TzMk2tdiwknnRMWGWjGWH

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 accountsToken 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.

  1. Un ATA par mint. Un portefeuille a exactement un ATA pour USDC, un pour USDT, etc.
  2. Doit exister avant réception. Vous ne pouvez pas envoyer de jetons vers un ATA qui n'existe pas.
  3. 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 :

ProgrammeAdresseExemples de tokens qui
utilisent ce programme
Token ProgramTokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DAUSDC, USDT
Token-2022TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbPYUSD, 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 Program
const [usdcAta] = await findAssociatedTokenPda({
mint: USDC_MINT,
owner: walletAddress,
tokenProgram: TOKEN_PROGRAM_ADDRESS // ✓ Correct
});
// ❌ This will produce a different address because it uses the wrong program
const [wrongUsdcAta] = await findAssociatedTokenPda({
mint: USDC_MINT,
owner: walletAddress,
tokenProgram: TOKEN_2022_PROGRAM_ADDRESS // ❌ Wrong program
});
// PYUSD uses Token-2022
const [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 using
const 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 token
const 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 fraisSOLUSD (est.)Quand
Frais de transaction de base5 000 lamports*~0,0007 $Chaque transaction (regroupez plusieurs paiements pour amortir)
Frais de prioritéVariableVariableOptionnel ; 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 :

  1. 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.
  2. Dériver les ATA. Déterminez les comptes de jetons pour les deux parties.
  3. Construire et signer. Construisez la transaction avec les instructions de transfert nécessaires, signez avec la clé de l'expéditeur.
  4. Envoyer et confirmer. La transaction est réglée en moins d'une seconde.

Prochaines étapes


* un lamport est la plus petite unité de SOL et équivaut à 0,000000001 SOL

Is this page helpful?

Table des matières

Modifier la page

Géré par

© 2026 Fondation Solana.
Tous droits réservés.
Restez connecté