kabu_execution_multicaller/pool_abi_encoder/pools/
maverick.rs1use 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}