diff --git a/src/config/devnet.json b/src/config/devnet.json index 3ad4a2b23..0d2f39787 100644 --- a/src/config/devnet.json +++ b/src/config/devnet.json @@ -50,8 +50,11 @@ "lockedTokenWrapper": "erd1qqqqqqqqqqqqqpgq9ej9vcnr38l69rgkc735kgv0qlu2ptrsd8ssu9rwtu", "escrow": "erd1qqqqqqqqqqqqqpgqz0wkk0j6y4h0mcxfxsg023j4x5sfgrmz0n4s4swp7a", "governance": { + "oldEnergy": [ + "erd1qqqqqqqqqqqqqpgqdt9aady5jp7av97m7rqxh6e5ywyqsplz2jps5mw02n" + ], "energy": [ - "erd1qqqqqqqqqqqqqpgqzvcvh8ur47nlwxsa9wf7gvrlmf764aerczfsnsjudc" + "erd1qqqqqqqqqqqqqpgqzvcvh8ur47nlwxsa9wf7gvrlmf764aerczfsnsjudc" ], "tokenSnapshot": [ "erd1qqqqqqqqqqqqqpgq2rkrhef99hhk3ynfcxevcj86axr3sgmcczfstkmdwr" diff --git a/src/config/mainnet.json b/src/config/mainnet.json index eddea6c84..581a56fbb 100644 --- a/src/config/mainnet.json +++ b/src/config/mainnet.json @@ -35,6 +35,9 @@ "lockedTokenWrapper": "erd1qqqqqqqqqqqqqpgqu64gygjs5ted4rupaewaszyhaxl9lv7m2jpsw47nzr", "escrow": "erd1qqqqqqqqqqqqqpgqeh4yv09rmyg4xgn5ma03mvm4v5gndu8w2jpsglz3cn", "governance": { + "oldEnergy": [ + "erd1qqqqqqqqqqqqqpgqdt9aady5jp7av97m7rqxh6e5ywyqsplz2jps5mw02n" + ], "energy": [], "tokenSnapshot": [ "erd1qqqqqqqqqqqqqpgq7cywmem5g66ad49rce0ctu6yqmscmp9v7j6q7cded4" diff --git a/src/config/staging.json b/src/config/staging.json index f35117c85..663de39de 100644 --- a/src/config/staging.json +++ b/src/config/staging.json @@ -35,6 +35,9 @@ "lockedTokenWrapper": "erd1qqqqqqqqqqqqqpgq97fctvqlskzu0str05muew2qyjttp8kfkp2sl9k0gx", "escrow": "erd1qqqqqqqqqqqqqpgqeh4yv09rmyg4xgn5ma03mvm4v5gndu8w2jpsglz3cn", "governance": { + "oldEnergy": [ + "erd1qqqqqqqqqqqqqpgqdt9aady5jp7av97m7rqxh6e5ywyqsplz2jps5mw02n" + ], "energy": [], "tokenSnapshot": [ "erd1qqqqqqqqqqqqqpgq7cywmem5g66ad49rce0ctu6yqmscmp9v7j6q7cded4" diff --git a/src/modules/governance/entities/lkmex.proposal.ts b/src/modules/governance/entities/lkmex.proposal.ts new file mode 100644 index 000000000..808bf5302 --- /dev/null +++ b/src/modules/governance/entities/lkmex.proposal.ts @@ -0,0 +1,37 @@ +import { DescriptionV1, GovernanceProposalStatus } from '../models/governance.proposal.model'; +import { ProposalVotes } from '../models/governance.proposal.votes.model'; + +export class GovernanceLKMEXProposal { + description = new DescriptionV1({ + title: 'Maiar DEX to transform Into xExchange with New MEX 2.0 Economic Model', + shortDescription: + 'xExchange (Maiar DEX 2.0) presents a set of significant improvements and benefits, while correcting the most important limitations residing in the previous economics model.', + strapiId: 0, + version: 1, + }); + votes = new ProposalVotes({ + upVotes: '3615976209993', + downVotes: '210776056445', + downVetoVotes: '0', + abstainVotes: '274849971635', + totalVotes: '4101602200000', + upPercentage: '0.88', + downPercentage: '0.05', + downVetoPercentage: '0', + abstainPercentage: '0.06', + quorum: '0', + }); + status = GovernanceProposalStatus.Succeeded; + turnoutPercentage = '60.83'; + proposalId = 1; + + toJSOSN() { + return { + proposalId: this.proposalId, + description: this.description, + votes: this.votes, + status: this.status, + turnoutPercentage: this.turnoutPercentage, + }; + } +} diff --git a/src/modules/governance/governance.module.ts b/src/modules/governance/governance.module.ts index 4cc542a53..15699f272 100644 --- a/src/modules/governance/governance.module.ts +++ b/src/modules/governance/governance.module.ts @@ -17,7 +17,7 @@ import { } from './resolvers/governance.contract.resolver'; import { GovernanceSetterService } from './services/governance.setter.service'; import { GovernanceQueryResolver } from './resolvers/governance.query.resolver'; -import { GovernanceProposalResolver } from './resolvers/governance.proposal.resolver'; +import { GovernanceLKMEXProposalResolver, GovernanceProposalResolver } from './resolvers/governance.proposal.resolver'; import { ElasticService } from 'src/helpers/elastic.service'; import { GovernanceEnergyService, GovernanceTokenSnapshotService } from './services/governance.service'; import { GovernanceAbiFactory } from './services/governance.abi.factory'; @@ -50,6 +50,7 @@ import { GovernanceServiceFactory } from './services/governance.factory'; GovernanceEnergyContractResolver, GovernanceTokenSnapshotContractResolver, GovernanceProposalResolver, + GovernanceLKMEXProposalResolver, ElasticService, ], exports: [ diff --git a/src/modules/governance/models/governance.contract.model.ts b/src/modules/governance/models/governance.contract.model.ts index 13d15aaf1..98b48be9d 100644 --- a/src/modules/governance/models/governance.contract.model.ts +++ b/src/modules/governance/models/governance.contract.model.ts @@ -1,5 +1,5 @@ import { Field, Int, ObjectType } from '@nestjs/graphql'; -import { GovernanceProposalModel } from './governance.proposal.model'; +import { GovernanceLKMEXProposalModel, GovernanceProposalModel } from './governance.proposal.model'; import { EsdtToken } from '../../tokens/models/esdtToken.model'; @ObjectType() @@ -46,3 +46,15 @@ export class GovernanceEnergyContract extends GovernanceTokenSnapshotContract { Object.assign(this, init); } } + +@ObjectType() +export class GovernanceOldEnergyContract { + @Field() + address: string; + @Field(() => [GovernanceLKMEXProposalModel]) + proposals: GovernanceLKMEXProposalModel[]; + + constructor(init: Partial) { + Object.assign(this, init); + } +} diff --git a/src/modules/governance/models/governance.proposal.model.ts b/src/modules/governance/models/governance.proposal.model.ts index 88925e32b..6db111ce2 100644 --- a/src/modules/governance/models/governance.proposal.model.ts +++ b/src/modules/governance/models/governance.proposal.model.ts @@ -107,3 +107,27 @@ export class GovernanceProposalModel { Object.assign(this, init); } } + +@ObjectType() +export class GovernanceLKMEXProposalModel { + @Field() + contractAddress: string; + @Field() + proposalId: number; + @Field( () => GovernanceDescriptionUnion) + description: typeof GovernanceDescriptionUnion; + @Field( () => ProposalVotes ) + votes: ProposalVotes; + @Field() + status: GovernanceProposalStatus; + @Field() + hasVoted?: boolean; + @Field() + userVoteType?: VoteType; + @Field() + turnoutPercentage: string; + + 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 index b2dc775e9..7d6a6a94b 100644 --- a/src/modules/governance/models/governance.union.ts +++ b/src/modules/governance/models/governance.union.ts @@ -1,5 +1,9 @@ import { createUnionType } from '@nestjs/graphql'; -import { GovernanceEnergyContract, GovernanceTokenSnapshotContract } from './governance.contract.model'; +import { + GovernanceEnergyContract, + GovernanceOldEnergyContract, + GovernanceTokenSnapshotContract, +} from './governance.contract.model'; import { DescriptionV0, DescriptionV1 } from './governance.proposal.model'; export const GovernanceUnion = createUnionType({ @@ -8,6 +12,7 @@ export const GovernanceUnion = createUnionType({ [ GovernanceTokenSnapshotContract, GovernanceEnergyContract, + GovernanceOldEnergyContract, ] as const, resolveType(governance) { switch (governance.constructor.name) { @@ -15,6 +20,8 @@ export const GovernanceUnion = createUnionType({ return GovernanceTokenSnapshotContract; case GovernanceEnergyContract.name: return GovernanceEnergyContract; + case GovernanceOldEnergyContract.name: + return GovernanceOldEnergyContract; } }, }); diff --git a/src/modules/governance/resolvers/governance.proposal.resolver.ts b/src/modules/governance/resolvers/governance.proposal.resolver.ts index f07c54098..1db8764dc 100644 --- a/src/modules/governance/resolvers/governance.proposal.resolver.ts +++ b/src/modules/governance/resolvers/governance.proposal.resolver.ts @@ -1,5 +1,10 @@ import { Parent, ResolveField, Resolver } from '@nestjs/graphql'; -import { GovernanceProposalModel, GovernanceProposalStatus, VoteType } from '../models/governance.proposal.model'; +import { + GovernanceLKMEXProposalModel, + GovernanceProposalModel, + GovernanceProposalStatus, + VoteType, +} from '../models/governance.proposal.model'; import { ProposalVotes } from '../models/governance.proposal.votes.model'; import { UseGuards } from '@nestjs/common'; import { JwtOrNativeAuthGuard } from '../../auth/jwt.or.native.auth.guard'; @@ -8,6 +13,7 @@ import { AuthUser } from '../../auth/auth.user'; import { GovernanceTokenSnapshotMerkleService } from '../services/governance.token.snapshot.merkle.service'; import { GovernanceAbiFactory } from '../services/governance.abi.factory'; import { GovernanceServiceFactory } from '../services/governance.factory'; +import { GovernanceEnergyService } from '../services/governance.service'; @Resolver(() => GovernanceProposalModel) export class GovernanceProposalResolver { @@ -88,3 +94,30 @@ export class GovernanceProposalResolver { .userVotingPower(governanceProposal.contractAddress, governanceProposal.proposalId, user.address); } } + +@Resolver(() => GovernanceLKMEXProposalModel) +export class GovernanceLKMEXProposalResolver { + constructor( + private readonly governanceService: GovernanceEnergyService, + ) { + } + + @UseGuards(JwtOrNativeAuthGuard) + @ResolveField() + async hasVoted( + @AuthUser() user: UserAuthResult, + @Parent() governanceProposal: GovernanceLKMEXProposalModel + ): Promise { + const userVoteType = await this.governanceService.userVote(governanceProposal.contractAddress, governanceProposal.proposalId, user.address); + return userVoteType !== VoteType.NotVoted; + } + + @UseGuards(JwtOrNativeAuthGuard) + @ResolveField() + async userVoteType( + @AuthUser() user: UserAuthResult, + @Parent() governanceProposal: GovernanceLKMEXProposalModel + ): Promise { + return this.governanceService.userVote(governanceProposal.contractAddress, governanceProposal.proposalId, user.address); + } +} diff --git a/src/modules/governance/services/governance.service.ts b/src/modules/governance/services/governance.service.ts index ce53ddce1..a7219963e 100644 --- a/src/modules/governance/services/governance.service.ts +++ b/src/modules/governance/services/governance.service.ts @@ -4,16 +4,21 @@ import { GovernanceContractsFiltersArgs } from '../models/governance.contracts.f import { GovernanceUnion } from '../models/governance.union'; import { TokenGetterService } from '../../tokens/services/token.getter.service'; import { EsdtToken } from '../../tokens/models/esdtToken.model'; -import { GovernanceEnergyContract, GovernanceTokenSnapshotContract } from '../models/governance.contract.model'; +import { + GovernanceEnergyContract, + GovernanceOldEnergyContract, + GovernanceTokenSnapshotContract, +} from '../models/governance.contract.model'; import { GovernanceEnergyAbiService, GovernanceTokenSnapshotAbiService } from './governance.abi.service'; import { VoteType } from '../models/governance.proposal.model'; import { GovernanceComputeService } from './governance.compute.service'; +import { GovernanceQuorumService } from './governance.quorum.service'; +import { GovernanceLKMEXProposal } from '../entities/lkmex.proposal'; import { ErrorLoggerAsync } from '../../../helpers/decorators/error.logger'; import { GetOrSetCache } from '../../../helpers/decorators/caching.decorator'; import { CacheTtlInfo } from '../../../services/caching/cache.ttl.info'; import BigNumber from 'bignumber.js'; import { EnergyService } from '../../energy/services/energy.service'; -import { GovernanceQuorumService } from './governance.quorum.service'; @Injectable() export class GovernanceTokenSnapshotService { @@ -52,6 +57,15 @@ export class GovernanceTokenSnapshotService { }), ); break; + case GovernanceType.OLD_ENERGY: + governance.push(new GovernanceOldEnergyContract({ + address, + proposals: [{ + contractAddress: address, + ...new GovernanceLKMEXProposal().toJSOSN(), + }], + })); + break; } } diff --git a/src/utils/governance.ts b/src/utils/governance.ts index e53aaa76a..844acf4f1 100644 --- a/src/utils/governance.ts +++ b/src/utils/governance.ts @@ -4,6 +4,7 @@ import { registerEnumType } from '@nestjs/graphql'; export enum GovernanceType { ENERGY = 'energy', + OLD_ENERGY = 'oldEnergy', TOKEN_SNAPSHOT = 'tokenSnapshot', } @@ -15,6 +16,8 @@ const toTypeEnum = (type: string): GovernanceType => { return GovernanceType.ENERGY; case GovernanceType.TOKEN_SNAPSHOT.toString(): return GovernanceType.TOKEN_SNAPSHOT; + case GovernanceType.OLD_ENERGY.toString(): + return GovernanceType.OLD_ENERGY; default: return undefined; }