kabu_defi_pools/state_readers/
erc20.rs

1use alloy::primitives::{Address, U256};
2use alloy::sol_types::{SolCall, SolInterface};
3use alloy_evm::EvmEnv;
4use eyre::Result;
5use kabu_defi_abi::IERC20;
6use kabu_evm_db::KabuDBError;
7use kabu_evm_utils::evm_call;
8use kabu_types_market::PoolError;
9use revm::DatabaseRef;
10
11pub struct ERC20StateReader {}
12
13#[allow(dead_code)]
14impl ERC20StateReader {
15    pub fn balance_of<DB: DatabaseRef<Error = KabuDBError> + ?Sized>(
16        db: &DB,
17        evm_env: &EvmEnv,
18        erc20_token: Address,
19        account: Address,
20    ) -> Result<U256, PoolError> {
21        let input = IERC20::IERC20Calls::balanceOf(IERC20::balanceOfCall { account }).abi_encode();
22        let (call_data_result, _, _) = evm_call(db, evm_env.clone(), erc20_token, input)?;
23
24        let call_return = IERC20::balanceOfCall::abi_decode_returns(&call_data_result)
25            .map_err(|e| PoolError::AbiDecodingError { method: "balanceOf", source: e })?;
26        Ok(call_return)
27    }
28
29    pub fn allowance<DB: DatabaseRef<Error = KabuDBError> + ?Sized>(
30        db: &DB,
31        evm_env: &EvmEnv,
32        erc20_token: Address,
33        owner: Address,
34        spender: Address,
35    ) -> Result<U256, PoolError> {
36        let input = IERC20::IERC20Calls::allowance(IERC20::allowanceCall { owner, spender }).abi_encode();
37        let (call_data_result, _, _) = evm_call(db, evm_env.clone(), erc20_token, input)?;
38
39        let call_return = IERC20::allowanceCall::abi_decode_returns(&call_data_result)
40            .map_err(|e| PoolError::AbiDecodingError { method: "allowance", source: e })?;
41        Ok(call_return)
42    }
43}