帖子
分享您的知识。
它通过 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你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()
,以决定是删除还是保留它.
你需要做点什么returnReceipt
. 我不知道这些对象是什么,但是如果预计不会将它们传递到另一个调用中,则可以将它们添加到TransferObjects中
你知道答案吗?
请登录并分享。
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.