use starknet::{core::types::TypedData, macros::felt};
fn main() {
let raw = r#"{
"types": {
"StarknetDomain": [
{ "name": "name", "type": "shortstring" },
{ "name": "version", "type": "shortstring" },
{ "name": "chainId", "type": "shortstring" },
{ "name": "revision", "type": "shortstring" }
],
"Example Message": [
{ "name": "Name", "type": "string" },
{ "name": "Some Array", "type": "u128*" },
{ "name": "Some Object", "type": "My Object" }
],
"My Object": [
{ "name": "Some Selector", "type": "selector" },
{ "name": "Some Contract Address", "type": "ContractAddress" }
]
},
"primaryType": "Example Message",
"domain": {
"name": "Starknet Example",
"version": "1",
"chainId": "SN_MAIN",
"revision": "1"
},
"message": {
"Name": "some name",
"Some Array": [1, 2, 3, 4],
"Some Object": {
"Some Selector": "transfer",
"Some Contract Address": "0x0123"
}
}
}"#;
let typed_data = serde_json::from_str::<TypedData>(raw).unwrap();
println!("SNIP-12 revision: {}", typed_data.revision());
let message_hash = typed_data.message_hash(felt!("0x1234")).unwrap();
println!("SNIP-12 hash: {message_hash:#064x}");
println!(
"Serialized typed message:\n{}",
serde_json::to_string_pretty(&typed_data).unwrap()
);
}