Sui.

Publicación

Comparte tu conocimiento.

Recompensa+15

Bolke .
Aug 12, 2025
P&R expertos

Error de movimiento: no se puede procesar la transacción No se han encontrado monedas de gasolina válidas para la transacción

Cuando hago esto:

//Divida el pago de la moneda principal const [PaymentCoin] = tx.SplitCoins ( tx.object (ID principal de Coin.coinObjectID), [tx.pure.u64 (cantidad de pago requerida)] );

//Usa la moneda original para el pago de la gasolina tx.setGasPayment ([{ ID de objeto: primarycoin.coinObjectID, versión: PrimaryCoin.Version, resumen: PrimaryCoin.digest }]);

tx.SetGas Budget (10_000_000); Se queja de que los objetos mutables no pueden aparecer más de uno en una transacción. Cuando elimino el pago de la gasolina, aparece una queja: «No se puede procesar la transacción No se han encontrado monedas de gasolina válidas para la transacción». Mi función de contratación acepta 0,01 sui a cambio de un NFT

  • Sui
  • Transaction Processing
  • Move
4
19
Cuota
Comentarios
.

Respuestas

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

Se encuentra con una restricción común de diseño de transacciones de Sui Moveel mismo objeto de moneda no puede usarse como entrada mutable (por ejemplo, para dividir o transferir) y como moneda de gas en una sola transacción.

Por qué sucede esto

  • Cuando usas tx.splitCoins (tx.object (PrimaryCoin.CoinObjectID),...), estás marcando PrimaryCoin como entrada mutable.
  • Si también lo configuras como moneda de gas con tx.setGasPayment (...), Sui ve que el mismo objeto se utiliza en dos funciones, lo que no está permitido.
  • Si eliminas el pago de gasolina, Sui no podrá encontrar ninguna moneda de gas válida, por lo que aparecerá el error «No se han encontrado monedas de gas válidas para la transacción».

Del contexto:

Estado de los efectos de la transacción: uso del valor no válido. Los valores tomados de forma mutable requieren un uso único. Los valores prestados de forma inmutable no pueden tomarse ni tomarse en préstamo de forma mutable. Los valores tomados no se pueden volver a utilizar. (fuente)

Cómo solucionarlo

Debe usar una moneda diferente a la que está dividiendo o transfiriendo para la gasolina.

La solución: ten al menos dos monedas SUI en tu monedero. Usa una para el pago (dividir/transferir) y otra para la gasolina.

Ejemplo de flujo

  1. Selecciona dos monedas:
  • PrimaryCoin (para pago)
  • GasCoin (para gasolina)
  1. Divida y pague con PrimaryCoin:
const [paymentCoin] = tx.splitCoins(
    tx.object(primaryCoin.coinObjectId),
    [tx.pure.u64(requiredPaymentAmount)]
);
  1. Configure el pago de gasolina con GasCoin:
tx.setGasPayment([{
    objectId: gasCoin.coinObjectId,
    version: gasCoin.version,
    digest: gasCoin.digest
}]);
tx.setGasBudget(10_000_000);

No utilice el mismo objeto monetario tanto para el pago como para la gasolina.

Mi referencia

Sui Move: toma inválida de la moneda de gas. Solo se puede usar por valor con TransferObjects

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

El error se produce porque estás intentando usar el primaryCoinobjeto original(que se consume durante la splitCoinsoperación) como pago de gas. Tras dividirse, la versión/resumen de la moneda original deja de ser válida, lo que provoca el error «los objetos mutables no pueden aparecer más de una vez» cuando se vuelve a hacer referencia a ella.

primaryCoinPara solucionarlo, no configures manualmente el pago de la gasolina utilizando el objeto previo a la división. Y asegúrese de tener primaryCoinun saldo suficiente para cubrir ambas cosas:

  • El importe del pago (requiredPaymentAmount= 0,01 SUI)
  • El presupuesto de gas (10_000_000= 0,01 SUI) → Total necesario:≥ 0.02 SUI

¡Simplemente inténtalo

// 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
Comentarios
.
Gifted.eth.
Aug 22 2025, 00:57

¡¡¡Bien hecho!!!

Redterror.
Aug 15 2025, 10:50

Para solucionar el problema con el que te encuentras con el error de transacción de Sui, ya que no se encuentran monedas de gasolina válidas o que aparecen objetos mutables más de una vez, es porque no puedes usar la misma moneda para dividir el pago y cubrir las tarifas de gasolina, ya que las monedas de gasolina deben permanecer separadas de los artículos que estás modificando en la oferta. El ajuste más fácil es dividir el pago directamente desde la fuente de gas en lugar de tu moneda principal, así que cámbialo por algo como

const paymentCoin = tx.splitCoins(tx.gas(), [tx.pure.u64(requiredPaymentAmount)]);

luego, elimine por completo la línea de pago manual de gas, ya que el sistema la recogerá por sí solo y mantendrá su presupuesto de gas establecido como de costumbre. Esto le permite sacar provecho de la moneda de la gasolina sin chocar, siempre y cuando su cartera tenga suficiente para pagar 0,01 Sui más las comisiones.

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

Esto ocurre porque intentas usar el mismo objeto de moneda (primaryCoin) como pago de gasolina y como entradasplitCoins, lo que lo convierte en una referencia mutable que se usa en dos contextos diferentes, y Sui no lo permite por motivos de seguridad y lógica lineal (ya que las monedas son objetos lineales).

