kabu_execution_multicaller/pool_abi_encoder/pools/
uniswapv2.rs

1use 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}