1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//! Hashing and signing of typed structured data as opposed to just bytestrings.
//!
//! # static
//!
//! This module extends [`serde`] as the serialisation/deserialisation framework for eip712.
//!
//! ```no_run
//! # fn main() {
//! use reweb3::eip::eip712::*;
//! use ::serde::{Deserialize, Serialize};
//! use ::serde_json::json;
//! use reweb3::primitives::Address;
//!
//! let domain = json!({
//! "name": "Ether Mail",
//! "version": "1",
//! "chainId": 1,
//! "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC",
//! });
//!
//! let domain: EIP712Domain = serde_json::from_value(domain).unwrap();
//!
//! let type_definitions = serde::eip712_type_definitions(&domain).unwrap();
//!
//! assert_eq!(
//! serde::eip712_hash_struct("EIP712Domain", &type_definitions, &domain)
//! .unwrap()
//! .to_string(),
//! "0xf2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090f"
//! );
//!
//! #[derive(Debug, Serialize, Deserialize, PartialEq)]
//! struct Person {
//! pub name: String,
//! pub wallet: Address,
//! }
//!
//! #[derive(Debug, Serialize, Deserialize, PartialEq)]
//! struct Mail {
//! pub from: Person,
//! pub to: Person,
//! pub contents: String,
//! }
//!
//! let json = json!({
//! "from": {
//! "name": "Cow",
//! "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"
//! },
//! "to": {
//! "name": "Bob",
//! "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"
//! },
//! "contents": "Hello, Bob!"
//! });
//!
//! let mail: Mail = serde_json::from_value(json).expect("parse domain");
//!
//! assert_eq!(
//! "Mail(Person from,Person to,string contents)Person(string name,address wallet)",
//! serde::eip712_encode_type(&mail).expect("generate e712 types")
//! );
//!
//! let expect_request: TypedData<Mail> =
//! serde_json::from_str(include_str!("./eip712.json")).unwrap();
//!
//! assert_eq!(eip712_into_request(domain, mail).unwrap(), expect_request);
//!
//! assert_eq!(
//! expect_request.sign_hash().unwrap(),
//! "0xbe609aee343fb3c4b28e1df9e632fca64fcfaede20f02e86244efddf30957bd2"
//! .parse()
//! .unwrap()
//! );
//! # }
//! ```
//! # Dynamic
//!
//! With [`serde_json`] this module provides ***limited dynamic reflection*** capabilities:
//!
//! ```no_run
//! # fn main() {
//! # use reweb3::eip::eip712::*;
//! // Use `serde_json::Value` to create a TypedData
//! let expect_request: TypedData<serde_json::Value> =
//! serde_json::from_str(include_str!("./eip712.json")).unwrap();
//!
//! assert_eq!(
//! expect_request.sign_hash().unwrap(),
//! "0xbe609aee343fb3c4b28e1df9e632fca64fcfaede20f02e86244efddf30957bd2"
//! .parse()
//! .unwrap()
//! );
//! # }
//! ```
pub use *;