Publicación
Comparte tu conocimiento.
que se ejecuta correctamente a través de DevInspectTransactionBlock ()
Hola a todos, estoy usando el SDK de Type Script y recibo el error «UnusedValueWithoutDrop» después de un tx.movecall (flash_swap en MMT LP). Supongo que tendré que retirar o devolver las monedas devueltas tras el canje. ¿Puede alguien decirme cómo soltar o transferir de manera eficiente los objetos devueltos (actualmente NestedResult) después de mi MoveCall? Agradezco cualquier ayuda, ¡gracias!
Aquí está el código, que se ejecuta correctamente a través de 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
Respuestas
2UnusedValueWithoutDrop
Aparece el error porquetodos los objetos devueltos por una llamada de Move deben transferirse, usarse, destruirse o eliminarse explícitamente; de lo contrario, Sui arroja ese error para garantizar un manejo seguro y determinista de los objetos.
En tu caso, los estás returnCoinA``returnCoinB
gestionando correctamente al devolverlos al remitente. Pero no estás haciendo nada con returnReceip
eso, por lo que se desencadena el error.
Para solucionarlo, debeseliminarexplícitamente returnReceip
si no es necesario, otransferirsi contiene datos que el usuario debe conservar. Así es como puedes manejarlo según el caso:
✅Opción 1: suelta el objeto si no lo necesita
tx.moveCall({
target: '0x2::object::drop',
arguments: [returnReceip],
});
✅Opción 2: transferirlo al remitente si contiene información útil
tx.transferObjects([returnReceip], tx.pure.address(sender));
✅ Código fijo 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],
});
Esto resolverá el UnusedValueWithoutDrop
error. También puede inspeccionar la estructura de returnReceip
uso devInspectTransactionBlock()
para decidir si desea eliminarlo o conservarlo.
Tienes que hacer algo conreturnReceipt
. No sé qué son estos objetos, pero probablemente puedas agregarlos a TransferObjects si no se espera que se pasen a otra llamada
Sabes la respuesta?
Inicie sesión y compártalo.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gana tu parte de 1000 Sui
Gana puntos de reputación y obtén recompensas por ayudar a crecer a la comunidad de Sui.
- ¿Por qué BCS requiere un orden de campo exacto para la deserialización cuando las estructuras Move tienen campos con nombre?53
- «Errores de verificación de múltiples fuentes» en las publicaciones del módulo Sui Move: resolución automática de errores43
- Fallo en la transacción Sui: objetos reservados para otra transacción25
- ¿Cómo interactúan las restricciones de capacidad con los campos dinámicos en colecciones heterogéneas?05