/ src / services / GovernanceService.ts
GovernanceService.ts
  1  import { AaveGovernanceService, ChainId, Power } from '@aave/contract-helpers';
  2  import { normalize, valueToBigNumber } from '@aave/math-utils';
  3  import { Provider } from '@ethersproject/providers';
  4  import { governanceV3Config } from 'src/ui-config/governanceConfig';
  5  // import { MarketDataType } from 'src/ui-config/marketsConfig';
  6  
  7  export interface Powers {
  8    votingPower: string;
  9    aaveTokenPower: Power;
 10    stkAaveTokenPower: Power;
 11    propositionPower: string;
 12    aaveVotingDelegatee: string;
 13    aavePropositionDelegatee: string;
 14    stkAaveVotingDelegatee: string;
 15    stkAavePropositionDelegatee: string;
 16    aAaveVotingDelegatee: string;
 17    aAavePropositionDelegatee: string;
 18    aAaveTokenPower: Power;
 19  }
 20  
 21  // interface VoteOnProposalData {
 22  //   votingPower: string;
 23  //   support: boolean;
 24  // }
 25  
 26  const AAVE_GOVERNANCE_V2 = '0xEC568fffba86c094cf06b22134B23074DFE2252c';
 27  
 28  export class GovernanceService {
 29    constructor(private readonly getProvider: (chainId: number) => Provider) {}
 30  
 31    private getAaveGovernanceService(chainId: ChainId) {
 32      const provider = this.getProvider(chainId);
 33      return new AaveGovernanceService(provider, {
 34        GOVERNANCE_ADDRESS: AAVE_GOVERNANCE_V2,
 35        GOVERNANCE_HELPER_ADDRESS: governanceV3Config.addresses.TOKEN_POWER_HELPER,
 36      });
 37    }
 38  
 39    // async getVotingPowerAt(
 40    //   marketData: MarketDataType,
 41    //   user: string,
 42    //   strategy: string,
 43    //   block: number
 44    // ) {
 45    //   const aaveGovernanceService = this.getAaveGovernanceService(marketData);
 46    //   return aaveGovernanceService.getVotingPowerAt({
 47    //     user,
 48    //     strategy,
 49    //     block,
 50    //   });
 51    // }
 52  
 53    // async getVoteOnProposal(
 54    //   marketData: MarketDataType,
 55    //   user: string,
 56    //   proposalId: number
 57    // ): Promise<VoteOnProposalData> {
 58    //   const aaveGovernanceService = this.getAaveGovernanceService(marketData);
 59    //   const { votingPower, support } = await aaveGovernanceService.getVoteOnProposal({
 60    //     user,
 61    //     proposalId,
 62    //   });
 63    //   return {
 64    //     votingPower: normalize(votingPower.toString(), 18),
 65    //     support,
 66    //   };
 67    // }
 68  
 69    async getPowers(govChainId: ChainId, user: string, blockHash?: string): Promise<Powers> {
 70      const { aaveTokenAddress, stkAaveTokenAddress, aAaveTokenAddress } =
 71        governanceV3Config.votingAssets;
 72  
 73      const aaveGovernanceService = this.getAaveGovernanceService(govChainId);
 74  
 75      const options: { blockTag?: string } = {};
 76      if (blockHash) {
 77        options.blockTag = blockHash;
 78      }
 79  
 80      const [aaveTokenPower, stkAaveTokenPower, aAaveTokenPower] =
 81        // pass blockhash here as optional
 82        await aaveGovernanceService.getTokensPower(
 83          {
 84            user: user,
 85            tokens: [aaveTokenAddress, stkAaveTokenAddress, aAaveTokenAddress],
 86          },
 87          options
 88        );
 89      // todo setup powers for aAaveToken
 90      const powers = {
 91        votingPower: normalize(
 92          valueToBigNumber(aaveTokenPower.votingPower.toString())
 93            .plus(stkAaveTokenPower.votingPower.toString())
 94            .plus(aAaveTokenPower.votingPower.toString())
 95            .toString(),
 96          18
 97        ),
 98        aAaveTokenPower,
 99        aaveTokenPower,
100        stkAaveTokenPower,
101        propositionPower: normalize(
102          valueToBigNumber(aaveTokenPower.propositionPower.toString())
103            .plus(stkAaveTokenPower.propositionPower.toString())
104            .plus(aAaveTokenPower.votingPower.toString())
105            .toString(),
106          18
107        ),
108        aAaveVotingDelegatee: aAaveTokenPower.delegatedAddressVotingPower,
109        aAavePropositionDelegatee: aAaveTokenPower.delegatedAddressPropositionPower,
110  
111        aaveVotingDelegatee: aaveTokenPower.delegatedAddressVotingPower,
112        aavePropositionDelegatee: aaveTokenPower.delegatedAddressPropositionPower,
113  
114        stkAaveVotingDelegatee: stkAaveTokenPower.delegatedAddressVotingPower,
115  
116        stkAavePropositionDelegatee: stkAaveTokenPower.delegatedAddressPropositionPower,
117      };
118      return powers;
119    }
120  }