diff --git a/src/modules/governance/governance.contract.resolver.ts b/src/modules/governance/governance.contract.resolver.ts deleted file mode 100644 index 1dde7375f..000000000 --- a/src/modules/governance/governance.contract.resolver.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { Parent, ResolveField, Resolver } from '@nestjs/graphql'; -import { GovernanceAbiService } from './services/governance.abi.service'; -import { GovernanceContract } from './models/governance.contract.model'; -import { GovernanceProposal } from './models/governance.proposal.model'; - -@Resolver(() => GovernanceContract) -export class GovernanceContractResolver { - constructor( - private readonly governanceAbi: GovernanceAbiService, - ) { - } - - @ResolveField() - async minEnergyForPropose(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.minEnergyForPropose(governanceContract.address); - } - - @ResolveField() - async minFeeForPropose(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.minFeeForPropose(governanceContract.address); - } - - @ResolveField() - async quorum(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.quorum(governanceContract.address); - } - - @ResolveField() - async votingDelayInBlocks(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.votingDelayInBlocks(governanceContract.address); - } - - @ResolveField() - async votingPeriodInBlocks(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.votingPeriodInBlocks(governanceContract.address); - } - - @ResolveField() - async feeTokenId(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.feeTokenId(governanceContract.address); - } - - @ResolveField() - async withdrawPercentageDefeated(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.withdrawPercentageDefeated(governanceContract.address); - } - - @ResolveField(() => [GovernanceProposal]) - async proposals(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.proposals(governanceContract.address); - } - - @ResolveField() - async feesCollectorAddress(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.feesCollectorAddress(governanceContract.address); - } - - @ResolveField() - async energyFactoryAddress(@Parent() governanceContract: GovernanceContract): Promise { - return this.governanceAbi.energyFactoryAddress(governanceContract.address); - } -} diff --git a/src/modules/governance/governance.energy.contract.resolver.ts b/src/modules/governance/governance.energy.contract.resolver.ts new file mode 100644 index 000000000..292c4c896 --- /dev/null +++ b/src/modules/governance/governance.energy.contract.resolver.ts @@ -0,0 +1,62 @@ +import { Parent, ResolveField, Resolver } from '@nestjs/graphql'; +import { GovernanceAbiService } from './services/governance.abi.service'; +import { GovernanceEnergyContract } from './models/energy.contract.model'; +import { GovernanceProposal } from './models/governance.proposal.model'; + +@Resolver(() => GovernanceEnergyContract) +export class GovernanceEnergyContractResolver { + constructor( + private readonly governanceAbi: GovernanceAbiService, + ) { + } + + @ResolveField() + async minEnergyForPropose(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.minEnergyForPropose(energyContract.address); + } + + @ResolveField() + async minFeeForPropose(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.minFeeForPropose(energyContract.address); + } + + @ResolveField() + async quorum(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.quorum(energyContract.address); + } + + @ResolveField() + async votingDelayInBlocks(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.votingDelayInBlocks(energyContract.address); + } + + @ResolveField() + async votingPeriodInBlocks(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.votingPeriodInBlocks(energyContract.address); + } + + @ResolveField() + async feeTokenId(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.feeTokenId(energyContract.address); + } + + @ResolveField() + async withdrawPercentageDefeated(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.withdrawPercentageDefeated(energyContract.address); + } + + @ResolveField(() => [GovernanceProposal]) + async proposals(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.proposals(energyContract.address); + } + + @ResolveField() + async feesCollectorAddress(@Parent() energyContract: GovernanceEnergyContract): Promise { + return this.governanceAbi.feesCollectorAddress(energyContract.address); + } + + @ResolveField() + async energyFactoryAddress(@Parent() energyContract: GovernanceEnergyContract): 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..e73c1fff7 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 { GovernanceEnergyContractResolver } from './governance.energy.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, + GovernanceEnergyContractResolver, 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 75% rename from src/modules/governance/models/governance.contract.model.ts rename to src/modules/governance/models/energy.contract.model.ts index 89c1258d1..b116fdc8d 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 GovernanceEnergyContract { @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..6c0e284a0 --- /dev/null +++ b/src/modules/governance/models/governance.union.ts @@ -0,0 +1,16 @@ +import { createUnionType } from '@nestjs/graphql'; +import { GovernanceEnergyContract } from './energy.contract.model'; + +export const GovernanceUnion = createUnionType({ + name: 'GovernanceTypes', + types: () => + [ + GovernanceEnergyContract, + ] as const, + resolveType(governance) { + switch (governance.constructor.name) { + case GovernanceEnergyContract.name: + return GovernanceEnergyContract; + } + }, +}); diff --git a/src/modules/governance/services/governance.service.ts b/src/modules/governance/services/governance.service.ts index c71088b3b..a3b7767e0 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 { GovernanceEnergyContract, 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 { - const governanceAddresses = governanceContractsAddresses(); + async getGovernanceContracts(filters: GovernanceContractsFiltersArgs): Promise> { + let governanceAddresses = governanceContractsAddresses(); - const governance: GovernanceContract[] = []; + if (filters.contracts) { + governanceAddresses = governanceAddresses.filter((address) => !filters.contracts.includes(address)); + } + + const governance: GovernanceEnergyContract[] = []; 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 GovernanceEnergyContract({ + 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';