1use alloy_primitives::{Address, Bytes, U256};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
11pub struct Call {
12 pub target: Address,
13 pub calldata: Bytes,
14 pub value: U256,
15}
16
17#[derive(Debug, Clone, PartialEq, Eq)]
22pub struct TokenApproval {
23 pub token: Address,
24 pub spender: Address,
25 pub min_amount: U256,
26}
27
28#[derive(Debug, Clone, PartialEq, Eq)]
30pub struct TokenAmount {
31 pub token: Address,
32 pub amount: U256,
33}
34
35#[derive(Debug, Clone, PartialEq, Eq, Default)]
40pub struct PlanFragment {
41 pub calls: Vec<Call>,
42 pub approvals: Vec<TokenApproval>,
43 pub value: U256,
44}
45
46#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
50pub struct SlippageBps(u16);
51
52impl SlippageBps {
53 pub const fn new(bps: u16) -> Self {
54 assert!(bps <= 10_000, "slippage cannot exceed 100%");
55 Self(bps)
56 }
57 pub const fn as_bps(self) -> u16 {
58 self.0
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65 use alloy_primitives::{address, bytes};
66
67 #[test]
68 fn call_constructs_with_zero_value() {
69 let call = Call {
70 target: address!("0x0000000000000000000000000000000000000001"),
71 calldata: bytes!("deadbeef"),
72 value: U256::ZERO,
73 };
74 assert_eq!(call.value, U256::ZERO);
75 assert_eq!(call.calldata.len(), 4);
76 }
77
78 #[test]
79 fn slippage_bps_accepts_10000_bps() {
80 let _ok = SlippageBps::new(10_000);
81 }
82
83 #[test]
84 #[should_panic(expected = "slippage cannot exceed 100%")]
85 fn slippage_bps_rejects_over_10000_bps() {
86 let _ = SlippageBps::new(10_001);
87 }
88}