Beitrag
Teile dein Wissen.
was erfolgreich über devInspectTransactionBlock () ausgeführt wird
Hallo zusammen, ich verwende das Type Script SDK und erhalte nach einem tx.MoveCall (flash_swap auf MMT LP) den Fehler „unusedValueWithoutDrop“. Ich gehe davon aus, dass ich die zurückgegebenen Coins nach dem Tausch fallen lassen oder zurücküberweisen muss. Kann mir jemand sagen, wie ich die zurückgegebenen Objekte (derzeit NestedResult) nach meinem MoveCall effizient fallen/übertragen kann? Freue mich über jede Hilfe, danke!
Hier ist der Code, der erfolgreich über devInspectTransactionBlock () ausgeführt wird
let [returnCoinA, returnCoinB, returnReceip] = tx.moveCall({
target: targetFunctionLP2,
typeArguments: [suiTokenType, usdcTokenType],
arguments: [
tx.object(poolAddressLP2),
tx.pure.bool(false),
tx.pure.bool(true),
tx.pure.u64(amountOutUSDNormalized),
tx.pure.u128(limit_sqrt_priceB),
tx.object(clockObjectAddressLP2),
tx.object(versionAddressLP2),
],
});
tx.transferObjects([returnCoinA, returnCoinB], tx.pure.address(sender))
- Sui
Antworten
2Sie erhalten den UnusedValueWithoutDrop
Fehler, weiljedes Objekt, das von einem Move-Aufruf zurückgegeben wird, entweder übertragen, verwendet, zerstört oder explizit gelöscht werden muss— andernfalls gibt Sui diesen Fehler aus, um eine sichere und deterministische Objektbehandlung zu gewährleisten.
In Ihrem Fall behandeln Sie sie returnCoinA``returnCoinB
korrekt, indem Sie sie zurück an den Absender übertragen. Aber du machst nichts damitreturnReceip
, weshalb der Fehler ausgelöst wird.
Um dies zu beheben, sollten Sie es explizitlöschen, returnReceip
falls es nicht benötigt wird, oder esübertragen, wenn es Daten enthält, die der Benutzer behalten sollte. So können Sie je nach Fall damit umgehen:
✅Option 1: Lass das Objekt fallen, wenn du es nicht benötigen
tx.moveCall({
target: '0x2::object::drop',
arguments: [returnReceip],
});
✅Option 2: Übertrage es an den Absender, wenn es nützliche Informationen enthält
tx.transferObjects([returnReceip], tx.pure.address(sender));
✅ Endgültiger fester Code:
let [returnCoinA, returnCoinB, returnReceip] = tx.moveCall({
target: targetFunctionLP2,
typeArguments: [suiTokenType, usdcTokenType],
arguments: [
tx.object(poolAddressLP2),
tx.pure.bool(false),
tx.pure.bool(true),
tx.pure.u64(amountOutUSDNormalized),
tx.pure.u128(limit_sqrt_priceB),
tx.object(clockObjectAddressLP2),
tx.object(versionAddressLP2),
],
});
tx.transferObjects([returnCoinA, returnCoinB], tx.pure.address(sender));
tx.moveCall({
target: '0x2::object::drop',
arguments: [returnReceip],
});
Dadurch wird der UnusedValueWithoutDrop
Fehler behoben. Sie können auch die Struktur der returnReceip
Verwendung überprüfendevInspectTransactionBlock()
, um zu entscheiden, ob Sie sie löschen oder behalten möchten.
Du musst etwas damit machenreturnReceipt
. Ich weiß nicht, was diese Objekte sind, aber Sie können sie wahrscheinlich einfach zu TransferObjects hinzufügen, wenn nicht erwartet wird, dass sie an einen anderen Aufruf übergeben werden
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?53
- Fehler bei der Überprüfung mehrerer Quellen“ in den Veröffentlichungen des Sui Move-Moduls — Automatisierte Fehlerbehebung43
- Sui-Transaktion schlägt fehl: Objekte sind für eine andere Transaktion reserviert25
- Wie interagieren Fähigkeitsbeschränkungen mit dynamischen Feldern in heterogenen Sammlungen?05