kabu_broadcast_flashbots/client/
utils.rs1use 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}