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_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}