kabu_execution_multicaller/pool_abi_encoder/pools/
uniswapv2.rs1use crate::pool_abi_encoder::ProtocolAbiSwapEncoderTrait;
2use alloy_primitives::{Address, Bytes, U256};
3use alloy_sol_types::SolInterface;
4use eyre::eyre;
5use kabu_defi_abi::uniswap2::IUniswapV2Pair;
6use kabu_types_entities::Pool;
7
8pub struct UniswapV2ProtocolAbiEncoder;
9
10impl UniswapV2ProtocolAbiEncoder {
11 #[inline]
12 pub fn get_zero_for_one(token_address_from: &Address, token_address_to: &Address) -> bool {
13 token_address_from < token_address_to
14 }
15}
16
17impl ProtocolAbiSwapEncoderTrait for UniswapV2ProtocolAbiEncoder {
18 fn encode_swap_in_amount_provided(
19 &self,
20 _pool: &dyn Pool,
21 _token_from_address: Address,
22 _token_to_address: Address,
23 _amount: U256,
24 _recipient: Address,
25 _payload: Bytes,
26 ) -> eyre::Result<Bytes> {
27 Err(eyre!("NOT_SUPPORTED"))
28 }
29
30 fn encode_swap_out_amount_provided(
31 &self,
32 _pool: &dyn Pool,
33 token_from_address: Address,
34 token_to_address: Address,
35 amount: U256,
36 recipient: Address,
37 payload: Bytes,
38 ) -> eyre::Result<Bytes> {
39 let swap_call = if UniswapV2ProtocolAbiEncoder::get_zero_for_one(&token_from_address, &token_to_address) {
40 IUniswapV2Pair::swapCall { amount0Out: U256::ZERO, amount1Out: amount, to: recipient, data: payload }
41 } else {
42 IUniswapV2Pair::swapCall { amount0Out: amount, amount1Out: U256::ZERO, to: recipient, data: payload }
43 };
44
45 Ok(Bytes::from(IUniswapV2Pair::IUniswapV2PairCalls::swap(swap_call).abi_encode()))
46 }
47
48 fn swap_out_amount_offset(&self, _pool: &dyn Pool, token_from_address: Address, token_to_address: Address) -> Option<u32> {
49 if UniswapV2ProtocolAbiEncoder::get_zero_for_one(&token_from_address, &token_to_address) {
50 Some(0x24)
51 } else {
52 Some(0x04)
53 }
54 }
55
56 fn swap_out_amount_return_offset(&self, _pool: &dyn Pool, token_from_address: Address, token_to_address: Address) -> Option<u32> {
57 if UniswapV2ProtocolAbiEncoder::get_zero_for_one(&token_from_address, &token_to_address) {
58 Some(0x20)
59 } else {
60 Some(0x00)
61 }
62 }
63
64 fn swap_in_amount_offset(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<u32> {
65 None
66 }
67 fn swap_in_amount_return_offset(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<u32> {
68 None
69 }
70
71 fn swap_out_amount_return_script(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<Bytes> {
72 None
73 }
74
75 fn swap_in_amount_return_script(&self, _pool: &dyn Pool, _token_from_address: Address, _token_to_address: Address) -> Option<Bytes> {
76 None
77 }
78}