diff --git a/src/modules/governance/governance.contract.resolver.ts b/src/modules/governance/governance.contract.resolver.ts index 1dde7375f..25da3f914 100644 --- a/src/modules/governance/governance.contract.resolver.ts +++ b/src/modules/governance/governance.contract.resolver.ts @@ -1,62 +1,62 @@ import { Parent, ResolveField, Resolver } from '@nestjs/graphql'; import { GovernanceAbiService } from './services/governance.abi.service'; -import { GovernanceContract } from './models/governance.contract.model'; +import { EnergyContract } from './models/energy.contract.model'; import { GovernanceProposal } from './models/governance.proposal.model'; -@Resolver(() => GovernanceContract) -export class GovernanceContractResolver { +@Resolver(() => EnergyContract) +export class EnergyContractResolver { constructor( private readonly governanceAbi: GovernanceAbiService, ) { } @ResolveField() - async minEnergyForPropose(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.minEnergyForPropose(governanceContract.address); + async minEnergyForPropose(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.minEnergyForPropose(energyContract.address); } @ResolveField() - async minFeeForPropose(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.minFeeForPropose(governanceContract.address); + async minFeeForPropose(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.minFeeForPropose(energyContract.address); } @ResolveField() - async quorum(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.quorum(governanceContract.address); + async quorum(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.quorum(energyContract.address); } @ResolveField() - async votingDelayInBlocks(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.votingDelayInBlocks(governanceContract.address); + async votingDelayInBlocks(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.votingDelayInBlocks(energyContract.address); } @ResolveField() - async votingPeriodInBlocks(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.votingPeriodInBlocks(governanceContract.address); + async votingPeriodInBlocks(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.votingPeriodInBlocks(energyContract.address); } @ResolveField() - async feeTokenId(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.feeTokenId(governanceContract.address); + async feeTokenId(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.feeTokenId(energyContract.address); } @ResolveField() - async withdrawPercentageDefeated(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.withdrawPercentageDefeated(governanceContract.address); + async withdrawPercentageDefeated(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.withdrawPercentageDefeated(energyContract.address); } @ResolveField(() => [GovernanceProposal]) - async proposals(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.proposals(governanceContract.address); + async proposals(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.proposals(energyContract.address); } @ResolveField() - async feesCollectorAddress(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.feesCollectorAddress(governanceContract.address); + async feesCollectorAddress(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.feesCollectorAddress(energyContract.address); } @ResolveField() - async energyFactoryAddress(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.energyFactoryAddress(governanceContract.address); + async energyFactoryAddress(@Parent() energyContract: EnergyContract): Promise { + return this.governanceAbi.energyFactoryAddress(energyContract.address); } } diff --git a/src/modules/governance/governance.module.ts b/src/modules/governance/governance.module.ts index 906561dcb..89ea04fe0 100644 --- a/src/modules/governance/governance.module.ts +++ b/src/modules/governance/governance.module.ts @@ -7,7 +7,7 @@ import { TokenModule } from '../tokens/token.module'; import { EnergyModule } from '../energy/energy.module'; import { GovernanceAbiService } from './services/governance.abi.service'; import { GovernanceQueryResolver } from './governance.query.resolver'; -import { GovernanceContractResolver } from './governance.contract.resolver'; +import { EnergyContractResolver } from './governance.contract.resolver'; import { GovernanceProposalResolver } from './governance.propose.resolver'; import { GovernanceService } from './services/governance.service'; @@ -28,7 +28,7 @@ import { GovernanceService } from './services/governance.service'; // GovernanceComputeService, // GovernanceTransactionService, GovernanceQueryResolver, - GovernanceContractResolver, + EnergyContractResolver, GovernanceProposalResolver, ], exports: [ diff --git a/src/modules/governance/governance.query.resolver.ts b/src/modules/governance/governance.query.resolver.ts index 0cc03d6e2..04b092651 100644 --- a/src/modules/governance/governance.query.resolver.ts +++ b/src/modules/governance/governance.query.resolver.ts @@ -1,7 +1,7 @@ import { Args, Query, Resolver } from '@nestjs/graphql'; import { GovernanceContractsFiltersArgs } from './models/contracts.filter.args'; import { GovernanceService } from './services/governance.service'; -import { GovernanceContract } from './models/governance.contract.model'; +import { GovernanceUnion } from './models/governance.union'; @Resolver() export class GovernanceQueryResolver { @@ -10,10 +10,10 @@ export class GovernanceQueryResolver { ) { } - @Query(() => [GovernanceContract]) + @Query(() => [GovernanceUnion]) async governanceContracts( @Args() filters: GovernanceContractsFiltersArgs - ): Promise { + ): Promise> { return this.governanceService.getGovernanceContracts(filters); } } diff --git a/src/modules/governance/models/contracts.filter.args.ts b/src/modules/governance/models/contracts.filter.args.ts index 70bf4de09..9057f3a63 100644 --- a/src/modules/governance/models/contracts.filter.args.ts +++ b/src/modules/governance/models/contracts.filter.args.ts @@ -1,4 +1,5 @@ import { ArgsType, Field } from '@nestjs/graphql'; +import { GovernanceType } from './energy.contract.model'; @ArgsType() export class GovernanceContractsFiltersArgs { @@ -7,5 +8,5 @@ export class GovernanceContractsFiltersArgs { @Field(() => [String], { nullable: true }) contracts: string; @Field({ nullable: true }) - type: string; + type: GovernanceType; } diff --git a/src/modules/governance/models/governance.contract.model.ts b/src/modules/governance/models/energy.contract.model.ts similarity index 77% rename from src/modules/governance/models/governance.contract.model.ts rename to src/modules/governance/models/energy.contract.model.ts index 89c1258d1..13d424627 100644 --- a/src/modules/governance/models/governance.contract.model.ts +++ b/src/modules/governance/models/energy.contract.model.ts @@ -1,4 +1,4 @@ -import { Field, Int, ObjectType } from '@nestjs/graphql'; +import { Field, Int, ObjectType, registerEnumType } from '@nestjs/graphql'; import { GovernanceProposal } from './governance.proposal.model'; export enum GovernanceType { @@ -6,8 +6,10 @@ export enum GovernanceType { TOKEN = 'token', } +registerEnumType(GovernanceType, { name: 'GovernanceType' }); + @ObjectType() -export class GovernanceContract { +export class EnergyContract { @Field() address: string; @Field() @@ -31,7 +33,7 @@ export class GovernanceContract { @Field() energyFactoryAddress: string; - constructor(init: Partial) { + constructor(init: Partial) { Object.assign(this, init); } } diff --git a/src/modules/governance/models/governance.union.ts b/src/modules/governance/models/governance.union.ts new file mode 100644 index 000000000..9fefbbf73 --- /dev/null +++ b/src/modules/governance/models/governance.union.ts @@ -0,0 +1,16 @@ +import { createUnionType } from '@nestjs/graphql'; +import { EnergyContract } from './energy.contract.model'; + +export const GovernanceUnion = createUnionType({ + name: 'GovernanceTypes', + types: () => + [ + EnergyContract, + ] as const, + resolveType(governance) { + switch (governance.constructor.name) { + case EnergyContract.name: + return EnergyContract; + } + }, +}); diff --git a/src/modules/governance/services/governance.service.ts b/src/modules/governance/services/governance.service.ts index c71088b3b..7c6bc9f80 100644 --- a/src/modules/governance/services/governance.service.ts +++ b/src/modules/governance/services/governance.service.ts @@ -1,8 +1,9 @@ import { Injectable } from '@nestjs/common'; -import { GovernanceContract } from '../models/governance.contract.model'; -import { governanceContractsAddresses } from '../../../utils/governance'; +import { EnergyContract, GovernanceType } from '../models/energy.contract.model'; +import { governanceContractsAddresses, governanceType } from '../../../utils/governance'; import { GovernanceContractsFiltersArgs } from '../models/contracts.filter.args'; import { GovernanceAbiService } from './governance.abi.service'; +import { GovernanceUnion } from '../models/governance.union'; @Injectable() export class GovernanceService { @@ -10,16 +11,29 @@ export class GovernanceService { private readonly governanceAbi: GovernanceAbiService, ) { } - async getGovernanceContracts(filters: GovernanceContractsFiltersArgs): Promise { + async getGovernanceContracts(filters: GovernanceContractsFiltersArgs): Promise> { const governanceAddresses = governanceContractsAddresses(); - const governance: GovernanceContract[] = []; + if (filters.contracts) { + governanceAddresses.filter((address) => !filters.contracts.includes(address)); + } + + const governance: EnergyContract[] = []; for (const address of governanceAddresses) { - governance.push( - new GovernanceContract({ - address, - }), - ); + const type = governanceType(address); + if (filters.type && filters.type !== type) { + continue; + } + switch (type) { + case GovernanceType.ENERGY: + governance.push( + new EnergyContract({ + address, + }), + ); + break; + } + } return governance; diff --git a/src/utils/governance.ts b/src/utils/governance.ts index d837c6db2..2b2d61dfd 100644 --- a/src/utils/governance.ts +++ b/src/utils/governance.ts @@ -1,4 +1,4 @@ -import { GovernanceType } from '../modules/governance/models/governance.contract.model'; +import { GovernanceType } from '../modules/governance/models/energy.contract.model'; import { scAddress } from '../config'; import { GovernanceProposalStatus } from '../modules/governance/models/governance.proposal.model';