kabu_broadcast_flashbots/client/
utils.rs

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