ethers_flashbots/
utils.rs1use ethers::core::types::{H160, U256, U64};
2use serde::{de, Deserialize};
3use serde_json::Value;
4use std::str::FromStr;
5
6pub fn deserialize_u64<'de, D>(deserializer: D) -> Result<U64, D::Error>
7where
8 D: de::Deserializer<'de>,
9{
10 Ok(match Value::deserialize(deserializer)? {
11 Value::String(s) => {
12 if s.as_str() == "0x" {
13 return Ok(U64::zero());
14 }
15
16 if s.as_str().starts_with("0x") {
17 U64::from_str_radix(s.as_str(), 16).map_err(de::Error::custom)?
18 } else {
19 U64::from_dec_str(s.as_str()).map_err(de::Error::custom)?
20 }
21 }
22 Value::Number(num) => U64::from(
23 num.as_u64()
24 .ok_or_else(|| de::Error::custom("Invalid number"))?,
25 ),
26 _ => return Err(de::Error::custom("wrong type")),
27 })
28}
29
30pub fn deserialize_u256<'de, D>(deserializer: D) -> Result<U256, D::Error>
31where
32 D: de::Deserializer<'de>,
33{
34 Ok(match Value::deserialize(deserializer)? {
35 Value::String(s) => {
36 if s.as_str() == "0x" {
37 return Ok(U256::zero());
38 }
39
40 if s.as_str().starts_with("0x") {
41 U256::from_str_radix(s.as_str(), 16).map_err(de::Error::custom)?
42 } else {
43 U256::from_dec_str(s.as_str()).map_err(de::Error::custom)?
44 }
45 }
46 Value::Number(num) => U256::from(
47 num.as_u64()
48 .ok_or_else(|| de::Error::custom("Invalid number"))?,
49 ),
50 _ => return Err(de::Error::custom("wrong type")),
51 })
52}
53
54pub fn deserialize_optional_h160<'de, D>(deserializer: D) -> Result<Option<H160>, D::Error>
55where
56 D: de::Deserializer<'de>,
57{
58 Ok(match Value::deserialize(deserializer)? {
59 Value::String(s) => {
60 if s.as_str() == "0x" {
61 return Ok(None);
62 }
63
64 Some(H160::from_str(s.as_str()).map_err(de::Error::custom)?)
65 }
66 _ => return Err(de::Error::custom("expected a hexadecimal string")),
67 })
68}