Sui.

Пост

Поделитесь своими знаниями.

0xduckmove.
Jul 14, 2025
Экспертные Вопросы и Ответы

который успешно работает через devInspectTransactionBlock ()

Привет всем! Я использую Type Script SDK и получаю сообщение об ошибке «UnusedValueWithoutDrop» после вызова tx.MoveCall (flash_swap на MMT LP). Я предполагаю, что мне придется вернуть или вернуть возвращенные монеты после обмена. Может кто-нибудь подсказать мне, как эффективно сбросить или перенести возвращенные объекты (в настоящее время NestedResult) после моего MoveCall? Благодарю за любую помощь, спасибо!

Вот код, который успешно запускается с помощью 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.

Кампания вознагражденийИюль