Я могу сгенерировать правильное событие DuskVM и при этом отправить бэкенд, который не может его прочитать.

Скрытый шаг — регистрация в Forge. dusk_core::abi::emit(topic, value) помещает событие в выполнение, но сама по себе отправка не добавляет его в сгенерированную схему. Чтобы драйвер данных смог декодировать это событие, мне всё равно нужно определить сериализуемый тип события, реализовать ContractEvent, зарегистрировать его в #[dusk_forge::contract(events = [...])], а затем отправить зарегистрированный тип.

Пропусти одно из этих звеньев — и контракт сможет корректно выполниться, но интеграция потеряет читаемую событийную поверхность, от которой она зависит.

Последствие, о котором я забочусь: редемпшн в приложении “застревает” после того, как уже завершился on-chain. Состояние контракта сдвинулось. Транзакция пользователя финализировалась. Мой бэкенд всё ещё ждёт, потому что байты события не имеют сгенерированного декодера, с которым он умеет работать.

Я бы протестировал событие снаружи контракта: собрать драйвер, осмотреть схему, декодировать отправленные байты, а затем заставить UI редемпшна зависеть от этого.

В DuskVM финишная черта — не “событие отправлено”. Финиш — “событие декодировано потребителем”.

#dusk $DUSK @Dusk