Publication
Partagez vos connaissances.
qui s'exécute avec succès via DevInspectTransactionBlock ()
Bonjour à tous, j'utilise le SDK Type Script et je reçois l'erreur « UnusedValueWithoutDrop » après un tx.MoveCall (flash_swap sur MMT LP). Je suppose que je dois déposer ou transférer les pièces retournées après l'échange. Quelqu'un peut-il me dire comment déposer/transférer efficacement les objets renvoyés (actuellement NestedResult) après mon MoveCall ? J'apprécie toute aide, merci !
Voici le code, qui s'exécute avec succès via DevInspectTransactionBlock ()
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
Réponses
2Vous obtenez l'UnusedValueWithoutDrop
erreur carchaque objet renvoyé par un appel Move doit être transféré, utilisé, détruit ou explicitement supprimé. Sinon, Sui renvoie cette erreur pour garantir une gestion sûre et déterministe des objets.
Dans votre cas, vous returnCoinA
les gérez returnCoinB
correctement en les renvoyant à l'expéditeur. Mais vous ne faites rien avecreturnReceip
, c'est pourquoi l'erreur est déclenchée.
Pour résoudre ce problème, vous devez explicitementsupprimerreturnReceip
s'il n'est pas nécessaire, ou letransférers'il contient des données que l'utilisateur doit conserver. Voici comment vous pouvez le gérer selon les cas :
✅Option 1 : Déposez l'objet si vous n'en avez pas besoin
tx.moveCall({
target: '0x2::object::drop',
arguments: [returnReceip],
});
✅Option 2 : transférez-le à l'expéditeur s'il contient des informations utiles
tx.transferObjects([returnReceip], tx.pure.address(sender));
✅ Code fixe final :
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],
});
Cela résoudra l'UnusedValueWithoutDrop
erreur. Vous pouvez également inspecter la structure de returnReceip
l'utilisation devInspectTransactionBlock()
pour décider de la supprimer ou de la conserver.
Tu dois faire quelque chose avecreturnReceipt
. Je ne sais pas quels sont ces objets, mais vous pouvez probablement simplement les ajouter à TransferObjects s'ils ne sont pas censés être transmis dans un autre appel
Connaissez-vous la réponse ?
Veuillez vous connecter et la partager.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gagne ta part de 1000 Sui
Gagne des points de réputation et obtiens des récompenses pour avoir aidé la communauté Sui à se développer.
- Pourquoi BCS exige-t-il un ordre de champs exact pour la désérialisation alors que les structures Move ont des champs nommés ?53
- « Erreurs de vérification de sources multiples » dans les publications du module Sui Move - Résolution automatique des erreurs43
- Échec de la transaction Sui : objets réservés pour une autre transaction25
- Comment les contraintes de capacité interagissent-elles avec les champs dynamiques dans des collections hétérogènes ?05