Ошибка InvalidUsageOfPureArg в транзакции SUI: причины и исправление
При работе с клиентом SUI разработчики нередко сталкиваются с ошибкой CommandArgumentError { arg_idx: 0, kind: InvalidUsageOfPureArg }. Она возникает, когда аргумент команды, который должен быть объектом (UID, Coin и т.п.), передаётся как чистое значение (Pure). В этой статье мы подробно разберём, почему возникает эта ошибка на примере вызова move-call для функции move_pump::buy, и предложим правильный способ построения транзакции.
Что означает InvalidUsageOfPureArg?
Ошибка InvalidUsageOfPureArg сообщает, что в позиции arg_idx: 0 (первый аргумент команды) ожидался ссылочный тип (объект), а был передан чистый литерал. В SUI все объекты (монеты, NFT, токены) должны передаваться по ссылке через --assign или напрямую как результат предыдущей команды. Чистые аргументы (числа, строки, адреса) передаются без кавычек или в квадратных скобках, но не могут заменить объект.
Анализ вашей транзакции
В вашем bat-файле команда --split-coins gas [1000000000] --assign coin создаёт объект coin с 1 SUI. Затем вы передаёте coin как аргумент в --move-call. Однако ошибка возникает на первом аргументе функции buy. Судя по сигнатуре, первый аргумент - это, скорее всего, ссылка на объект (например, пул или конфигурацию), а вы передали чистый литерал (строку с адресом).
Правильный порядок аргументов
Функция move_pump::buy ожидает следующие параметры:
- arg0: объект пула (UID) - должен быть передан как ссылка на существующий объект, а не как строка.
- arg1: тип токена (generic type) - указывается в угловых скобках после имени функции.
- arg2: адрес получателя (Pure) - передаётся как строка с адресом.
- arg3: монета для оплаты (Coin) - объект, полученный из
--split-coins. - arg4: сумма (u64) - чистое число.
- arg5: идентификатор (например,
0x6) - Pure.
В вашем вызове первым аргументом идёт строка с адресом пула ('0xd746495d04a6119987c2b9334c5fefd7d8cff52a8a02a3ea4e3995b9a041ace4'), но SUI ожидает объект. Вам нужно предварительно получить этот объект через sui client objects или передать его как результат другой команды.
Как исправить ошибку?
Чтобы избежать InvalidUsageOfPureArg, следуйте этим правилам:
- Все объекты (UID, Coin, NFT) передавайте через
--assignили как результат предыдущей команды. - Чистые значения (числа, адреса, строки) заключайте в квадратные скобки или передавайте без кавычек.
- Проверьте сигнатуру функции в обозревателе (например, SuiVision) или в исходном коде Move.
Пример корректного вызова
Предположим, у вас уже есть объект пула с ID 0xd746...ace4. Его нужно сначала получить как объект, а затем передать в move-call:
sui client ptb \
--split-coins gas [1000000000] --assign coin \
--move-call 0x7efa6e45163cf24b31ca71bd8f2ca5b93af89b7b34bdb50ec1795223b75d729b::move_pump::buy "<0xbc88e0a485e91fb5e0fc87b780d14a2535240b0657b2772ead853475c3d56cb0::goosui::GOOSUI>" \
0xd746495d04a6119987c2b9334c5fefd7d8cff52a8a02a3ea4e3995b9a041ace4 \
coin \
0x3f2d9f724f4a1ce5e71676448dc452be9a6243dac9c5b975a588c8c867066e92 \
[61353114536558] \
[0x0000000000000000000000000000000000000000000000000000000000000006] \
--gas-budget 1000000000Обратите внимание: адрес пула передан без кавычек (как объект), а числа и адрес 0x6 - в квадратных скобках. Если пул является объектом, его ID не нужно заключать в кавычки.
Дополнительные советы
- Используйте флаг
--dry-runдля тестирования транзакции без её выполнения. - Проверьте, что объект пула действительно существует и доступен для вашего аккаунта.
- Обновите SUI CLI до последней версии:
sui client upgrade.
Если ошибка сохраняется, опубликуйте полный вывод команды с флагом --json для детальной диагностики.