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 }