Как найти причину отсутствия динамического поля Sui с числовым ключом

Клиент может показывать ключ «7», пока контракт ищет другое поле с тем же видимым номером. Важны ID родителя, тип ключа и его кодированное значение.

Воспроизведите расхождение на одном родителе

Возьмите новый registry в тесте Move. Первая проверка учитывает записанные типы ключа и значения, вторая использует более широкий тип ключа. Повторный add на том же родителе и типизированном ключе завершится ошибкой из-за существующей записи.

use sui::dynamic_field as df;
df::add(&mut registry.id, 7u8, 300u64);
assert!(df::exists_with_type<u8, u64>(&registry.id, 7u8), 0);
assert!(!df::exists_with_type<u64, u64>(&registry.id, 7u64), 1);

Различите отсутствующее имя и иной тип значения

Через exists проверьте наличие имени с исходным типом, затем через exists_with_type — тип значения перед заимствованием. Если имя найдено, а вторая проверка не прошла, сверьте развёрнутую схему с декодером клиента. Одно лишь изменение формата отображения числа расхождение типов не устранит.

Источники