{"record":{"id":"44f154fadb3788e3","repo":"Pumpkin-MC/Pumpkin","slug":"cannot-construct-cauldronlevelchangeevent-from-was","errorCode":null,"errorMessage":"Cannot construct CauldronLevelChangeEvent from WASM","messagePattern":"Cannot construct CauldronLevelChangeEvent from WASM","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/block.rs","lineNumber":1148,"sourceCode":"            new_level: self.new_level,\n            reason: format!(\"{:?}\", self.reason),\n            entity_id: self.entity.as_ref().map(|e| e.get_entity().entity_id),\n            cancelled: self.cancelled,\n        })\n    }\n\n    fn apply_wasm_event(&mut self, event: Event, state: &mut PluginHostState) {\n        cleanup_event(&event, state);\n        if let Event::CauldronLevelChangeEvent(data) = event {\n            self.new_level = data.new_level;\n            self.cancelled = data.cancelled;\n        }\n    }\n\n    fn from_wasm_event(event: Event, _state: &mut PluginHostState) -> Self {\n        match event {\n            Event::CauldronLevelChangeEvent(_) => {\n                panic!(\"Cannot construct CauldronLevelChangeEvent from WASM\")\n            }\n            _ => panic!(\"unexpected event type\"),\n        }\n    }\n}\n\nimpl ToFromWasmEvent for CrafterCraftEvent {\n    fn to_wasm_event(&self, state: &mut PluginHostState) -> Event {\n        let target_world = state\n            .add_world(self.world.clone())\n            .expect(\"failed to add world resource\");\n        let result = state\n            .add_item_stack(Arc::new(Mutex::new(self.result.clone())))\n            .expect(\"failed to add item stack resource\");\n        Event::CrafterCraftEvent(CrafterCraftEventData {\n            block_pos: to_wasm_block_position(self.block_pos),\n            target_world,\n            result,","sourceCodeStart":1130,"sourceCodeEnd":1166,"githubUrl":"https://github.com/Pumpkin-MC/Pumpkin/blob/8d4639e25a57c15e47448ec327c780d41bbf2356/crates/pumpkin/src/plugin/loader/wasm/wasm_host/wit/v0_1/events/block.rs#L1130-L1166","documentation":"This is an intentional `panic!` in `CauldronLevelChangeEvent::from_wasm_event`. Cauldron level changes originate on the server side only; plugins observe them but cannot construct or send them back. Reaching this arm means something attempted the forbidden reverse conversion, so the host aborts to protect event integrity.","triggerScenarios":"A WASM plugin or generated bridge tries to return/raise `Event::CauldronLevelChangeEvent` to the host, calling `from_wasm_event`.","commonSituations":"Plugin misuse of an event-send API with a host-only event; macro dispatch bug reversing direction; API version mismatch where event directionality changed.","solutions":["Never construct/send `CauldronLevelChangeEvent` from plugin code; only implement its handler","Rebuild the plugin against the matching pumpkin-api/WIT version","Review macro-generated dispatch so host-only events are excluded from send paths","Report a pumpkin-api-macros bug if generated code routes this event backwards"],"exampleFix":"// before (plugin code)\nhost.send_event(Event::CauldronLevelChangeEvent(data)); // panics\n// after\nimpl Plugin for MyPlugin {\n    fn on_cauldron_level_change(&self, ev: CauldronLevelChangeEvent) { /* observe only */ }\n}","handlingStrategy":"type-guard","validationCode":"// plugin side: reject host-only events before any send call\nif matches!(event, Event::CauldronLevelChangeEvent(_)) {\n    log::error!(\"CauldronLevelChangeEvent cannot be sent from plugins\");\n    return;\n}","typeGuard":"fn is_plugin_originated(event: &Event) -> bool {\n    !matches!(event, Event::CauldronLevelChangeEvent(_))\n}","tryCatchPattern":"if matches!(event, Event::CauldronLevelChangeEvent(_)) {\n    log::error!(\"rejected reverse conversion of CauldronLevelChangeEvent\");\n    return;\n}","preventionTips":["Never construct host-originated events in plugin code","Keep event directionality enforced by macros, not runtime panics","Pin plugin bindings to the server's WIT version","Regenerate bindings after API updates"],"tags":["rust","wasm","panic","unsupported-direction"],"backgroundTag":"unsupported-operation","analyzedSha":"8d4639e25a57c15e47448ec327c780d41bbf2356","analyzedAt":"2026-09-09T15:32:22.916Z","contentChangedAt":"2026-09-09T15:32:22.916Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}