Skip to content
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.

Commit

Permalink
fix(aave-amm): Use template for everything (#1230)
Browse files Browse the repository at this point in the history
  • Loading branch information
JForsaken committed Aug 22, 2022
1 parent b7fa512 commit 17e1112
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 12 deletions.
2 changes: 2 additions & 0 deletions src/apps/aave-amm/aave-amm.module.ts
Expand Up @@ -5,6 +5,7 @@ import { AaveV2AppModule } from '~apps/aave-v2';
import { AaveAmmAppDefinition, AAVE_AMM_DEFINITION } from './aave-amm.definition';
import { AaveAmmContractFactory } from './contracts';
import { EthereumAaveAmmBalanceFetcher } from './ethereum/aave-amm.balance-fetcher';
import { EthereumAaveAmmPositionPresenter } from './ethereum/aave-amm.position-presenter';
import { EthereumAaveAmmStableDebtTokenFetcher } from './ethereum/aave-amm.stable-debt.token-fetcher';
import { EthereumAaveAmmSupplyTokenFetcher } from './ethereum/aave-amm.supply.token-fetcher';
import { EthereumAaveAmmVariableDebtTokenFetcher } from './ethereum/aave-amm.variable-debt.token-fetcher';
Expand All @@ -16,6 +17,7 @@ import { EthereumAaveAmmVariableDebtTokenFetcher } from './ethereum/aave-amm.var
AaveAmmAppDefinition,
AaveAmmContractFactory,
EthereumAaveAmmBalanceFetcher,
EthereumAaveAmmPositionPresenter,
EthereumAaveAmmStableDebtTokenFetcher,
EthereumAaveAmmSupplyTokenFetcher,
EthereumAaveAmmVariableDebtTokenFetcher,
Expand Down
44 changes: 44 additions & 0 deletions src/apps/aave-amm/ethereum/aave-amm.position-presenter.ts
@@ -0,0 +1,44 @@
import { Inject, Injectable } from '@nestjs/common';

import { Register } from '~app-toolkit/decorators';
import { AaveV2ContractFactory } from '~apps/aave-v2';
import { PositionPresenterTemplate, ReadonlyBalances } from '~position/template/position-presenter.template';
import { Network } from '~types';

import { AAVE_AMM_DEFINITION } from '../aave-amm.definition';

@Injectable()
export class EthereumAaveAmmPositionPresenter extends PositionPresenterTemplate {
constructor(@Inject(AaveV2ContractFactory) private readonly aaveV2ContractFactory: AaveV2ContractFactory) {
super();
}

appId = AAVE_AMM_DEFINITION.id;
network = Network.ETHEREUM_MAINNET;
lendingPoolAddress = '0x7d2768de32b0b80b7a3454c06bdac94a69ddc7a9';

private async getHealthFactor(address: string) {
const lendingPoolContract = this.aaveV2ContractFactory.aaveV2LendingPoolProvider({
network: this.network,
address: this.lendingPoolAddress,
});

const lendingPoolUserData = await lendingPoolContract.getUserAccountData(address);
return lendingPoolUserData.healthFactor;
}

@Register.BalanceProductMeta('Lending')
async getLendingMeta(address: string, balances: ReadonlyBalances) {
// When no debt, no health factor
if (!balances.some(balance => balance.balanceUSD < 0)) return [];
const healthFactor = await this.getHealthFactor(address);

return [
{
label: 'Health Factor',
value: Number(healthFactor) / 10 ** 18,
type: 'number',
},
];
}
}
@@ -1,12 +1,14 @@
import { Inject } from '@nestjs/common';

import { drillBalance } from '~app-toolkit';
import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface';
import { getLabelFromToken } from '~app-toolkit/helpers/presentation/image.present';
import {
AaveV2LendingTokenDataProps,
AaveV2ReserveApyData,
AaveV2ReserveTokenAddressesData,
} from '~apps/aave-v2/helpers/aave-v2.lending.template.token-fetcher';
import { AppTokenPositionBalance } from '~position/position-balance.interface';
import {
AppTokenTemplatePositionFetcher,
DataPropsStageParams,
Expand Down Expand Up @@ -125,4 +127,23 @@ export abstract class AaveAmmLendingTemplateTokenFetcher extends AppTokenTemplat
}: DisplayPropsStageParams<AaveAmmAToken, AaveV2LendingTokenDataProps>): Promise<string> {
return appToken.symbol;
}

