Beitrag
Teile dein Wissen.
+15
Sui Move Error - Transaktion kann nicht verarbeitet werden Keine gültigen Gasmünzen für die Transaktion gefunden
Wenn ich das mache:
//Zahlung von der Primärmünze trennen const [PaymentCoin] = tx.SplitCoins ( tx.object (PrimaryCoin.CoinObjectID), [tx.pure.u64 (erforderlicher Zahlungsbetrag)] );
//Verwende die Originalmünze für die Gaszahlung tx.setGasPayment ([{ ObjektID: PrimaryCoin.CoinObjectID, Version: PrimaryCoin.Version, verdauen: PrimaryCoin.digest }]);
tx.setGasBudget (10_000_000); Es beschwert sich darüber, dass veränderbare Objekte nicht mehr als eines in einer Transaktion vorkommen können. Wenn ich die Gaszahlung entferne, beschwert es sich: „Transaktion kann nicht verarbeitet werden Für die Transaktion wurden keine gültigen Gasmünzen gefunden.“. Meine Vertragsfunktion akzeptiert 0,01 Sui als Gegenleistung für eine NFT
- Sui
- Transaction Processing
- Move
Antworten
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.
Sie stoßen auf eine allgemeine Sui Move-Transaktionsdesign-Einschränkungdasselbe Münzobjekt kann nicht sowohl als veränderbare Eingabe (z. B. zum Teilen oder Übertragen) als auch als Gasmünze in einer einzigen Transaktion verwendet werden.
Warum passiert das
- Wenn Sie tx.SplitCoins (tx.object (PrimaryCoin.CoinObjectID),...) verwenden, markieren Sie PrimaryCoin als veränderbare Eingabe.
- Wenn Sie es auch mit tx.setGasPayment (...) als Gascoin festlegen, sieht Sui, dass dasselbe Objekt in zwei Rollen verwendet wird, was nicht erlaubt ist.
- Wenn Sie die Gaszahlung entfernen, kann Sui keine gültige Gasmünze finden, daher der Fehler „Keine gültigen Gasmünzen für die Transaktion gefunden“.
Aus dem Kontext:
Status der Transaktionseffekte: Ungültige Verwendung des Werts. Veränderlich entliehene Werte erfordern eine eindeutige Verwendung. Unveränderlich geliehene Werte können nicht übernommen oder veränderlich geliehen werden. Übernommene Werte können nicht erneut verwendet werden. (Quelle)
Wie behebt man
Sie müssen eine andere Münze für Gas verwenden als die, die Sie teilen oder übertragen.
Die Lösung: Halten Sie mindestens zwei SUI-Münzen in Ihrer Brieftasche bereit. Verwende eine für die Zahlung (Aufteilen/Übertragen) und eine andere für Benzin.
Beispiel für einen Ablauf
- Wählen Sie zwei Münzen aus:
- PrimaryCoin (zur Zahlung)
- GasCoin (für Gas)
- Teilen und mit PrimaryCoin bezahlen:
const [paymentCoin] = tx.splitCoins(
tx.object(primaryCoin.coinObjectId),
[tx.pure.u64(requiredPaymentAmount)]
);
- Stellen Sie die Gaszahlung mit GasCoin ein:
tx.setGasPayment([{
objectId: gasCoin.coinObjectId,
version: gasCoin.version,
digest: gasCoin.digest
}]);
tx.setGasBudget(10_000_000);
Verwenden Sie nicht dasselbe Münzobjekt sowohl für die Zahlung als auch für das Benzin.
Meine Referenz
Der Fehler tritt auf, weil Sie versuchen, primaryCoin
dasOriginalobjekt(das während des splitCoins
Vorgangs verbraucht wird) als Gaszahlung zu verwenden. Nach dem Teilen der Münze wird die Version/der Digest der Originalmünze ungültig. Bei erneuter Referenz wird der Fehler „Veränderbare Objekte können nicht mehr als ein Objekt vorkommen“ ausgelöst.
primaryCoin
Um das Problem zu beheben, stellen Sie die Gaszahlung nicht manuell mithilfe des Pre-Split-Objekts ein. Und stellen Sie sicher, dass Ihr primaryCoin
Guthaben ausreicht, um beides abzudecken:
- Der Zahlungsbetrag (
requiredPaymentAmount
= 0,01 SUI) - Das Gasbudget (
10_000_000
= 0,01 SUI) → Benötigte Summe:≥ 0,02 SUI
Versuche es einfach
// 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
Gut gemacht!!!
Um das Problem zu beheben, auf das Sie mit dem Sui-Transaktionsfehler stoßen, bei dem keine gültigen Gasmünzen gefunden wurden oder veränderbare Objekte mehr als einmal auftauchen, liegt das daran, dass Sie nicht dieselbe Münze sowohl für die Aufteilung der Zahlung als auch für die Deckung der Gasgebühren verwenden können, da Gasmünzen von den Artikeln getrennt bleiben müssen, die Sie im Angebot anpassen. Die einfache Anpassung besteht darin, die Zahlung direkt von der Gasquelle und nicht von Ihrer Hauptmünze aus aufzuteilen, also ändern Sie sie in etwas wie
const paymentCoin = tx.splitCoins(tx.gas(), [tx.pure.u64(requiredPaymentAmount)]);
Lassen Sie dann die manuelle Gaszahlungsleitung ganz fallen, da das System sie von selbst abholt und Ihr Gasbudget wie gewohnt festgelegt hält. Auf diese Weise können Sie ohne Probleme an der Gasmünze ziehen, solange Ihr Geldbeutel genug hat, um die 0,01 Sui-Zahlung zuzüglich der Gebühren abzudecken.
Das passiert, weil du versuchst, dasselbe Münzobjekt (primaryCoin
) sowohl als Gaszahlung als auch als Eingabe dafür zu verwendensplitCoins
, was es zu einer veränderlichen Referenz macht, die in zwei verschiedenen Kontexten verwendet wird — und Sui erlaubt das aus Sicherheitsgründen und linearer Logik nicht (da Münzen lineare Objekte sind).
Meiner Meinung nach ist es so, dass man die Gaszahlung überhaupt nicht manuell festlegt. Lassen Sie einfach die Sui-Geldbörse/den Kunden automatisch eine geeignete Gasmünze auswählen. Verwenden Sie diese Option nur, setGasPayment
wenn Sie wirklich angeben müssen, mit welcher Münze Sie Benzin bezahlen können (z. B. Geldbörsen mit mehreren Münzen, spezielles Gasmanagement). Andernfalls vermeiden Sie es.
Versuche Folgendes:
// 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 wird:
- Wählen Sie automatisch eine Gasmünze (es könnte dieselbe oder eine andere SUI-Münze in der Brieftasche sein).
- Gehen Sie
splitCoins
sicher damit um. - Verwenden Sie eineandere Münze(oder manchmal dieselbe, aber unter der Haube durch eine korrekte Objektversionierung sicher gehandhabt).
Wichtig: Solange dein Portemonnaie mindestens 1$ SUI hat, mit dem Benzin gedeckt werden kann, funktioniert das.
Dieses Problem tritt auf, weil Sie dieselbe Münze (PrimaryCoin) sowohl für Gas als auch als Eingabe in SplitCoins verwenden, was in Sui aufgrund seiner Regeln für lineare Objekte und sichere Mutationen nicht zulässig ist.
Um das Problem zu beheben, stelle die Gaszahlung nicht manuell ein. Lassen Sie die Sui-Geldbörse oder den Kunden automatisch eine geeignete Gasmünze auswählen. SetGasPayment benötigst du nur in fortgeschrittenen Fällen (wie bei der präzisen Münzkontrolle). Hier ist der saubere Ansatz:
// 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 nimmt sicher eine Gasmünze aus Ihrer Brieftasche (sofern eine verfügbar ist) und kümmert sich um alles hinter den Kulissen
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.
Probleme
Sie stoßen auf zwei Hauptprobleme:
1.Mutabilitätsfehler: Der Versuch, dasselbe Münzobjekt sowohl für die Gaszahlung als auch für die Transaktionseingabe zu verwenden, führt zu dem Fehler: „Veränderbare Objekte können nicht mehr als einmal in einer Transaktion vorkommen.“
2.Fehlende Gasmünze: Ohne eine gültige Gasmünze tritt der Fehler „Transaktion kann nicht verarbeitet werden: Für die Transaktion wurden keine gültigen Gasmünzen gefunden“ auf.
Lösung
Um diese Probleme zu lösen:
1.Teilen Sie die primäre Münze für die Bezahlung: Verwenden Sie diese Optiontx.splitCoins
, um eine neue Münze für den NFT-Kauf zu erstellen und sicherzustellen, dass sie von der Gaszahlung getrennt ist.
-
tx.setGasPayment
Stellen Sie eine separate Gasmünze ein: Weisen Sie der Gaszahlung mit einer anderen Münze zu. -
tx.setGasBudget
Gasbudget definieren: Legen Sie ein geeignetes Gasbudget fest mit.
Kode
// 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);
Der Fehler tritt auf, weil du versuchst,dieselbe Münze zu splitten und dieselbe Münze sowohl für Zahlungen als auch für Benzin zu verwenden, was gegen Suis Regel zur Duplizierung veränderbarer Objekte in einer Transaktion verstößt. Wenn du teilstprimaryCoin
, entsteht eine neue Münze, während gleichzeitig die ursprüngliche Münze mutiert — beide können nicht in derselben Transaktion vorkommen. Um dieses Problem zu lösen,verwenden Sie zwei separate Münzen: eine für die Gaszahlung und eine weitere für die geteilte Zahlung. Alternativ können Sie primaryCoin
vor der Transaktionausreichend Gas aus einer anderen Münzemiteinander verbinden, um beide Kosten abzudecken und sicherzustellen, dass nur eine veränderbare Referenz existiert. Vergewissern Sie sich immer, dass sich Gasmünzen von denen unterscheiden, die geteilt oder bei Vertragsgesprächen verwendet werden, um Konflikte zu vermeiden.
Ich hoffe du hast eine Lösung dafür, oder?
Sie können nicht dieselbe Münze**sowohl für Zahlungen als auch für Benzin verwenden. Korrigieren:
1.Split Gas First— Erstellen Sie eine separate Gasmünze:
const [gasCoin] = tx.splitCoins(tx.object(primaryCoinId), [tx.pure(10_000_000)]);
tx.setGasPayment([gasCoin]);
2.Dann Split Payment— Verwenden Sie den Restbetrag für Ihre NFT-Zahlung.
Hauptregel: ✔ Jede Münze kann nureinmal pro Transaktionverwendet werden.
Alternative: Verwenden Sie zwei separate Münzen (falls verfügbar).
- (Sui benötigt unterschiedliche Münzen für Benzin und Zahlungen, um Konflikte zu vermeiden. ) *) *
Der Fehler tritt auf, weil Sie versuchen, dasselbe Münzobjekt für zwei verschiedene Dinge zu verwenden: für das Teilen, um eine Zahlung zu tätigen, und für das Bezahlen von Benzin. Das System geht davon aus, dass versucht wird, ein Objekt in einer einzigen Transaktion zweimal veränderbar zu verwenden, was nicht zulässig ist.
Sie benötigen eine separate Münze, um Benzin zu bezahlen. Hier ist die Lösung:
gasPayment
Verwenden Sie eine andere Gasmünze: Suchen Sie in der Liste der SUI-Münzen in Ihrer Brieftasche nach einer anderen Münze, die Sie als angeben können. Benutze nicht die, dieprimaryCoin
du teilst.
2.Oder füge zuerst Münzen zusammen: Wenn du nur eine Münze hast, musst du möglicherweise zuerst einige kleinere Münzen zusammenfügen, um eine separate Gasmünze zu erstellen. Benutze dann eine für die Teilung/Zahlung und die andere für Benzin.
Der Schlüssel ist, dass die Münze, für die Sie verwenden, setGasPayment
vollständig von allen Münzen getrennt sein muss, die Sie teilen oder in den Befehlen der Transaktion verwenden.
Gut gemacht!!!
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?
Weißt du die Antwort?
Bitte melde dich an und teile sie.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Verdiene deinen Anteil an 1000 Sui
Sammle Reputationspunkte und erhalte Belohnungen für deine Hilfe beim Wachstum der Sui-Community.
- Warum benötigt BCS eine genaue Feldreihenfolge für die Deserialisierung, wenn Move-Strukturen benannte Felder haben?65
- So maximieren Sie Ihre Gewinnbeteiligung SUI: SUI Staking vs Liquid Staking515
- Fehler bei der Überprüfung mehrerer Quellen“ in den Veröffentlichungen des Sui Move-Moduls — Automatisierte Fehlerbehebung55
- Sui Move Error - Transaktion kann nicht verarbeitet werden Keine gültigen Gasmünzen für die Transaktion gefunden419
- Sui-Transaktion schlägt fehl: Objekte sind für eine andere Transaktion reserviert410