kabu_defi_pools/state_readers/
erc20.rs1use 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}