Допис
Діліться своїми знаннями.
який успішно працює через DevInspectTransactionBlock ()
Привіт усім, я використовую SDK сценарію типу і отримую помилку «UnusedValueWithoutDrop» після TX.MoveCall (flash_swap на MMT LP). Я припускаю, що мені доведеться скинути або передати назад повернуті монети після обміну. Хтось може сказати мені, як ефективно скинути/перенести повернуті об'єкти (на даний момент вкладені Result) після мого 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