ethers_flashbots/
utils.rs

1use 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}