Sui.

Допис

Діліться своїми знаннями.

0xduckmove.
Jul 14, 2025
Питання та відповіді експертів

який успішно працює через 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
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.

Кампанія винагородЛипень