En mi humilde opinión, la forma es no establecer manualmente el pago de la gasolina en absoluto. Simplemente deje que la billetera/cliente de Sui seleccione automáticamente una moneda de gasolina adecuada. Úsala solo setGasPaymentsi realmente necesitas especificar con qué moneda se paga la gasolina (p. ej., monederos con varias monedas o una gestión específica del gas). De lo contrario, evítalo.

Prueba lo siguiente:

// 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 hará lo siguiente:

  • Elige automáticamente una moneda de gasolina (puede ser la misma moneda SUI o la misma que tengas en la cartera).
  • Manéjala de splitCoinsforma segura.
  • Usa unamoneda diferente(o, a veces, la misma, pero manipúlala de forma segura bajo el capó mediante el control adecuado de las versiones de los objetos).

Importante: siempre y cuando tu monedero tenga al menos 1 USD para cubrir la gasolina, esto funcionará.

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

Este problema se debe a que utilizas la misma moneda (PrimaryCoin) tanto para gas como entrada en SplitCoins, lo que no está permitido en Sui debido a sus reglas sobre objetos lineales y mutaciones seguras.

Para solucionarlo, no configures manualmente el pago de la gasolina. Deje que la billetera o el cliente de Sui seleccionen automáticamente una moneda de gasolina adecuada. Solo necesitas SetGasPayment en casos avanzados (como el control preciso de las monedas). Este es el enfoque limpio:


// 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 cogerá de forma segura una moneda de gasolina de tu cartera (siempre que haya una disponible) y se encargará de todo lo que esté detrás de escena

3
Comentarios
.
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
Comentarios
.
Paul.
Paul4340
Aug 13 2025, 08:48

Problemas

Te encuentras con dos problemas principales:

1.Error de mutabilidad: si se intenta utilizar el mismo objeto de moneda tanto para el pago como para la entrada de transacciones de gas, se produce el siguiente error: «Los objetos mutables no pueden aparecer más de una vez en una transacción».

2.Falta una moneda de gas: Sin una moneda de gas válida, se produce el error «No se puede procesar la transacción: no se han encontrado monedas de gas válidas para la transacción».


Solución

Para resolver estos problemas:

1.Divida la moneda principal para el pago: utilícela tx.splitCoinspara crear una nueva moneda para la compra de NFT, asegurándose de que esté separada del pago de la gasolina.

  1. tx.setGasPaymentEstablezca una moneda de gas separada: asigne una moneda diferente para el pago de la gasolina.

  2. tx.setGasBudgetDefina el presupuesto de gas: establezca un presupuesto de gas adecuado utilizando.


Código

// 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
Comentarios
.
Benjamin XDV.
Aug 22 2025, 11:08

El error se produce porque estás intentandodividir y usar la misma moneda para el pago y la gas, lo que infringe la regla de Sui que prohíbe la duplicación de objetos mutables en una transacción. Al dividirlaprimaryCoin, se crea una nueva moneda y, al mismo tiempo, se muta la original; ambas monedas no pueden aparecer en la misma transacción. Para resolver este problema,usa dos monedas separadas: una para el pago de gasolina y otra para la operación de pago dividido. También puedes combinar la cantidad suficiente de gas de otra moneda**primaryCoinantes de la transacción para cubrir ambos costos, asegurándote de que solo exista una referencia mutable. Verifique siempre que las monedas de gasolina sean distintas de las que se dividen o se utilizan en las adjudicaciones de contratos para evitar conflictos.

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

Espero que tengas una solución para esto, ¿no?

Evgeniy CRYPTOCOIN.
Aug 22 2025, 11:19

No puedes usar la misma moneda**tanto para el pago como para la gasolina. Corrección:

1.Split Gas First— Crea una moneda de gas separada:

  const [gasCoin] = tx.splitCoins(tx.object(primaryCoinId), [tx.pure(10_000_000)]);  
  tx.setGasPayment([gasCoin]);  

2.Luego divide el pago: usa el saldo restante para tu pago de NFT.

Regla clave: ✔ Cada moneda solo se puede usaruna vez por transacción.

Alternativa: Usa dos monedas distintas (si están disponibles).

  • (Sui requiere monedas distintas para la gasolina y para los pagos a fin de evitar conflictos. ) *
1
Comentarios
.
Arnold.
Arnold3036
Aug 22 2025, 12:00

El error se produce porque intentas usar el mismo objeto de moneda para dos cosas diferentes: dividir para hacer un pago y pagar la gasolina. El sistema considera que se trata de usar un objeto de forma mutable dos veces en una sola transacción, lo que no está permitido.

Necesitas una moneda aparte para pagar la gasolina. Esta es la solución:

  1. gasPaymentUsa una moneda de gasolina diferente: Busca otra moneda en la lista de monedas SUI de tu billetera para especificarla como. No utilices las primaryCoinque estás dividiendo.

2.O combina primero las monedas: Si solo tienes una moneda, es posible que primero tengas que combinar algunas monedas más pequeñas para crear una moneda de gas independiente. Luego usa una para la división o el pago y la otra para la gasolina.

La clave es que la moneda que utilices setGasPaymentdebe estar completamente separada de cualquier moneda que estés dividiendo o usando en los comandos de la transacción.

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

¡¡¡Bien hecho!!!

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

Sabes la respuesta?

Inicie sesión y compártalo.