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_entities::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        erc20_token: Address,
18        account: Address,
19    ) -> Result<U256, PoolError> {
20        let input = IERC20::IERC20Calls::balanceOf(IERC20::balanceOfCall { account }).abi_encode();
21        let (call_data_result, _, _) = evm_call(db, EvmEnv::default(), erc20_token, input)?;
22
23        let call_return = IERC20::balanceOfCall::abi_decode_returns(&call_data_result)
24            .map_err(|e| PoolError::AbiDecodingError { method: "balanceOf", source: e })?;
25        Ok(call_return)
26    }
27
28    pub fn allowance<DB: DatabaseRef<Error = KabuDBError> + ?Sized>(
29        db: &DB,
30        erc20_token: Address,
31        owner: Address,
32        spender: Address,
33    ) -> Result<U256, PoolError> {
34        let input = IERC20::IERC20Calls::allowance(IERC20::allowanceCall { owner, spender }).abi_encode();
35        let (call_data_result, _, _) = evm_call(db, EvmEnv::default(), erc20_token, input)?;
36
37        let call_return = IERC20::allowanceCall::abi_decode_returns(&call_data_result)
38            .map_err(|e| PoolError::AbiDecodingError { method: "allowance", source: e })?;
39        Ok(call_return)
40    }
41}