Publication
Partagez vos connaissances.
+15
Erreur Sui Move - Impossible de traiter la transaction Aucune pièce de gaz valide n'a été trouvée pour la transaction
Quand je fais ça :
//Séparer le paiement de la pièce principale const [PaymentCoin] = TX.SplitCoins ( tx.object (PrimaryCoin.CoinObjectId), [tx.pure.u64 (montant de paiement requis)] ) ;
//Utilisez la pièce originale pour le paiement de l'essence TX.setGasPayment ([{ ID de l'objet : PrimaryCoin.CoinObjectID, version : PrimaryCoin.version, résumé : PrimaryCoin.Digest }]) ;
Tx. Budget gazier fixe (10_000_000) ; Il se plaint du fait que les objets mutables ne peuvent pas apparaître plus d'une fois dans une transaction. Lorsque je supprime le paiement du gaz, il se plaint « Impossible de traiter la transaction » Aucune pièce de gaz valide n'a été trouvée pour la transaction. ». Ma fonction de contrat accepte 0,01 sui en échange d'un NFT
- Sui
- Transaction Processing
- Move
Réponses
19You are running into a core Sui Move and Sui transaction model restriction: the same coin object cannot be used both as a gas coin and as an input to another command in the same transaction. This is enforced to prevent double-spending and ensure transaction safety.
Why this happens
- When you use
primaryCoin
insplitCoins
, it becomes a mutable input to the transaction. - When you also set it as the gas coin (
setGasPayment
), you are trying to use the same object in two roles. - Sui does not allow a mutable object (like a coin being split) to also be used as the gas coin in the same transaction.
This is confirmed by the error in your context:
mutatable objects cannot appear more than one in one transaction
And in the Sui Move test context:
Invalid taking of the Gas coin. It can only be used by-value with TransferObjects
(see source)
What you need to do
You must use a different coin for gas than the one you are splitting or otherwise mutating in the transaction.
Solution
- Ensure you have at least two SUI coins in your wallet.
- Use one coin for splitting/payment, and another for gas.
Example Flow
Suppose you have two coins: primaryCoin
and gasCoin
.
// Split payment from primary coin (not used for gas)
const [paymentCoin] = tx.splitCoins(
tx.object(primaryCoin.coinObjectId),
[tx.pure.u64(requiredPaymentAmount)]
);
// Set a different coin for gas payment
tx.setGasPayment([{
objectId: gasCoin.coinObjectId,
version: gasCoin.version,
digest: gasCoin.digest
}]);
tx.setGasBudget(10_000_000);
primaryCoin
is used for splitting and payment.gasCoin
is used only for gas.
If you only have one coin, you must first split it in a separate transaction, so you have two coins for the next transaction.
References
This is a fundamental design choice in Sui to ensure transaction safety and prevent double-spending. It can be confusing at first, but once you get used to always keeping at least two coins in your wallet (one for gas, one for other operations), it becomes second nature. If you ever run into this error, just remember: never use the same coin for both gas and as a mutable input in the same transaction
Always select a distinct coin object for gas payment, separate from any coin you intend to mutate or transfer. If you only have one coin, split it in a prior transaction to create a second coin object for subsequent operations.
Vous êtes confronté à une contrainte de conception de transaction Sui Move courantele même objet de pièce ne peut pas être utilisé à la fois comme entrée mutable (par exemple, pour le fractionnement ou le transfert) et comme pièce de gaz dans une seule transaction.
Pourquoi cela se produit
- Lorsque vous utilisez tx.SplitCoins (tx.object (PrimaryCoin.CoinObjectId),...), vous marquez PrimaryCoin comme entrée mutable.
- Lorsque vous le définissez également comme pièce à gaz avec tx.setGasPayment (...), Sui voit le même objet utilisé dans deux rôles, ce qui n'est pas autorisé.
- Si vous supprimez le paiement du gaz, Sui ne trouve pas de pièce de gaz valide, d'où l'erreur « Aucune pièce de gaz valide trouvée pour la transaction ».
À partir du contexte :
État des effets de la transaction : utilisation non valide de la valeur. Les valeurs empruntées de manière mutable nécessitent une utilisation unique. Les valeurs empruntées de manière immuable ne peuvent pas être prises ou empruntées de manière mutante. Les valeurs prises ne peuvent pas être réutilisées. (source)
Comment réparer
Vous devez utiliser pour l'essence une pièce différente de celle que vous divisez ou transférez.
La solution : ayez au moins deux pièces SUI dans votre portefeuille. Utilisez-en un pour le paiement (fractionnement/transfert) et un autre pour le gaz.
Exemple de flux
- Sélectionnez deux pièces :
- PrimaryCoin (pour le paiement)
- GasCoin (pour le gaz)
- Divisez et payez avec PrimaryCoin :
const [paymentCoin] = tx.splitCoins(
tx.object(primaryCoin.coinObjectId),
[tx.pure.u64(requiredPaymentAmount)]
);
- Réglez le paiement du gaz avec GasCoin :
tx.setGasPayment([{
objectId: gasCoin.coinObjectId,
version: gasCoin.version,
digest: gasCoin.digest
}]);
tx.setGasBudget(10_000_000);
N'utilisez pas le même objet pour le paiement et l'essence.
Ma référence
L'erreur se produit car vous essayez d'utiliser l'primaryCoin
objet d'origine(qui est consommé pendant l'splitCoins
opération) pour payer le gaz. Après la division, la version ou le résumé de la pièce originale deviennent invalides, ce qui entraîne l'erreur « Les objets mutables ne peuvent pas apparaître plus d'un » lorsqu'elle est référencée à nouveau.
Pour résoudre ce problème, ne définissez pas manuellement le paiement du gaz à l'aide de l'primaryCoin
objet pré-divisé. Et assurez-vous d'avoir primaryCoin
un solde suffisant pour couvrir à la fois :
- Le montant du paiement (
requiredPaymentAmount
= 0,01 SUI) - Le budget du gaz (
10_000_000
= 0,01 SUI) → Total nécessaire :≥ 0,02 SUI
Il suffit d'essayer
// Split payment from primary coin (leaves remaining balance in primaryCoin)
const [paymentCoin] = tx.splitCoins(
tx.object(primaryCoin.coinObjectId),
[tx.pure.u64(requiredPaymentAmount)]
);
// DO NOT setGasPayment manually - SDK auto-uses updated primaryCoin for gas
tx.setGasBudget(10_000_000); // Gas paid from primaryCoin's remaining balance
Bravo!!!
Pour résoudre le problème que vous rencontrez avec l'erreur de transaction Sui concernant l'absence de pièces de gaz valides ou l'apparition d'objets modifiables plusieurs fois, c'est parce que vous ne pouvez pas utiliser la même pièce à la fois pour fractionner le paiement et couvrir les frais de gaz, car les pièces d'essence doivent rester séparées des articles que vous modifiez dans le cadre de la transaction. La solution la plus simple consiste à fractionner le paiement directement à partir de la source de gaz au lieu de votre pièce principale, alors remplacez-le par quelque chose comme
const paymentCoin = tx.splitCoins(tx.gas(), [tx.pure.u64(requiredPaymentAmount)]);
puis supprimez complètement la ligne de paiement manuel de l'essence, car le système le récupérera tout seul, et maintenez votre budget d'essence comme d'habitude. Cela vous permet de retirer la pièce d'essence sans vous heurter, à condition que votre portefeuille soit suffisant pour gérer le paiement à 0,01 Sui plus les frais.
Cela se produit parce que vous essayez d'utiliser le même objet de monnaie (primaryCoin
) à la fois pour le paiement du gaz et comme entréesplitCoins
, ce qui en fait une référence mutable utilisée dans deux contextes différents — et Sui ne l'autorise pas pour des raisons de sécurité et de logique linéaire (puisque les pièces sont des objets linéaires).
À mon humble avis, la méthode consiste à ne pas régler manuellement le paiement de l'essence. Laissez simplement le portefeuille/client Sui sélectionner automatiquement la pièce de gaz appropriée. À utiliser uniquement setGasPayment
si vous avez vraiment besoin de spécifier quelle pièce permet de payer l'essence (par exemple, des portefeuilles multipièces, une gestion spécifique du gaz). Sinon, évitez-le.
Essayez ce qui suit :
// Split the primary coin to get a payment coin
const [paymentCoin] = tx.splitCoins(
tx.object(primaryCoin.coinObjectId),
[tx.pure.u64(requiredPaymentAmount)]
);
// Do your call that sends .01 SUI and gets an NFT
tx.moveCall({
target: `${packageId}::your_module::buy_nft`,
arguments: [
paymentCoin,
// other args...
],
});
// DO NOT set gas payment manually
// tx.setGasPayment(...) ← Remove this line
// Optional: set budget
tx.setGasBudget(10_000_000);
// Send the transaction
const result = await signer.signAndExecuteTransactionBlock({
transactionBlock: tx,
options: { showEffects: true },
});
Sui va :
- Choisissez automatiquement une pièce de gaz (il peut s'agir de la même pièce SUI ou d'une autre dans le portefeuille).
- Manipulez-les en
splitCoins
toute sécurité. - Utilisez unepièce différente(ou parfois la même, mais manipulée en toute sécurité grâce à une gestion des versions d'objets appropriée).
Important : tant que votre portefeuille contient au moins 1 dollar SUI pour couvrir l'essence, cela fonctionnera.
Ce problème se produit parce que vous utilisez la même pièce (PrimaryCoin) à la fois pour le gaz et comme entrée dans SplitCoins, ce qui n'est pas autorisé dans Sui en raison de ses règles relatives aux objets linéaires et à la mutation sûre.
Pour résoudre ce problème, ne définissez pas manuellement le paiement du gaz. Laissez le portefeuille ou le client Sui sélectionner automatiquement une pièce de gaz appropriée. Vous n'avez besoin de SetGasPayment que dans les cas avancés (comme un contrôle précis des pièces). Voici l'approche propre :
// Split the primary coin to create a new payment coin
const [paymentCoin] = tx.splitCoins(
tx.object(primaryCoin.coinObjectId),
[tx.pure.u64(requiredPaymentAmount)]
);
// Call your function using the new coin
tx.moveCall({
target: ${packageId}::your_module::buy_nft,
arguments: [paymentCoin],
});
// No manual gas setting — remove tx.setGasPayment(...)
// Set your gas budget
tx.setGasBudget(10_000_000);
// Execute the transaction
const result = await signer.signAndExecuteTransactionBlock({
transactionBlock: tx,
options: { showEffects: true },
});
Sui choisira en toute sécurité une pièce d'essence dans votre portefeuille (tant qu'il en reste une) et s'occupera de tout dans les coulisses
This error happens because you’re trying to use the same coin both as the gas object and for a split operation, which breaks Sui’s rule against having two mutable references to the same object in one transaction. Splitting primaryCoin modifies it while also producing a new coin, and both can’t coexist in the same transaction. To fix this, you should:
* Use separate coins: one dedicated for gas, another for splitting or payments.
* Or, merge enough balance from another coin into primaryCoin before the transaction so it can cover all costs without duplication.
In short: always ensure that the coin used for gas is different from the one being split or passed into contract calls to prevent conflicts.
Problèmes
Vous rencontrez deux problèmes principaux :
1.Erreur de mutabilité : Si vous tentez d'utiliser la même pièce pour le paiement du gaz et pour la saisie des transactions, l'erreur suivante s'affiche : « Les objets mutables ne peuvent pas apparaître plus d'une fois au cours d'une transaction ».
2.Pièce de gaz manquante : sans pièce d'essence valide, le message d'erreur « Impossible de traiter la transaction : aucune pièce de gaz valide n'a été trouvée pour la transaction » s'affiche.
Solution
Pour résoudre ces problèmes :
1.Divisez la pièce principale pour le paiement : utilisez-la tx.splitCoins
pour créer une nouvelle pièce pour l'achat du NFT, en vous assurant qu'elle est distincte du paiement de l'essence.
-
tx.setGasPayment
Définissez une pièce d'essence séparée : attribuez une pièce différente pour le paiement de l'essence à l'aide de. -
tx.setGasBudget
Définissez le budget du gaz : définissez un budget de gaz approprié à l'aide de.
Code
// Step 1: Split the primary coin for payment
const [paymentCoin] = tx.splitCoins(
tx.object(primaryCoin.coinObjectId),
[tx.pure.u64(requiredPaymentAmount)]
);
// Step 2: Set a separate gas payment coin
const gasCoin = tx.object(gasCoinObjectId);
tx.setGasPayment([{
objectId: gasCoin.coinObjectId,
version: gasCoin.version,
digest: gasCoin.digest
}]);
// Step 3: Set the gas budget for the transaction
tx.setGasBudget(10_000_000);
L'erreur se produit parce que vous essayez dediviser et d'utiliser la même pièce à la fois pour le paiement et l'essence, violant ainsi la règle de Sui interdisant la duplication d'objets mutables lors d'une transaction. Lorsque vous divisezprimaryCoin
, cela crée une nouvelle pièce tout en faisant muter la pièce d'origine. Les deux ne peuvent pas apparaître dans la même transaction. Pour résoudre ce problème,utilisez deux pièces distinctes : l'une pour le paiement du gaz et l'autre pour l'opération de paiement fractionné. Vous pouvez égalementfusionner suffisamment de gaz provenant d'une autre pièceprimaryCoin
avant la transaction pour couvrir les deux coûts, en vous assurant qu'il n'existe qu'une seule référence mutable. Vérifiez toujours que les pièces de gaz sont distinctes de celles qui sont partagées ou utilisées dans le cadre d'appels de contrats afin d'éviter les conflits.
J'espère que tu as une solution à ça, non ?
Vous ne pouvez pas utiliser lamême pièceà la fois pour le paiement et pour l'essence. Corriger :
1.Split Gas First— Créez une pièce de gaz séparée :
const [gasCoin] = tx.splitCoins(tx.object(primaryCoinId), [tx.pure(10_000_000)]);
tx.setGasPayment([gasCoin]);
2.Puis fractionnez le paiement— Utilisez le solde restant pour votre paiement NFT.
Règle clé : ✔ Chaque pièce ne peut être utilisée qu'une seule fois par transaction**.
**Alternative :**Utilisez deux pièces distinctes (si disponibles).
- (Sui exige des pièces distinctes pour l'essence et les paiements afin d'éviter les conflits. ) *
L'erreur se produit parce que vous essayez d'utiliser la même pièce pour deux choses différentes : le fractionner pour effectuer un paiement et le paiement de l'essence. Le système considère cela comme une tentative d'utiliser un objet de manière mutable deux fois en une seule transaction, ce qui n'est pas autorisé.
Vous avez besoin d'une pièce séparée pour payer l'essence. Voici le correctif :
gasPayment
**Utilisez une autre pièce à gaz :**Trouvez une autre pièce dans la liste des pièces SUI de votre portefeuille pour la spécifier comme. N'utilisez pas ceprimaryCoin
que vous êtes en train de diviser.
2.**Ou, fusionnez d'abord les pièces :**Si vous n'avez qu'une seule pièce, vous devrez peut-être d'abord y fusionner des pièces plus petites pour créer une pièce de gaz distincte. Utilisez ensuite l'un pour le fractionnement et le paiement et l'autre pour l'essence.
L'essentiel est que la pièce que vous utilisez setGasPayment
soit complètement distincte de toutes les pièces que vous divisez ou utilisez dans les commandes de la transaction.
Bravo!!!
That error on Sui:
“Unable to process transaction – No valid gas coins found for the transaction”
means your wallet doesn’t currently have any SUI tokens that can be used as gas fees. Every transaction on Sui — whether sending tokens, minting NFTs, or interacting with dApps — requires a small amount of SUI to pay for gas.
🔍 Why It Happens
- No SUI balance: You don’t have any SUI in your wallet.
- Coin is too small: Sometimes SUI is “locked” in very tiny amounts (dust coins) that are not enough to cover gas.
- Wrong network: You may be on Testnet or Devnet but don’t have test SUI loaded.
- Wallet not refreshed: Rarely, the wallet UI lags behind and doesn’t recognize available coins.
✅ How to Fix It
If You’re on Mainnet
-
Get some SUI tokens
- Buy SUI from an exchange (Binance, KuCoin, OKX, etc.) and withdraw to your wallet.
- Or receive SUI from a friend/wallet that already has some.
-
Check for Coin Splitting
- Sometimes you have SUI, but it’s fragmented into unusable “dust.”
- Use the “Merge Coins” feature in Sui Wallet (found under your SU
-
Use a Faucet
-
Go to the official Sui faucet: https://faucet.sui.io
-
Or, on Discord (in the Sui Discord server), go to the #testnet-faucet channel and type:
!faucet <your_sui_address>
-
This will send you free testnet SUI.
-
-
Switch Networks Properly
- In your Sui Wallet extension → click profile icon → select Testnet or Devnet depending on where you’re working.
⚠️ Tip
Always keep a small reserve of SUI in your wallet for gas (like 0.05–0.1 SUI). If you send your entire balance out, you won’t have gas left to make the next transaction.
Do you want me to walk you through getting testnet SUI from the faucet right now, or are you running into this issue on mainnet with real tokens?
Connaissez-vous la réponse ?
Veuillez vous connecter et la partager.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gagne ta part de 1000 Sui
Gagne des points de réputation et obtiens des récompenses pour avoir aidé la communauté Sui à se développer.
- Comment maximiser la détention de profits SUI : Sui Staking contre Liquid Staking615
- Pourquoi BCS exige-t-il un ordre de champs exact pour la désérialisation alors que les structures Move ont des champs nommés ?65
- « Erreurs de vérification de sources multiples » dans les publications du module Sui Move - Résolution automatique des erreurs55
- Erreur Sui Move - Impossible de traiter la transaction Aucune pièce de gaz valide n'a été trouvée pour la transaction419
- Échec de la transaction Sui : objets réservés pour une autre transaction410