use codec::{Decode}; use subxt::{config::substrate::H256, OfflineClient, PolkadotConfig}; use subxt_metadata::Metadata; #[subxt::subxt(runtime_metadata_path = "../../../../artifacts/metadata_with_custom_values.scale", derive_for_all_types = "Eq, PartialEq")] pub mod node {} use node::runtime_types::generate_custom_metadata::Foo; fn main() { let api = construct_offline_client(); let expected_foo = Foo { a: 42, b: "Have a great day!".into(), }; // static query: let foo_address = node::custom().foo(); let foo = api.custom_values().at(&foo_address).unwrap(); assert_eq!(foo, expected_foo); // dynamic query: let foo_value = api.custom_values().at("Foo").unwrap(); let foo: Foo = foo_value.as_type().unwrap(); assert_eq!(foo, expected_foo); // static query for some custom value that has an invalid type id: (we can still access the bytes) let custom_bytes = api.custom_values().bytes_at("InvalidTypeId").unwrap(); assert_eq!(vec![0,1,2,3], custom_bytes); } fn construct_offline_client() -> OfflineClient { let genesis_hash = { let h = "91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"; let bytes = hex::decode(h).unwrap(); H256::from_slice(&bytes) }; let runtime_version = subxt::client::RuntimeVersion::new(9370, 20); let metadata = { let bytes = std::fs::read("../../../../artifacts/metadata_with_custom_values.scale").unwrap(); Metadata::decode(&mut &*bytes).unwrap() }; OfflineClient::::new(genesis_hash, runtime_version, metadata) }