From 11bfb97f250019833e07ce7e5e7b188c20455fbe Mon Sep 17 00:00:00 2001 From: Anson Date: Mon, 20 Jun 2022 06:27:14 +0800 Subject: [PATCH 1/3] feat(qi-dao): add gnosis chain support --- .../qi-dao/gnosis/qi-dao.balance-fetcher.ts | 43 +++++++++++++++++++ .../gnosis/qi-dao.vault.position-fetcher.ts | 35 +++++++++++++++ .../helpers/qi-dao.vault.position-helper.ts | 2 +- src/apps/qi-dao/qi-dao.definition.ts | 1 + src/apps/qi-dao/qi-dao.module.ts | 7 ++- 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts create mode 100644 src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts diff --git a/src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts b/src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts new file mode 100644 index 000000000..ab6d376a0 --- /dev/null +++ b/src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts @@ -0,0 +1,43 @@ +import { Inject } from '@nestjs/common'; + +import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface'; +import { Register } from '~app-toolkit/decorators'; +import { presentBalanceFetcherResponse } from '~app-toolkit/helpers/presentation/balance-fetcher-response.present'; +import { BalanceFetcher } from '~balance/balance-fetcher.interface'; +import { Network } from '~types/network.interface'; + +import { QiDaoContractFactory } from '../contracts'; +import { QiDaoVaultPositionBalanceHelper } from '../helpers/qi-dao.vault.position-balance-helper'; +import { QI_DAO_DEFINITION } from '../qi-dao.definition'; + +const network = Network.GNOSIS_MAINNET; + +@Register.BalanceFetcher(QI_DAO_DEFINITION.id, Network.GNOSIS_MAINNET) +export class GnosisQiDaoBalanceFetcher implements BalanceFetcher { + constructor( + @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, + @Inject(QiDaoVaultPositionBalanceHelper) + private readonly qiDaoVaultTokenBalanceHelper: QiDaoVaultPositionBalanceHelper, + @Inject(QiDaoContractFactory) private readonly contractFactory: QiDaoContractFactory, + ) { } + + async getVaultTokenBalances(address: string) { + return this.qiDaoVaultTokenBalanceHelper.getPositionBalances({ + address, + network, + }); + } + + async getBalances(address: string) { + const [vaultTokenBalances] = await Promise.all([ + this.getVaultTokenBalances(address), + ]); + + return presentBalanceFetcherResponse([ + { + label: 'Vaults', + assets: vaultTokenBalances, + } + ]); + } +} diff --git a/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts b/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts new file mode 100644 index 000000000..4c2e90f4d --- /dev/null +++ b/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts @@ -0,0 +1,35 @@ +import { Inject } from '@nestjs/common'; + +import { Register } from '~app-toolkit/decorators'; +import { PositionFetcher } from '~position/position-fetcher.interface'; +import { ContractPosition } from '~position/position.interface'; +import { Network } from '~types/network.interface'; + +import { QiDaoVaultPositionDataProps, QiDaoVaultPositionHelper } from '../helpers/qi-dao.vault.position-helper'; +import { QI_DAO_DEFINITION } from '../qi-dao.definition'; + +const appId = QI_DAO_DEFINITION.id; +const groupId = QI_DAO_DEFINITION.groups.vault.id; +const network = Network.GNOSIS_MAINNET; + +@Register.ContractPositionFetcher({ appId, groupId, network, options: { includeInTvl: true } }) +export class GnosisQiDaoVaultPositionFetcher implements PositionFetcher> { + constructor(@Inject(QiDaoVaultPositionHelper) private readonly qiDaoVaultPositionHelper: QiDaoVaultPositionHelper) { } + + getPositions() { + return this.qiDaoVaultPositionHelper.getPositions({ + network, + debtTokenAddress: '0x3F56e0c36d275367b8C502090EDF38289b3dEa0d', + vaults: [ + { + nftAddress: '0x5c49b268c9841AFF1Cc3B0a418ff5c3442eE3F3b', // WETH + vaultInfoAddress: '0x5c49b268c9841AFF1Cc3B0a418ff5c3442eE3F3b', + }, + { + nftAddress: '0x014a177e9642d1b4e970418f894985dc1b85657f', // GNO + vaultInfoAddress: '0x014a177e9642d1b4e970418f894985dc1b85657f', + } + ], + }); + } +} diff --git a/src/apps/qi-dao/helpers/qi-dao.vault.position-helper.ts b/src/apps/qi-dao/helpers/qi-dao.vault.position-helper.ts index 8c0246695..9e93d17f0 100644 --- a/src/apps/qi-dao/helpers/qi-dao.vault.position-helper.ts +++ b/src/apps/qi-dao/helpers/qi-dao.vault.position-helper.ts @@ -37,7 +37,7 @@ export class QiDaoVaultPositionHelper { constructor( @Inject(APP_TOOLKIT) private readonly appToolkit: IAppToolkit, @Inject(QiDaoContractFactory) protected readonly contractFactory: QiDaoContractFactory, - ) {} + ) { } async getPositions({ network, vaults, debtTokenAddress, dependencies = [] }: QiDaoVaultPositionHelperParams) { const multicall = this.appToolkit.getMulticall(network); diff --git a/src/apps/qi-dao/qi-dao.definition.ts b/src/apps/qi-dao/qi-dao.definition.ts index 4319c16b1..73a6f4338 100644 --- a/src/apps/qi-dao/qi-dao.definition.ts +++ b/src/apps/qi-dao/qi-dao.definition.ts @@ -26,6 +26,7 @@ export const QI_DAO_DEFINITION = appDefinition({ supportedNetworks: { [Network.FANTOM_OPERA_MAINNET]: [AppAction.VIEW], [Network.POLYGON_MAINNET]: [AppAction.VIEW], + [Network.GNOSIS_MAINNET]: [AppAction.VIEW], }, }); diff --git a/src/apps/qi-dao/qi-dao.module.ts b/src/apps/qi-dao/qi-dao.module.ts index 509807ba0..9509f1082 100644 --- a/src/apps/qi-dao/qi-dao.module.ts +++ b/src/apps/qi-dao/qi-dao.module.ts @@ -5,6 +5,8 @@ import { QiDaoContractFactory } from './contracts'; import { FantomQiDaoBalanceFetcher } from './fantom/qi-dao.balance-fetcher'; import { FantomQiDaoFarmContractPositionFetcher } from './fantom/qi-dao.farm.contract-position-fetcher'; import { FantomQiDaoVaultPositionFetcher } from './fantom/qi-dao.vault.position-fetcher'; +import { GnosisQiDaoBalanceFetcher } from './gnosis/qi-dao.balance-fetcher'; +import { GnosisQiDaoVaultPositionFetcher } from './gnosis/qi-dao.vault.position-fetcher'; import { QiDaoVaultPositionBalanceHelper } from './helpers/qi-dao.vault.position-balance-helper'; import { QiDaoVaultPositionHelper } from './helpers/qi-dao.vault.position-helper'; import { PolygonQiDaoAnchorVaultPositionFetcher } from './polygon/qi-dao.anchor-vault.contract-position-fetcher'; @@ -33,6 +35,9 @@ import { QiDaoAppDefinition, QI_DAO_DEFINITION } from './qi-dao.definition'; PolygonQiDaoVaultPositionFetcher, PolygonQiDaoYieldTokenFetcher, PolygonQiDaoAnchorVaultPositionFetcher, + // Gnosis + GnosisQiDaoBalanceFetcher, + GnosisQiDaoVaultPositionFetcher, ], }) -export class QiDaoAppModule extends AbstractApp() {} +export class QiDaoAppModule extends AbstractApp() { } From 8f86a0c1d8f978258b07eb1348820b028c992e14 Mon Sep 17 00:00:00 2001 From: Anson Date: Tue, 21 Jun 2022 00:17:25 +0800 Subject: [PATCH 2/3] chore: lowercase addresses --- src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts b/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts index 4c2e90f4d..c86c4953b 100644 --- a/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts +++ b/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts @@ -19,11 +19,11 @@ export class GnosisQiDaoVaultPositionFetcher implements PositionFetcher Date: Tue, 21 Jun 2022 07:49:52 +0800 Subject: [PATCH 3/3] chore: eslint --- src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts | 8 +++----- src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts | 4 ++-- src/apps/qi-dao/helpers/qi-dao.vault.position-helper.ts | 2 +- src/apps/qi-dao/qi-dao.module.ts | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts b/src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts index ab6d376a0..44f023425 100644 --- a/src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts +++ b/src/apps/qi-dao/gnosis/qi-dao.balance-fetcher.ts @@ -19,7 +19,7 @@ export class GnosisQiDaoBalanceFetcher implements BalanceFetcher { @Inject(QiDaoVaultPositionBalanceHelper) private readonly qiDaoVaultTokenBalanceHelper: QiDaoVaultPositionBalanceHelper, @Inject(QiDaoContractFactory) private readonly contractFactory: QiDaoContractFactory, - ) { } + ) {} async getVaultTokenBalances(address: string) { return this.qiDaoVaultTokenBalanceHelper.getPositionBalances({ @@ -29,15 +29,13 @@ export class GnosisQiDaoBalanceFetcher implements BalanceFetcher { } async getBalances(address: string) { - const [vaultTokenBalances] = await Promise.all([ - this.getVaultTokenBalances(address), - ]); + const [vaultTokenBalances] = await Promise.all([this.getVaultTokenBalances(address)]); return presentBalanceFetcherResponse([ { label: 'Vaults', assets: vaultTokenBalances, - } + }, ]); } } diff --git a/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts b/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts index c86c4953b..efccd3786 100644 --- a/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts +++ b/src/apps/qi-dao/gnosis/qi-dao.vault.position-fetcher.ts @@ -14,7 +14,7 @@ const network = Network.GNOSIS_MAINNET; @Register.ContractPositionFetcher({ appId, groupId, network, options: { includeInTvl: true } }) export class GnosisQiDaoVaultPositionFetcher implements PositionFetcher> { - constructor(@Inject(QiDaoVaultPositionHelper) private readonly qiDaoVaultPositionHelper: QiDaoVaultPositionHelper) { } + constructor(@Inject(QiDaoVaultPositionHelper) private readonly qiDaoVaultPositionHelper: QiDaoVaultPositionHelper) {} getPositions() { return this.qiDaoVaultPositionHelper.getPositions({ @@ -28,7 +28,7 @@ export class GnosisQiDaoVaultPositionFetcher implements PositionFetcher