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 }