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_market::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 { *LOWER_LIMIT } else { *UPPER_LIMIT }
23    }
24}
25
26impl ProtocolAbiSwapEncoderTrait for MaverickProtocolAbiEncoder {
27    fn encode_swap_in_amount_provided(
28        &self,
29        _pool: &dyn Pool,
30        token_from_address: Address,
31        token_to_address: Address,
32        amount: U256,
33        recipient: Address,
34        payload: Bytes,
35    ) -> eyre::Result<Bytes> {
36        let token_a_in = MaverickProtocolAbiEncoder::get_zero_for_one(&token_from_address, &token_to_address);
37
38        let swap_call = IMaverickPool::swapCall {
39            recipient,
40            amount,
41            tokenAIn: token_a_in,
42            exactOutput: false,
43            sqrtPriceLimit: U256::ZERO,
44            data: payload,
45        };
46
47        Ok(Bytes::from(IMaverickPoolCalls::swap(swap_call).abi_encode()))
48    }
49
50    fn encode_swap_out_amount_provided(
51        &self,
52        _pool: &dyn Pool,
53        token_from_address: Address,
54        token_to_address: Address,
55        amount: U256,
56        recipient: Address,
57        payload: Bytes,
58    ) -> eyre::Result<Bytes> {
59        let token_a_in = MaverickProtocolAbiEncoder::get_zero_for_one(&token_from_address, &token_to_address);
60        let sqrt_price_limit_x96 = MaverickProtocolAbiEncoder::get_price_limit(&token_from_address, &token_to_address);
61
62        let swap_call = IMaverickPool::swapCall {
63            recipient,
64            amount,
65            tokenAIn: token_a_in,
66            exactOutput: true,
67            sqrtPriceLimit: sqrt_price_limit_x96,
68            data: payload,
69        };
70
71        Ok(Bytes::from(IMaverickPoolCalls::swap(swap_call).abi_encode()))
72    }
73
74    fn swap_in_amount_offset(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<u32> {
75        Some(0x24)
76    }
77
78    fn swap_out_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_return_offset(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<u32> {
83        Some(0x20)
84    }
85
86    fn swap_in_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_out_amount_return_script(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<Bytes> {
91        None
92    }
93
94    fn swap_in_amount_return_script(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<Bytes> {
95        None
96    }
97}