Bài viết
Chia sẻ kiến thức của bạn.
+15
Lỗi Sui Move - Không thể xử lý giao dịch Không tìm thấy đồng xu gas hợp lệ cho giao dịch
Khi tôi làm điều này:
//Chia thanh toán từ đồng tiền chính const [PaymentCoin] = TX.SplitCoins ( tx.object (primarycoin.coinObjectID), [tx.pure.u64 (Mức thanh toán bắt buộc)] );
//Sử dụng đồng tiền gốc để thanh toán gas tx.setGasPayment ([{ ObjectID: primarycoin.coinObjectID, phiên bản: PrimaryCoin.version, bản tóm tắt: PrimaryCoin.Digest }]);
tx.setgasBudget (10_000_000); Nó phàn nàn về các đối tượng có thể đột biến không thể xuất hiện nhiều hơn một trong một giao dịch. Khi tôi xóa thanh toán gas, nó phàn nàn “Không thể xử lý giao dịch Không tìm thấy đồng xu gas hợp lệ cho giao dịch.”. Chức năng hợp đồng của tôi chấp nhận .01 sui để đổi lấy NFT
- Sui
- Transaction Processing
- Move
Câu trả lời
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.
Bạn đang gặp phải một ràng buộc thiết kế giao dịch Sui Move phổ biến** cùng một đối tượng coin không thể được sử dụng làm đầu vào có thể thay đổi (ví dụ: để tách hoặc chuyển) và làm đồng xu gas trong một giao dịch duy nhất.**
Tại sao điều này xảy ra
- Khi bạn sử dụng TX.SplitCoins (tx.object (PrimaryCoin.CoinObjectID),...), bạn đang đánh dấu PrimaryCoin là một đầu vào có thể thay đổi.
- Khi bạn cũng đặt nó làm đồng xu gas với tx.setGasPayment (...), Sui sẽ thấy cùng một đối tượng được sử dụng trong hai vai trò, điều này không được phép.
- Nếu bạn xóa thanh toán gas, Sui không thể tìm thấy đồng xu gas hợp lệ, do đó có lỗi “Không tìm thấy đồng xu gas hợp lệ cho giao dịch”.
Từ ngữ cảnh:
Trạng thái hiệu ứng giao dịch: Sử dụng giá trị không hợp lệ. Các giá trị vay mượn có thể thay đổi đòi hỏi cách sử dụng duy nhất. Các giá trị mượn bất biến không thể được lấy hoặc mượn một cách đột biến. Các giá trị đã lấy không thể được sử dụng lại. (nguồn)
Cách khắc phục
Bạn phải sử dụng một đồng tiền khác để lấy gas so với đồng tiền bạn đang chia hoặc chuyển.
Giải pháp: Có ít nhất hai đồng SUI trong ví của bạn. Sử dụng một cái để thanh toán (tắt/chuyển nhượng) và một cái khác cho gas.
Lưu lượng ví dụ
- Chọn hai đồng xu:
- PrimaryCoin (để thanh toán)
- GasCoin (đối với gas)
- Chia và thanh toán bằng PrimaryCoin:
const [paymentCoin] = tx.splitCoins(
tx.object(primaryCoin.coinObjectId),
[tx.pure.u64(requiredPaymentAmount)]
);
- Đặt thanh toán gas với GasCoin:
tx.setGasPayment([{
objectId: gasCoin.coinObjectId,
version: gasCoin.version,
digest: gasCoin.digest
}]);
tx.setGasBudget(10_000_000);
Không sử dụng cùng một đối tượng tiền xu cho cả thanh toán và gas.
Tài liệu tham khảo của tôi
Lỗi xảy ra do bạn đang cố gắng sử dụngđối tượng ban đầ primaryCoin
u(được tiêu thụ trong quá trình splitCoins
hoạt động) làm thanh toán gas. Sau khi tách, phiên bản/bản tổng hợp của đồng tiền gốc trở nên không hợp lệ, gây ra lỗi “các đối tượng có thể thay đổi không thể xuất hiện nhiều hơn một” khi được tham chiếu lại.
Để khắc phục, đừng đặt thủ công thanh toán gas bằng cách sử dụng primaryCoin
đối tượng chia trước. Và đảm bảo bạn primaryCoin
có đủ số dư để trang trải cả hai:
- Số tiền thanh toán (
requiredPaymentAmount
= 0.01 SUI) - Ngân sách khí đốt (
10_000_000
= 0,01 SUI) → Tổng số cần thiết:** ≥ 0,02 SUI**
Chỉ cần thử
// 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
Làm tốt lắm!!!
Để khắc phục sự cố bạn gặp phải với lỗi giao dịch Sui về việc không tìm thấy đồng xu gas hợp lệ hoặc các đối tượng có thể thay đổi xuất hiện nhiều hơn một lần, đó là do bạn không thể sử dụng cùng một đồng tiền để chia nhỏ khoản thanh toán và chi trả phí gas, vì tiền gas cần phải tách biệt với các mặt hàng bạn đang tinh chỉnh trong giao dịch. Điều chỉnh dễ dàng là chia thanh toán trực tiếp từ nguồn gas thay vì đồng tiền chính của bạn, vì vậy hãy thay đổi nó thành một cái gì đó như
const paymentCoin = tx.splitCoins(tx.gas(), [tx.pure.u64(requiredPaymentAmount)]);
sau đó bỏ hoàn toàn đường thanh toán gas thủ công vì hệ thống sẽ tự lấy nó và giữ ngân sách xăng của bạn được thiết lập như bình thường. Điều này cho phép bạn rút khỏi đồng xu gas mà không bị đụng độ, miễn là ví của bạn có đủ để xử lý thanh toán 0.01 Sui cộng với phí.
Điều này xảy ra bởi vì bạn đang cố gắng sử dụng cùng một đối tượng coin (primaryCoin
) cả làm thanh toán gas và đầu vàosplitCoins
, điều này làm cho nó trở thành một tham chiếu có thể thay đổi được sử dụng trong hai bối cảnh khác nhau - và Sui không cho phép điều đó vì tính an toàn và logic tuyến tính (vì tiền xu là đối tượng tuyến tính).
Cách IMHO là hoàn toàn không đặt thanh toán gas theo cách thủ công. Chỉ cần để ví Sui/khách hàng tự động chọn một đồng xu gas thích hợp. Chỉ sử dụng setGasPayment
nếu bạn thực sự cần xác định đồng tiền nào trả tiền cho gas (ví dụ: ví đa coin, quản lý gas cụ thể). Nếu không, tránh nó.
Hãy thử như sau:
// 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 sẽ:
- Tự động chọn một đồng xu gas (có thể là cùng một hoặc một đồng SUI khác trong ví).
- Xử lý an
splitCoins
toàn. - Sử dụngđồng tiền khác(hoặc đôi khi cùng một đồng tiền, nhưng được xử lý an toàn dưới mui xe thông qua phiên bản đối tượng thích hợp).
Quan trọng: Miễn là ví của bạn có ít nhất 1 $SUI có thể trang trải gas, điều này sẽ hoạt động.
Vấn đề này xảy ra vì bạn đang sử dụng cùng một đồng tiền (PrimaryCoin) cho cả gas và đầu vào trong SplitCoins, điều này không được phép trong Sui do các quy tắc của nó xung quanh các đối tượng tuyến tính và đột biến an toàn.
Để khắc phục, đừng đặt thủ công thanh toán gas. Hãy để ví Sui hoặc khách hàng tự động chọn một đồng xu gas phù hợp. Bạn chỉ cần SetGasPayment trong các trường hợp nâng cao (như kiểm soát tiền xu chính xác). Đây là cách tiếp cận sạch sẽ:
// 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 sẽ an toàn lấy một đồng xu gas từ ví của bạn (miễn là có sẵn) và xử lý mọi thứ đằng sau hậu trường
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.
Vấn đề
Bạn đang gặp phải hai vấn đề chính:
1.Lỗi khả năng thay đổi: Cố gắng sử dụng cùng một đối tượng đồng xu cho cả thanh toán gas và đầu vào giao dịch dẫn đến lỗi: “Các đối tượng có thể thay đổi không thể xuất hiện nhiều hơn một lần trong một giao dịch.”
2.** Thiếu đồng xu gas**: Nếu không có đồng xu gas hợp lệ, lỗi “Không thể xử lý giao dịch: Không tìm thấy đồng xu gas hợp lệ cho giao dịch” xảy ra.
Giải pháp
Để giải quyết các vấn đề này:
1.** Chia đồng tiền chính để thanh toán**: Sử dụng tx.splitCoins
để tạo một đồng tiền mới cho giao dịch mua NFT, đảm bảo nó tách biệt với khoản thanh toán gas.
-
tx.setGasPayment
Đặt một đồng tiền khí riêng biệt: Chỉ định một đồng tiền khác để thanh toán gas bằng cách sử dụng. -
tx.setGasBudget
Xác định ngân sách khí: Đặt ngân sách khí thích hợp bằng cách sử dụng.
Mã
// 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ỗi xảy ra do bạn đang cố gắngtách và sử dụng cùng một đồng tiền cho cả thanh toán và gas, vi phạm quy tắc của Sui chống lại sự trùng lặp đối tượng có thể thay đổi trong một giao dịch. Khi bạn táchprimaryCoin
, nó tạo ra một đồng tiền mới trong khi biến đổi bản gốc — cả hai không thể xuất hiện trong cùng một giao dịch. Để giải quyết vấn đề này,** sử dụng hai đồng tiền riêng biệt**: một để thanh toán gas và một cho hoạt động thanh toán chia nhỏ. Ngoài ra,** hợp nhất đủ khí từ một đồng tiền khác**vào primaryCoin
trước khi giao dịch để trang trải cả hai chi phí, đảm bảo chỉ tồn tại một tham chiếu có thể thay đổi. Luôn luôn xác minh các đồng tiền gas khác với những đồng tiền được chia hoặc sử dụng trong các cuộc gọi hợp đồng để tránh xung đột.
Tôi hy vọng bạn có giải pháp cho điều này hả?
Bạn không thể sử dụng cùng một đồng coin**cho cả thanh toán và gas. Khắc phục:
1.** Split Gas First**- Tạo một đồng khí riêng biệt:
const [gasCoin] = tx.splitCoins(tx.object(primaryCoinId), [tx.pure(10_000_000)]);
tx.setGasPayment([gasCoin]);
2.Sau đó chia thanh toán— Sử dụng số dư còn lại cho khoản thanh toán NFT của bạn.
Quy tắc chính: ✔ Mỗi đồng xu chỉ có thể được sử dụng** một lần cho mỗi giao dịch**.
Thay thế: Sử dụng hai đồng tiền riêng biệt (nếu có).
- (Sui yêu cầu các đồng tiền riêng biệt cho khí đốt và thanh toán để tránh xung đột. ) *
Lỗi xảy ra bởi vì bạn đang cố gắng sử dụng cùng một đối tượng coin cho hai việc khác nhau: chia tách để thanh toán và trả tiền cho gas. Hệ thống coi điều này là cố gắng sử dụng một đối tượng một cách có thể thay đổi hai lần trong một giao dịch duy nhất, điều này không được phép.
Bạn cần một đồng tiền riêng để trả tiền xăng. Đây là bản sửa lỗi:
gasPayment
Sử dụng một đồng xu gas khác: Tìm một đồng tiền khác trong danh sách các đồng SUI của ví của bạn để chỉ định là. Đừng sử dụng cái màprimaryCoin
bạn đang chia.
2.** Hoặc, hợp nhất tiền xu trước:** Nếu bạn chỉ có một đồng xu, bạn có thể cần phải hợp nhất một số đồng tiền nhỏ hơn vào đó trước để tạo ra một đồng khí riêng biệt. Sau đó sử dụng một cái cho việc tắt/thanh toán và cái kia cho gas.
Điều quan trọng là đồng tiền bạn sử dụng setGasPayment
phải hoàn toàn tách biệt với bất kỳ đồng tiền nào bạn đang chia hoặc sử dụng trong các lệnh giao dịch.
Làm tốt lắm!!!
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?
Bạn có biết câu trả lời không?
Hãy đăng nhập và chia sẻ nó.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Kiếm phần của bạn từ 1000 Sui
Tích lũy điểm danh tiếng và nhận phần thưởng khi giúp cộng đồng Sui phát triển.
- Tại sao BCS yêu cầu thứ tự trường chính xác để khử chuỗi khi cấu trúc Move có các trường được đặt tên?65
- Cách tối đa hóa lợi nhuận nắm giữ SUI: Sui Staking vs Liquid Staking515
- Nhiều lỗi xác minh nguồn” trong các ấn phẩm về mô-đun Sui Move - Giải quyết lỗi tự động55
- Lỗi Sui Move - Không thể xử lý giao dịch Không tìm thấy đồng xu gas hợp lệ cho giao dịch419
- Giao dịch Sui thất bại: Đối tượng được dành riêng cho giao dịch khác410