kabu_execution_multicaller/pool_abi_encoder/pools/
maverick.rs

1use crate::pool_abi_encoder::ProtocolAbiSwapEncoderTrait;
2use alloy_primitives::{Address, Bytes, U256};
3use alloy_sol_types::SolInterface;
4use kabu_defi_abi::maverick::IMaverickPool;
5use kabu_defi_abi::maverick::IMaverickPool::IMaverickPoolCalls;
6use kabu_types_entities::Pool;
7use lazy_static::lazy_static;
8
9lazy_static! {
10    static ref LOWER_LIMIT: U256 = U256::from(4295128740u64);
11    static ref UPPER_LIMIT: U256 = U256::from_str_radix("1461446703485210103287273052203988822378723970341", 10).unwrap();
12}
13
14pub struct MaverickProtocolAbiEncoder;
15
16impl MaverickProtocolAbiEncoder {
17    pub fn get_zero_for_one(token_address_from: &Address, token_address_to: &Address) -> bool {
18        token_address_from < token_address_to
19    }
20
21    pub fn get_price_limit(token_address_from: &Address, token_address_to: &Address) -> U256 {
22        if *token_address_from < *token_address_to {
23            *LOWER_LIMIT
24        } else {
25            *UPPER_LIMIT
26        }
27    }
28}
29
30impl ProtocolAbiSwapEncoderTrait for MaverickProtocolAbiEncoder {
31    fn encode_swap_in_amount_provided(
32        &self,
33        _pool: &dyn Pool,
34        token_from_address: Address,
35        token_to_address: Address,
36        amount: U256,
37        recipient: Address,
38        payload: Bytes,
39    ) -> eyre::Result<Bytes> {
40        let token_a_in = MaverickProtocolAbiEncoder::get_zero_for_one(&token_from_address, &token_to_address);
41
42        let swap_call = IMaverickPool::swapCall {
43            recipient,
44            amount,
45            tokenAIn: token_a_in,
46            exactOutput: false,
47            sqrtPriceLimit: U256::ZERO,
48            data: payload,
49        };
50
51        Ok(Bytes::from(IMaverickPoolCalls::swap(swap_call).abi_encode()))
52    }
53
54    fn encode_swap_out_amount_provided(
55        &self,
56        _pool: &dyn Pool,
57        token_from_address: Address,
58        token_to_address: Address,
59        amount: U256,
60        recipient: Address,
61        payload: Bytes,
62    ) -> eyre::Result<Bytes> {
63        let token_a_in = MaverickProtocolAbiEncoder::get_zero_for_one(&token_from_address, &token_to_address);
64        let sqrt_price_limit_x96 = MaverickProtocolAbiEncoder::get_price_limit(&token_from_address, &token_to_address);
65
66        let swap_call = IMaverickPool::swapCall {
67            recipient,
68            amount,
69            tokenAIn: token_a_in,
70            exactOutput: true,
71            sqrtPriceLimit: sqrt_price_limit_x96,
72            data: payload,
73        };
74
75        Ok(Bytes::from(IMaverickPoolCalls::swap(swap_call).abi_encode()))
76    }
77
78    fn swap_in_amount_offset(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<u32> {
79        Some(0x24)
80    }
81
82    fn swap_out_amount_offset(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<u32> {
83        Some(0x24)
84    }
85
86    fn swap_out_amount_return_offset(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<u32> {
87        Some(0x20)
88    }
89
90    fn swap_in_amount_return_offset(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<u32> {
91        Some(0x20)
92    }
93
94    fn swap_out_amount_return_script(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<Bytes> {
95        None
96    }
97
98    fn swap_in_amount_return_script(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<Bytes> {
99        None
100    }
101}