use alloy_chains::NamedChain;
use alloy_primitives::{Address, U256};
use bon::Builder;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Builder, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct TransferRouterFunds {
chain: NamedChain,
from: Address,
to: Address,
token: Address,
amount: U256,
}
impl TransferRouterFunds {
pub fn chain(&self) -> NamedChain {
self.chain
}
pub fn from(&self) -> Address {
self.from
}
pub fn to(&self) -> Address {
self.to
}
pub fn token(&self) -> Address {
self.token
}
pub fn amount(&self) -> U256 {
self.amount
}
pub fn transfer_router_funds_params(&self) -> (Vec<Address>, Vec<U256>, Address) {
(vec![self.token], vec![self.amount], self.to)
}
}
impl Serialize for TransferRouterFunds {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let chain_id: u64 = self.chain.into();
let data = (chain_id, self.from, self.to, self.token, self.amount);
data.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for TransferRouterFunds {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let (chain_id, from, to, token, amount): (u64, Address, Address, Address, U256) =
Deserialize::deserialize(deserializer)?;
let chain = NamedChain::try_from(chain_id).map_err(serde::de::Error::custom)?;
Ok(Self {
chain,
from,
to,
token,
amount,
})
}
}