Sui.

Publicación

Comparte tu conocimiento.

0xduckmove.
Jul 14, 2025
P&R expertos

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

Respuestas

2
24p30p.
Jul 14 2025, 17:47

UnusedValueWithoutDropAparece 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``returnCoinBgestionando correctamente al devolverlos al remitente. Pero no estás haciendo nada con returnReceipeso, por lo que se desencadena el error.

Para solucionarlo, debeseliminarexplícitamente returnReceipsi 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 UnusedValueWithoutDroperror. También puede inspeccionar la estructura de returnReceipuso devInspectTransactionBlock()para decidir si desea eliminarlo o conservarlo.

🔗 Lea más sobre el manejo de objetos en Sui Move

0
Comentarios
.
harry phan.
Jul 15 2025, 04:42

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

0
Comentarios
.

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.

420Publicaciones611Respuestas
Sui.X.Peera.

Gana tu parte de 1000 Sui

Gana puntos de reputación y obtén recompensas por ayudar a crecer a la comunidad de Sui.

Campaña de RecompensasJulio