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_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}