Sui.

Beitrag

Teile dein Wissen.

Prämie+15

Bolke .
Aug 12, 2025
Experten Q&A

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
4
19
Teilen
Kommentare
.

Antworten

19
MoonBags.
Sep 4 2025, 03:43

You 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 in splitCoins, 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

  1. Ensure you have at least two SUI coins in your wallet.
  2. 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

8
Kommentare
.
0xduckmove.
Sep 4 2025, 04:52

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

Carnelian.
Sep 4 2025, 05:01

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.

0xduckmove.
Aug 13 2025, 03:14

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

  1. Wählen Sie zwei Münzen aus:
  • PrimaryCoin (zur Zahlung)
  • GasCoin (für Gas)
  1. Teilen und mit PrimaryCoin bezahlen:
const [paymentCoin] = tx.splitCoins(
    tx.object(primaryCoin.coinObjectId),
    [tx.pure.u64(requiredPaymentAmount)]
);
  1. 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

Sui Move: Ungültiges Entnehmen der Gasmünze. Es kann nur als Wert mit TransferObjects verwendet werden

5
Kommentare
.
Owen.
Owen4662
Aug 13 2025, 06:10

Der Fehler tritt auf, weil Sie versuchen, primaryCoindasOriginalobjekt(das während des splitCoinsVorgangs 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.

primaryCoinUm das Problem zu beheben, stellen Sie die Gaszahlung nicht manuell mithilfe des Pre-Split-Objekts ein. Und stellen Sie sicher, dass Ihr primaryCoinGuthaben 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
4
Kommentare
.
Gifted.eth.
Aug 22 2025, 00:57

Gut gemacht!!!

Redterror.
Aug 15 2025, 10:50

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.

4
Kommentare
.
MiniBob.
Aug 12 2025, 19:33

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, setGasPaymentwenn 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 splitCoinssicher 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.

3
Kommentare
.
BigDev.
Aug 15 2025, 16:20

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

3
Kommentare
.
Carnelian.
Aug 30 2025, 15:10

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.

3
Kommentare
.
Paul.
Paul4340
Aug 13 2025, 08:48

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.

  1. tx.setGasPaymentStellen Sie eine separate Gasmünze ein: Weisen Sie der Gaszahlung mit einer anderen Münze zu.

  2. tx.setGasBudgetGasbudget 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);
2
Kommentare
.
Benjamin XDV.
Aug 22 2025, 11:08

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

2
Kommentare
.
Gifted.eth.
Aug 22 2025, 15:01

Ich hoffe du hast eine Lösung dafür, oder?

Evgeniy CRYPTOCOIN.
Aug 22 2025, 11:19

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. ) *) *
1
Kommentare
.
Arnold.
Arnold3036
Aug 22 2025, 12:00

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:

  1. gasPaymentVerwenden 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, die primaryCoindu 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, setGasPaymentvollständig von allen Münzen getrennt sein muss, die Sie teilen oder in den Befehlen der Transaktion verwenden.

1
Kommentare
.
Gifted.eth.
Aug 22 2025, 14:57

Gut gemacht!!!

chaincrafter.
Sep 13 2025, 22:05

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

  1. 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.
  2. 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
  3. 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.

  4. 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?

0
Kommentare
.

Weißt du die Antwort?

Bitte melde dich an und teile sie.