async getBalances(address: string): Promise<AppTokenPositionBalance<AaveV2LendingTokenDataProps>[]> {
const multicall = this.appToolkit.getMulticall(this.network);
const appTokens = await this.appToolkit.getAppTokenPositions<AaveV2LendingTokenDataProps>({
appId: this.appId,
network: this.network,
groupIds: [this.groupId],
});

const balances = await Promise.all(
appTokens.map(async appToken => {
const balanceRaw = await this.getBalancePerToken({ multicall, address, appToken });
const tokenBalance = drillBalance(appToken, balanceRaw.toString(), { isDebt: this.isDebt });
return tokenBalance;
}),
);

return balances as AppTokenPositionBalance<AaveV2LendingTokenDataProps>[];
}
}
4 changes: 2 additions & 2 deletions src/balance/balance-presentation.service.ts
Expand Up @@ -56,7 +56,7 @@ export class BalancePresentationService {
return presenter.present(address, balances);
}

async presentTemplates({ appId, network, balances }: PresentParams): Promise<TokenBalanceResponse> {
async presentTemplates({ address, appId, network, balances }: PresentParams): Promise<TokenBalanceResponse> {
// Use default presenter when no custom presenter
const customPresenter = this.positionPresenterRegistry.get(appId, network);
const defaultPresenter = this.defaultPositionPresenterFactory.build({ appId, network });
Expand All @@ -82,7 +82,7 @@ export class BalancePresentationService {
const groupMetaResolver = balanceProductMetaResolvers?.get(positionGroup.label);
if (!groupMetaResolver) return { label: computedGroupLabel, assets: balances };
else {
const meta = await groupMetaResolver(balances);
const meta = await groupMetaResolver(address, balances);
return { label: computedGroupLabel, assets: balances, meta };
}
}),
Expand Down
7 changes: 5 additions & 2 deletions src/position/position-presenter.registry.ts
Expand Up @@ -12,7 +12,7 @@ export class PositionPresenterRegistry implements OnModuleInit {
private registry = new Map<Network, Map<string, PositionPresenterTemplate>>();
private balanceProductMetaResolverRegistry = new Map<
Network,
Map<string, Map<string, (balances: ReadonlyBalances) => Promise<GroupMeta>>>
Map<string, Map<string, (address: string, balances: ReadonlyBalances) => Promise<GroupMeta>>>
>();

constructor(
Expand Down Expand Up @@ -48,7 +48,10 @@ export class PositionPresenterRegistry implements OnModuleInit {
if (!this.balanceProductMetaResolverRegistry.get(network)?.get(appId))
this.balanceProductMetaResolverRegistry.get(network)?.set(appId, new Map());

this.balanceProductMetaResolverRegistry.get(network)?.get(appId)?.set(groupSelector, methodRef);
this.balanceProductMetaResolverRegistry
.get(network)
?.get(appId)
?.set(groupSelector, (...args) => methodRef.apply(instance, args));
}

get(appId: string, network: Network) {
Expand Down
8 changes: 0 additions & 8 deletions src/position/template/position-presenter.template.ts
@@ -1,6 +1,3 @@
import { Inject } from '@nestjs/common';

import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface';
import { PresentationConfig } from '~app/app.interface';
import { MetadataItemWithLabel } from '~balance/balance-fetcher.interface';
import { ContractPositionBalance, TokenBalance } from '~position/position-balance.interface';
Expand All @@ -12,11 +9,6 @@ export interface PositionPresenter {
}

export abstract class PositionPresenterTemplate implements PositionPresenter {
constructor(
@Inject(APP_TOOLKIT)
protected readonly appToolkit: IAppToolkit,
) {}

abstract network: Network;
abstract appId: string;

Expand Down

0 comments on commit 17e1112

Please sign in to comment.