/ src / services / DelegationTokenService.ts
DelegationTokenService.ts
 1  import {
 2    AaveTokenV3Service,
 3    DelegateMetaSigParams,
 4    MetaDelegateHelperService,
 5    MetaDelegateParams,
 6  } from '@aave/contract-helpers';
 7  import { Provider } from '@ethersproject/providers';
 8  import { PopulatedTransaction } from 'ethers';
 9  import { FixedPointDecimal } from 'src/architecture/FixedPointDecimal';
10  import { governanceV3Config } from 'src/ui-config/governanceConfig';
11  
12  export interface TokenDelegationPower {
13    address: string;
14    votingPower: FixedPointDecimal;
15    propositionPower: FixedPointDecimal;
16  }
17  
18  export class DelegationTokenService {
19    constructor(private readonly getProvider: (chainId: number) => Provider) {}
20  
21    private getDelegationTokenService(tokenAddress: string, chainId: number) {
22      const provider = this.getProvider(chainId);
23      return new AaveTokenV3Service(tokenAddress, provider);
24    }
25  
26    private getBatchDelegationTokenService(chainId: number) {
27      const provider = this.getProvider(chainId);
28  
29      const GOVERNANCE_META_HELPER = governanceV3Config.addresses.GOVERNANCE_META_HELPER;
30  
31      return new MetaDelegateHelperService(GOVERNANCE_META_HELPER, provider);
32    }
33  
34    async getTokenPowers(
35      user: string,
36      token: string,
37      chainId: number
38    ): Promise<TokenDelegationPower> {
39      const service = this.getDelegationTokenService(token, chainId);
40      const result = await service.getPowers(user);
41      return {
42        address: token,
43        votingPower: new FixedPointDecimal(result.votingPower, 18),
44        propositionPower: new FixedPointDecimal(result.propositionPower, 18),
45      };
46    }
47  
48    // NOTE using MetaDelegateHelperService methods below
49    async getTokenDelegatees(user: string, token: string, chainId: number) {
50      const service = this.getDelegationTokenService(token, chainId);
51      return service.getDelegateeData(user);
52    }
53  
54    async prepareV3DelegateByTypeSignature({
55      underlyingAsset,
56      delegatee,
57      delegationType,
58      delegator,
59      increaseNonce,
60      governanceTokenName,
61      nonce,
62      connectedChainId,
63      deadline,
64    }: DelegateMetaSigParams): Promise<string> {
65      const service = this.getBatchDelegationTokenService(connectedChainId);
66      return service.prepareV3DelegateByTypeSignature({
67        underlyingAsset,
68        delegatee,
69        delegationType,
70        delegator,
71        increaseNonce,
72        governanceTokenName,
73        nonce,
74        connectedChainId,
75        deadline,
76      });
77    }
78  
79    async batchMetaDelegate(
80      user: string,
81      delegateParams: MetaDelegateParams[],
82      connectedChainId: number
83    ): Promise<PopulatedTransaction> {
84      const service = this.getBatchDelegationTokenService(connectedChainId);
85      return service.batchMetaDelegate(user, delegateParams);
86    }
87  }