Пост
Поделитесь своими знаниями.
который успешно работает через 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Вы получаете 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.
Заработай свою долю из 1000 Sui
Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.
- Почему BCS требует точного порядка полей для десериализации, когда структуры Move содержат именованные поля?53
- «Ошибки проверки нескольких источников» в публикациях модуля Sui Move — автоматическое устранение ошибок43
- Сбой транзакции Sui: объекты, зарезервированные для другой транзакции25
- Как ограничения возможностей взаимодействуют с динамическими полями в гетерогенных коллекциях?05