There's two ways of decoding events in rust: statically typed and dynamically typed. Statically you can use subxt to decode events from this SCALE encoding - it's done [here][1] for example. Basically every runtime has a concrete Event type and that's what you're decoding into. ``` let event_bytes = hex::decode("0x1000000000000000585f8f090000000002000000010000000508ba6ef6480a2c4173bbbf0c27355c0e3c6d7a874a21cc2464e97d3fd5d92e245b1b5a7307000000000000000000000000000001000000080380eb30ca364f5c349d573b62cfadadba95af2e94f62fd8af4e15b90b971a4da633803b0648373051a1e2158c547112dcf63802d0d52b301a33dae8b9c6114e90f012b8516d57525358775a7476385956586574346e43424a396776646d4a6e3564364b34385a6a6148704763515a75676300000100000000001027000000000000000000").unwrap(); let event = <polkadot::Event as Decode>::decode(&mut event_bytes.as_slice()).unwrap(); ``` and I have polkadot defined as: ``` #[subxt::subxt(runtime_metadata_path = "polkadot_metadata.scale")] pub mod polkadot {} ``` (rather than pointing it at a metadata file you can download it by giving it a url `#[subxt::subxt(runtime_metadata_path = "wss://kusama-rpc.polkadot.io:443")]`. If you point that at your node's url then it should decode your event.) Dynamically the tooling needs generalising, but [it is possible][2] and has been done by cargo-contract. If you need to interpret all events across all parachains then go dynamic. If you are focused on a few particular parachains then static typing is a lot safer and easier. [1]: https://github.com/paritytech/subxt/blob/master/examples/examples/subscribe_all_events.rs [2]: https://github.com/paritytech/cargo-contract/blob/1dab046b73bb06425962435bc1d397fc480c4b89/src/cmd/extrinsics/events.rs#L61