/ src / services / ApprovedAmountService.ts
ApprovedAmountService.ts
 1  import { ApproveType } from '@aave/contract-helpers';
 2  import { Provider } from '@ethersproject/providers';
 3  import { MarketDataType } from 'src/ui-config/marketsConfig';
 4  
 5  export class ApprovedAmountService {
 6    constructor(private readonly getProvider: (chainId: number) => Provider) {}
 7  
 8    private async getERC20Service(chainId: number) {
 9      const provider = this.getProvider(chainId);
10      const ERC20Service = (await import('@aave/contract-helpers')).ERC20Service;
11      return new ERC20Service(provider);
12    }
13  
14    private async getPoolService(marketData: MarketDataType) {
15      const provider = this.getProvider(marketData.chainId);
16      const PoolBundle = (await import('@aave/contract-helpers')).PoolBundle;
17      return new PoolBundle(provider, {
18        POOL: marketData.addresses.LENDING_POOL,
19        WETH_GATEWAY: marketData.addresses.WETH_GATEWAY,
20        L2_ENCODER: marketData.addresses.L2_ENCODER,
21      });
22    }
23  
24    private async getLendingPoolService(marketData: MarketDataType) {
25      const provider = this.getProvider(marketData.chainId);
26      const LendingPoolBundle = (await import('@aave/contract-helpers')).LendingPoolBundle;
27      return new LendingPoolBundle(provider, {
28        LENDING_POOL: marketData.addresses.LENDING_POOL,
29        WETH_GATEWAY: marketData.addresses.WETH_GATEWAY,
30      });
31    }
32  
33    async getPoolApprovedAmount(
34      marketData: MarketDataType,
35      user: string,
36      token: string
37    ): Promise<ApproveType> {
38      if (marketData.v3) {
39        const pool = await this.getPoolService(marketData);
40        return pool.supplyTxBuilder.getApprovedAmount({
41          user,
42          token,
43        });
44      } else {
45        const lendingPool = await this.getLendingPoolService(marketData);
46        return lendingPool.depositTxBuilder.getApprovedAmount({ user, token });
47      }
48    }
49  
50    async getApprovedAmount(
51      chainId: number,
52      user: string,
53      token: string,
54      spender: string
55    ): Promise<number> {
56      const service = await this.getERC20Service(chainId);
57      return service.approvedAmount({
58        user,
59        token,
60        spender,
61      });
62    }
63  }