Sui.

帖子

分享您的知识。

0xduckmove.
Jul 14, 2025
专家问答

它通过 devinspectTransactionBlock () 成功运行

大家好,我正在使用 Type Script SDK,在 tx.moveCall(MMT LP 上的 flash_swap)之后收到错误 “unusedValueWithoutDrop”. 我想我必须在交换后丢掉或转回退回的硬币. 有人能告诉我,在我的 MoveCall 之后如何高效地删除/传输返回的对象(目前为 nestedResult)?感谢任何帮助,谢谢!

以下是通过 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
分享
评论
.

答案

2
24p30p.
Jul 14 2025, 17:47

UnusedValueWithoutDrop之所以遇到错误,是因为从 Move 调用返回的每个对象都必须被转移、使用、销毁或明确删除——否则,Sui 会抛出该错误以确保安全和确定性的对象处理.

就你而言,returnCoinA``returnCoinB将它们转回给发件人就是在处理和正确处理. 但是你没有做任何事情returnReceip,这就是触发错误的原因.

要解决此问题,如果returnReceip不需要则应明确删除,如果其中包含用户应保留的数据,则应将其转移. 根据具体情况,您可以通过以下方式进行处理:


选项 1:如果不需要则将其丢弃

tx.moveCall({
  target: '0x2::object::drop',
  arguments: [returnReceip],
});

选项 2:如果它包含有用信息,则将其传输给发件人

tx.transferObjects([returnReceip], tx.pure.address(sender));

✅ 最终固定代码:

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],
});

这将解决UnusedValueWithoutDrop错误. 您还可以检查returnReceip使用的结构devInspectTransactionBlock(),以决定是删除还是保留它.

🔗 在 Sui Move 中阅读有关对象处理的更多信息

0
评论
.
harry phan.
Jul 15 2025, 04:42

你需要做点什么returnReceipt. 我不知道这些对象是什么,但是如果预计不会将它们传递到另一个调用中,则可以将它们添加到TransferObjects中

0
评论
.

你知道答案吗?

请登录并分享。

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

420帖子611答案
Sui.X.Peera.

赚取你的 1000 Sui 份额

获取声誉积分,并因帮助 Sui 社区成长而获得奖励。

奖励活动七月